【发布时间】:2008-09-16 01:41:13
【问题描述】:
这是从我在 DDD Yahoo! 上发布的内容重新发布的。组。
一切都一样,你写phone.dial(phoneNumber)还是phoneNumber.dialOn(phone)?请记住未来可能的要求(除了电话号码之外的帐号、除电话之外的计算器)。
这个选择倾向于说明信息专家、单一职责原则和告诉不要问的习语是如何相互矛盾的。
phoneNumber.dialOn(phone) 支持信息专家并告诉不要问,而 phone.dial(phoneNumber) 支持单一责任原则。
如果您熟悉 Ken Pugh 在 Prefactoring 方面的工作,这是Spreadsheet Conundrum;你是添加行还是列?
【问题讨论】:
-
关于新要求——假设您现在拥有寄存器和计算器。现在你需要 register.dial(phoneNumber) 和 calc.dial(phoneNumber)。使用 phoneNumber.dialOn(DialableDevice),没有新方法,只有两个新类(如果您有 Phone、Register 和 Calculator 实现 DialableDevice)。
-
如果您认为如果新要求是关于拨打新类型的号码(例如帐号和 SSN),那么您是正确的,那么我刚才给出的论点就被颠倒了。这两种情况是“正交的”,因此电子表格难题参考。
-
未来可能的需求?雅格尼!
-
我仍然认为你需要一个 CallController 来连接设备 ;-)
-
致所有回答的人,感谢您的意见。这是一个没有正确答案的问题(不是全部),对我来说,吸收每个人的答案背后的推理是很有教育意义的。
标签: oop