OOP - 关于DDD的私人领域或私人财产制定者

时间:2016-03-06 20:50:55

标签: c# oop

今天在办公室进行了讨论,无论是否使用此OOP惯例:

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,其他使用两者的组合(一个属性可能具有公共get / private集,而另一个只有公共得到它返回一个私有字段)。

基本上,我们想知道什么方法最适合DDD OOP最佳实践,以及为什么我们需要代码弹簧清理,并整理域内部的原因之一清单。

3 个答案:

答案 0 :(得分:3)

我不是DDD的专家,但我可以对OOP发表评论。使用私有字段或私有集的选择仅是个人/团队编码偏好。它就像在空格/标签之间进行选择一样。它与OOP最佳实践无关。

public string MyProperty { get;private set;}仍然会在内部创建一个私有字段,并在IL中生成一个GetProperty和SetProperty方法。因此,基本上IL都会或多或少地相同,并且对OOP最佳实践没有任何价值。我个人更喜欢选项2,因为有时候人们会在一个班级中互换使用这个属性和字段,并可能导致不一致的练习。除非您明确需要私有字段,否则可以使用自动属性。

答案 1 :(得分:1)

如果你在谈论OOP,那么它们都是相同的,但只有两种不同的方式来获得相同的结果,你的财产只能从你的班级编辑。所以你的工作方式并不重要。

我认为这取决于你如何持久化你的实体,因此我们使用属性并使其setter受到保护,以便ORM可以使用代理类来读取和写入数据,而在我们的代码中我们不能公开设置这些属性,而是使用然后在实体上设置属性的一些方法。

结论呢?它们都是相同的,使用你的ORM支持或处理代理。

答案 2 :(得分: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接口上公开readonly版本。这意味着我可以通过公共方法正确保护涉及集合的任何不变量。我不认为这可以通过新的短手吸气剂和放大器轻松实现。 setter方法。考虑到这一点,我宁愿让我的所有属性以相同的方式看待/工作,而不是让一些属性使用短手,而有些属性具有适当的支持字段。