【问题标题】:Object - Property Best Practices对象 - 属性最佳实践
【发布时间】:2011-12-27 09:40:24
【问题描述】:

我真的很喜欢能够像这样组织我的对象,其中SourceDocument 对象中的自己的对象。

方法#1

Dim doc As New Process.Document()
doc.Source.Type = "URL"
doc.Source.Data = "http://myOtherDomain/MyOtherPage.htm"

View #1 PasteBin Full Code>

但是,这样做是否更好?

方法#2

Dim doc As New Process.Document()
doc.SourceType = "URL"
doc.SourceData = "http://myOtherDomain/MyOtherPage.htm"

View #2 PasteBin Full Code>

我问的原因是因为它与第一种方法有点混淆,因为你得到了这个:

Process.Document.DocumentSourcedoc.Source

我认为在方法 #1 中,Process.Document.DocumentSource 有两次 Document 是多余的,并且希望有一种方法可以隐藏该对象,使其不被程序集的用户在智能感知下拉列表中选择。

但另一方面,如果您有很多属性,最好能够像方法 #1 那样将它们分组到子对象中,这样您就不会在 Intellisense 中列出所有属性下拉列表。

【问题讨论】:

    标签: .net oop properties


    【解决方案1】:

    Law of Demeter 表示方法 #2 是可行的方法,只要提供这两个选项即可。

    第三种方法可能是提供Source 对象,而不是设置doc.Source.XYZ

    // C# -- don't know VB.Net
    var source = new DocumentSource();
    ...
    
    doc.Source = source;
    

    如果需要Source,第四种方法实际上是构造函数注入。

    var source = new DocumentSource();
    ...
    var doc = new Process.Document(source);
    

    【讨论】:

    • “得墨忒耳法则”的链接正是我想要的。我不认为在我的情况下它实际上试图保护的任何事情都没有危险,但我想在可能的情况下冒险使用最佳实践,这似乎是不使用方法 #1 的一个很好的案例。我认为我也应该对Process.Documents.add(doc) 行应用相同的规则,对吗?这让我想到了另一个问题。我应该将所有对象(如DocumentSourceDocumentCollection)放在顶级命名空间级别吗?而是叫他们ProcessDocumentSource等等?
    • RE 其他类:您可能希望它们处于更高的级别。
    【解决方案2】:

    第一种方法很好,根本不应该弄乱 Intellisense。 Process.Document.DocumentSource 是一种类型(因为您使用的是嵌套类),doc.Source 是属性。

    也就是说,通常建议不要使用嵌套类,尤其是当它们是公共的时。我认为这也有一个 FxCop 规则。将Document 类从Process 中移出,将DocumentSource 类从Document 中移出会很好地清理这些东西。

    【讨论】:

      【解决方案3】:

      我会尝试将它们组织成逻辑实体。如果TypeData 是属于逻辑实体Source 的属性,我可能会使用您的方法#1。如果TypeData 与文档更相关,我会将其存储在那里。

      您认为最正确的应该是您的最终选择。在这种情况下。方法#1似乎适合我。特别是如果Source 还具有其他属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2012-09-15
        • 1970-01-01
        相关资源
        最近更新 更多