处理灵活的命令请求

3

我有一个相当复杂的对象,希望为其添加执行多个命令的功能。每个命令可能需要不同的数字参数;它们的数量(参数)必须是可变的,以便为非常不同的处理请求腾出空间。 我勾画的解决方案如下:

public enum ProcessingMethod {NONE, THIS, THAT, ETC};    
public interface IProcessing
{
    void Process(ProcessingMethod ProcType, Double[] Parameters);
}  

这种方式实现接口的对象:

  1. 通过第一个参数能够识别所请求的处理类型;
  2. 通过数组长度知道传递了多少个参数;
  3. 只传递数字参数,可以从double转换到int、long和float。
  4. 封装了处理参数所需的知识,考虑到位置。

这种设计似乎很简单,能够完成工作,但看起来,我强烈感觉这种设计是不灵活的过程式推理的症状。我试图更好地思考Command设计模式,但它对我来说似乎有些过度。此外,它并不完全符合我的需求。

我的问题是:有没有更面向对象的简单解决方案来满足这些要求?


1
为什么不将参数打包在类层次结构中?IProcessing.Process()将接受基类ProcessingParameters并转换为正确的派生类型。这将极大地减少因位置而传递错误参数的机会(而且您不会被限制于数字值)。更好的解决方案存在,但我们需要更多上下文。然后,请删除那个“有异味”的enum。您可能需要一个策略或者简单地使用多个实现,这取决于您尝试做什么。 - Adriano Repetti
1
首先请看这里 - Baximilian
1
顺便说一句,在我看来,关键不在于它是否灵活(只要完成工作,你可能不需要更改它)。关键是它容易出错。错误的参数顺序不会被检测到,使用该接口的人必须查看文档才能知道#1是A,#2是B。这比具有许多参数的方法还糟糕(至少您可以快速查看参数名称)。 - Adriano Repetti
1个回答

0

我认为你的方法存在两个问题:

  1. 没有保证实现对象将拥有每个ProcessingMethod的实现
  2. 没有办法将参数数量与给定的ProcessingMethod匹配

出于这两个原因,我会将各种“Process”方法拆分成它们自己的函数调用,以确保参数计数的安全性(第一个问题远不如第二个问题重要):

public interface IProcessing
{
    void ProcessNone();
    void ProcessThis(double x);
    void ProcessThat(double x, int y);
    ...
}

接口定义了一个契约,说明你的对象可以做什么,并提供编译时安全性以确保实现者至少具有这些签名的函数。这是一种更安全的方法。

然而,如果你真的想避免这种接口,你的实现似乎是合理的。


我很感激你的观点;然而,我确信服务器对象将来会处理许多可能的命令;我无法预测什么、何时、多少参数等等。我的目标是:在缺乏对未来实现的了解的情况下,尽可能地安排所有的灵活性;尽快编写到目前为止指定的第一个命令。 - Daniel
@Daniel,在这种情况下,您可以向接口添加更多功能,这将迫使实现处理这些新功能等。您还可以编写一个返回对象并接受对象的函数(在许多方面具有绝对的灵活性),但这也是一个不好的主意(因为理由显而易见)。类型安全是一种语言特性,您应该利用它。换句话说,您应该在强大的接口中拥有所有所需的灵活性。请注意,新命令需要更改您的枚举,这仍然会更改您的旧接口。最好以正确的方式完成! - BradleyDotNET
我的疑问与分解度量问题有关:在《编程.NET组件》中,我发现警告不要使用过于细粒度的接口。到最后,我可能会有一个具有数百个处理方法的接口。 - Daniel
@Daniel 听起来像是一个不同的设计问题,如果你有数百种在服务器上执行某些操作的方式。无论如何,你只是要求别人用单个函数调用+枚举方法去做,这样做很容易出现许多无效参数。 - BradleyDotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接