2

我们正在使用 C# 和 EmguCV 进行图像处理项目。我们的团队由3人组成。为了取得更快的进展,我们三个人同时处理不同的子问题或尝试不同的算法。

目前,我们每个人都创建了一个包含我们正在处理的主要代码的函数,并且我们所有人都对驱动程序进行了更改以添加对我们新函数的调用。所有这些都发生在同一个文件上。我们正在使用源代码控制,所以我们还没有进入对方的脚趾。但我不认为随着我们取得更多进展,这将是可持续的。另外,我觉得代码越来越混乱。

我在想我们最好实现策略模式并将我们的算法或子问题处理封装到它们自己的类中,并从驱动程序中调用每个类的执行方法。

但是我意识到这种方法可能存在一些问题:

  1. 不同的算法采用不同的输入(源图像、一些不同的参数集等)
  2. 不同的算法返回不同的输出(新图像、特征集、矩阵等)

我相信我可以通过做这样的事情来克服第一个问题

Class Strategy1 : IStrategy
{
    int _code;

    // Different *input* paramteres for the strategy may be passed in the 
    // constructor depending on the type of strategy
    public Strategy1(int c)
    {
        _code = c;
    }

    // This is the method defined in the IStrategy interface
    public void execute()
    {
        // Some code that uses _code and does some processing goes here
    }
}

我可以更改不同策略的构造函数,以便它们可以接受不同类型的参数。

当我考虑如何处理返回多个类型/值的问题时,我首先想到的就是将execute的返回类型从void更改为类似于哈希表的东西,其中可以存储和返回不同的返回参数具有类的其他成员,例如“ int _returnCode”,可以通过其他方法或通过该类的只读属性检索。

我不确定这在设计原则方面会有多好,并且很高兴听到您对此的看法。谢谢

4

3 回答 3

4

如果算法唯一的共同点是它们的执行,那么您应该考虑命令模式而不是策略模式。(至少,这最适合您描述的解决方案。)

这可以!它不会为您购买策略模式的细粒度可替代性,但听起来您无法做到这一点。命令模式将使您将特定于算法的代码与处理流控制(驱动程序,与其声音)分开。

例如,它可以让你编写如下代码:

// ... logic to obtain an image and handle application flow ...

// I'm using 'image' here as a stand-in for a single object all your commands
// could derive their inputs from, or a container of all the inputs. If no such
// object exists, just do what you have to construct the commands.
ICommand[] commands = ImageCommandFactory.CreateCommands(image);

foreach(ICommand command in commands) {
    command.Execute();
}

// ... Handle commands ...

正如您所提到的,命令对象将使用公共成员来公开其执行结果 - 最简单的形式将使用public object Results { get; }. (当然,您越能将返回值缩小为标准ICommandResults类型,您的情况就会越好。)

如何处理结果取决于您。您可以(再次)使用工厂来创建适合您传递的命令的处理程序:

// Picks the correct type of processor, depending on the command
IResultHandler handler = ResultHandlerFactory.CreateHandler(command, form);

// renders the results to the form provided to the factory method
handler.RenderResults();

或者使用其他更适合您的设计的技术。

于 2009-11-14T18:17:59.213 回答
0

这里有几件事:

  • 将所有内容都放在一个文件中是一种反模式“大泥球”
  • 您可以使用部分类将其拆分为多个文件,这解决了许多人在同一个文件上工作的问题,但只是稍微好一点。
  • 而不是策略模式,为什么不直接创建助手类(助手模式),每个助手都可以测试。
于 2009-11-14T16:59:03.567 回答
0

如果您可以自由使用 C# 4,则可以依赖协变返回类型功能。这样,您可以将执行接口定义为:

public object execute()

然后在派生类中使用特定于该具体类的返回类型覆盖它。

于 2009-11-14T17:39:34.843 回答