【问题标题】:How does one differientiate wrapped layers in the command pattern that are logically named the same?如何区分命令模式中逻辑上命名相同的包裹层?
【发布时间】:2011-10-05 22:18:06
【问题描述】:

我有这个界面...

public interface ICheckThatDocumentExistsCommand
{
   bool Execute( string userId, string docId );
}

在实现中,我只想验证两个id,如果有效,返回另一个接口的结果...

public interface ICheckThatDocumentExistsCommand
{
   bool Execute( UserId userId, DocumentId docId );
}

我想在同一个业务域程序集中定义接口,但我很难决定如何区分两个(或更多)层。从逻辑上讲,我认为它们即使名称不同也相似,因此我不能将它们放在同一个命名空间下。我是否通过命名空间分开? “验证”命名空间和“其他”命名空间?还是我将已经罗嗦的名字扩展成有点可笑的东西……

public interface IValidateIdsAndThenCheckThatDocumentExistsCommand

随着我保持功能小且用途单一,我发现这种情况越来越多。

【问题讨论】:

    标签: c# architecture command-pattern


    【解决方案1】:

    好吧,它的实现类正在弄清楚如何处理参数......所以为什么不让实现类确定和验证类型......

    public interface ICheckThatDocumentExistsCommand
    {
      bool Execute<t1,t2>(t1 userID, t2 docId);
    }
    

    【讨论】:

    • 引用一个有趣的解决方案,我会随身携带 +1。然而,现在我想起来,类型完全不同可能仅仅是巧合。在另一种情况下,签名可能相同。这将我进一步推向了命名解决方案。
    【解决方案2】:

    使用命令模式不是一个不常见的问题。我通常可以将命令名称保持在最多四五个字,但有时需要更长的名称。

    我看到两个同名的接口让人头疼:

    1. 任何引用这两个程序集的类都必须使用完全限定的类名。
    2. 假设您的文件名与您的类名匹配,源代码控制令人头疼的问题是,将文件保持在脑海中(我现在要合并哪个文件?)。
    3. Resharper 中的 GoTo 类型始终需要额外的步骤。

    我同意第一个接口所做的额外工作应该反映在名称中。您的建议可行,但您可以将其缩短为类似

    IValidateIdsAndCheckForDocumentCommand
    

    不会太长。 :)

    【讨论】:

    • 感谢您让我清醒,并提醒我额外的工作值得认可。对于这种简单的情况,我想我会采用您建议的名称。非常感谢。
    【解决方案3】:

    我喜欢 Tims 的回答,因为它很聪明,而我喜欢 Thomas 的回答,因为他显然知道这个领域。

    如果是我,我很可能会使用不同的命名空间。

    【讨论】:

    • 我想得越多,我就越喜欢命名空间解决方案,因为它为不同的自定义返回类型、参数类型、支持接口等提供了一个归宿。我肯定会使用它,所以+1。但是,对于一个非常小的问题域,我认为最简单的事情是适度的名称更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多