今天在办公室进行了讨论,无论是否使用此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最佳实践,以及为什么我们需要代码弹簧清理,并整理域内部的原因之一清单。
答案 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方法。考虑到这一点,我宁愿让我的所有属性以相同的方式看待/工作,而不是让一些属性使用短手,而有些属性具有适当的支持字段。