设计问题:电话拨打电话号码,还是电话号码拨打电话?

mof*_*dub 8 oop

这是我在DDD Yahoo!上发布的内容重新发布的.组.

一切都相同,你写phone.dial(phoneNumber)或phoneNumber.dialOn(电话)?请记住可能的未来要求(除电话号码外的帐号,除电话外的计算器).

这个选择倾向于说明信息专家,单一责任原则和Tell Do Not Ask的成语是如何相互矛盾的.

phoneNumber.dialOn(电话)支持信息专家和告诉不要问,而phone.dial(phoneNumber)支持单一责任原则.

如果您熟悉Ken Pugh在Prefactoring中的工作,那就是电子表格难题 ; 你添加行或列?

Jas*_*hen 18

phone.dial(),因为它是拨打电话的电话.

Actor.Verb(输入) - >输出.


小智 9

Meh - User.Dial(数字).在给定的环境中,手机毫无意义.SOL(大声说出来)是一个很好的方式来思考这个(成语和原则除外):

手机有表盘.他们无法拨打自己的电话.电话号码是数字.用户在电话拨号上拨打电话号码.

  • 我不认为我们在说旋转手机.任何带有内置电话簿的手机都可以拨打自己的电话.User.Call(联系方式) - > Phone.Dial(number) (6认同)

dbs*_*dbs 1

选择是否为列对象或行对象提供 dial 方法不会改变程序的缩放方式。

dial 方法本身就是一系列行和列方法。你必须问这些方法依赖什么。

如果行方法的顺序不依赖于确切了解涉及哪个列对象(但确实取决于涉及哪个特定行对象),并且对于列方法的顺序反之亦然,则问题的规模为 m + n (m = 行数,n = 列数)。当您创建新行时,如果将列方法分配为“拨号”方法,它实际上不会为您节省任何工作。您仍然必须指定行方法的唯一序列,以便在某个地方的“拨号”中使用!

然而,如果说“dial”内的列方法序列甚至不依赖于涉及哪个对象(它们使用一个“通用”列方法序列),那么问题就按 m 缩放。如果您已将“dial”方法分配给列对象,实际上并不重要,程序仍然按 m 缩放;当再添加 1 个列对象时,基本上不需要做任何工作来创建新的 dial 方法,并且您显然可以选择将所有这些 dial 方法本身抽象为一个通用 dial 方法。