2016-03-06 17 views
2

私人領域或私人財產的setter的討論在辦公室今天來到了它是否是一個面向對象的約定,使用此:OOP - 在問候DDD

private string myField; 

public string MyProperty { 
    get { return myField; } 
} 

public MyClass(string field) { 
    myField = field; 
} 

在此:

public string MyProperty { 
    get; 
    private set; 
} 

public MyClass(string field) { 
    MyProperty = field; 
} 

在域驅動開發期間。

我們看過的很多DDD示例都使用上面的第一種方法進行了編碼,但從來沒有第二種。我知道我們辦公室(包括我自己)中的幾個人出於各種原因對第二種方法有個人偏好,而其他人則喜歡第一種方式,或者不在乎哪種方式被使用的方式。

目前,我們的代碼在兩種不同的方法中混合使用,其中一些類使用方法#1,另一些使用#2,另一些使用兩者的組合(一個屬性可能具有公共獲取/私人設置,而另一個僅具有公衆獲得,返回一個私人領域)。

基本上,我們想知道哪種方法最適合DDD OOP最佳實踐,以及爲什麼我們應該爲代碼清理乾淨,整理域內部是列表中的項目之一。

+1

這個問題與DDD無關。我正在移除標籤。 – plalx

回答

3

我不是DDD的專家,但我可以對OOP發表評論。使用私人領域或私人領域的選擇只是個人/團隊編碼偏好。就像在空間/標籤之間選擇對齊。它與OOP最佳實踐無關。

public string MyProperty { get;private set;}仍然會在內部創建一個私有字段並在IL中生成一個GetProperty和SetProperty方法。因此,基本上兩個IL都將差不多相同,並且對OOP最佳實踐沒有任何價值。就我個人而言,我更喜歡選項2,因爲有時候人們會在課堂上交替使用這個屬性和領域,並可能導致練習不一致。除非明確需要專用字段,否則Auto屬性是可行的。

1

如果你在談論OOP,那麼它們都是相同的,但只有兩種不同的方式才能得到相同的結果,這是你的財產只能從你的班級編輯。所以你怎麼做並不重要。

我認爲這取決於你是如何堅持你的實體,因此我們使用性質,使他們制定者的保護,使ORM可以使用代理類,而在我們的代碼,我們不能設置這些屬性公開讀取和寫入數據,而是在實體上使用一些方法,然後設置屬性。

的結論?它們都是相同的,使用你的ORM支持或處理代理。

1

我會說在使用非集合類型時兩者在技術上沒有區別。

但考慮以下集合屬性:

public class Order 
{ 
    private readonly List<OrderLine> _orderLines; 

    public IEnumerable<OrderLine> OrderLines 
    { 
     get { return _orderLines.AsReadonly(); } 
    } 

    public void RemoveOrderLine(Guid orderLineId) 
    { 
     //Remove logic 
    }  
} 

類,我可以使用List對象的全部功能裏面,但只有一個多IEnumerable接口暴露一個只讀版本。這意味着我可以通過公共方法妥善保護任何涉及收集的不變量。我不認爲用新的短手getters可以輕易實現這一點。考慮到這一點,我寧願讓我所有的屬性看起來/工作方式相同,而不是讓一些屬性使用短手而有些屬性具有適當的後臺字段。