2014-09-10 54 views
0

我试图按照“在你的班级中使用getter/setters是邪恶的”的建议。所以,说我有聚合类Invoice具有以下特征:如何避免汇总内部收集中的获得者?

public class Invoice{ 
    ISet<Line> _lines; 
    public void ChangeLineAmount(int LineId, double newAmount){ 
       //Your answer here 
      } 
    } 

我如何才能找到改变的具体线路,如果Line类没有干将?

+0

而downvote是为了? – Apocatastasis 2014-09-10 19:17:13

+0

刚刚阅读你的问题你看看这MSDN指南集合http://msdn.microsoft.com/en-us/library/dn169389(v=vs.110).aspx – MethodMan 2014-09-10 19:19:16

+0

好吧,我刚刚读过它。我不会将我的收藏展示给外部世界,所以除了命名约定之外,我不明白你的观点。 – Apocatastasis 2014-09-10 19:29:56

回答

1

在DDD问题中,“在你的班级中使用getters/setters是邪恶的”的原因是getter和setters通常不会代表你的UL(无处不在的语言)并导致贫血症实体。但是如果你的UL有类似“我需要那条线”的东西,那么你可以创建一个getter,但是按照UL来命名,如:invoice.lineAmount(lineId)

在方法内部,您可以简单地访问属性,就像CharlesNRice已经回答的那样。如果您觉得您需要对阅读/设置行进行特殊处理,则可以创建私有getter以在域逻辑方法中使用它。

UPDATE:

getter和被需要摆在首位制定者,因为在后面的项目,你可能已经想添加一些额外的验证/设置/获取属性转换之前,没有它,你将有找到正在访问属性并改变它的每一段代码。有了getter/setter,你可以在一个地方访问属性,所以你可以在一个地方更改代码 - 维护起来更容易。但是由于在DDD中你只能使用域逻辑方法,所以你不能直接在给定实体外的任何地方访问你的属性,所以你也不必使用getter和setter。你的域名方法如invoice.lineAmount(lineId)实际上就像getters一样工作,但它们与UL一起工作,所以它们都可以。如果你看到你在实体类的少数地方获得了财产,你会考虑创建真正的内部使用的getter/setter。

+0

所以,建议必须是“吸气剂和制定者是邪恶的,除非实际需要”。也许他们可以是内部的,以减少他们对他们所属的总体的使用? – Apocatastasis 2014-09-10 21:23:31

+0

我已经更新了我的答案。 – 2014-09-10 21:36:16

+1

最初的声明似乎来自11岁的JavaWorld文章。我读过这篇文章,看起来像是过度滥用'getters'和'setters'的膝盖反应。在DDD术语中,我个人认为使用'getter'来暴露你设计公开曝光的价值是不会有什么错误的。 – 2014-09-12 10:13:15

-1

如果它没有getter或setter,_line只是一个字段。如果你添加它们,那么它是一个属性。为了得到该线,您可以像使用它的属性一样使用它。

public class Invoice{ 
    ISet<Line> _lines; 
    public void ChangeLineAmount(int LineId, double newAmount) 
    { 
     var line = _lines.FirstOrDefault(l=>l.LineId == LineId); 
     if (line != null) 
     { 
      line.Amount = newAmount; 
     } 
    } 
} 

我认为这是个人观点,如果“在你的班级中使用getters/setters是邪恶的”。我个人并不这样认为。

2
  • 在“香草” DDD,建议以避免直接制定者(或可变集合的干将),并域操作明确来代替。尽可能使用意图揭示,无处不在的语言兼容,不变的强制行为(方法)来改变实体。然而,在这种方法中,实体也是你读取数据的地方,他们必须向读者展示他们的状态,所以我看不到没有获取者的情况。

  • DDD的CQRS(+ ES)风格将有一个读取模型,您可以明显地访问您想要的所有内容,以及只能通过命令更改其状态的聚合。由于所有读取均通过辅助读取模型对象和所有通过命令写入完成,因此您的外部聚合根上不需要获取者或设置者,但根本身必须能够在自己的聚合中更改实体,有时需要setter方法。

无论如何,事情并不像“在你的班级中使用getter/setter是邪恶的”那样简单。

相关问题