Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 设计问题:电话是拨电话号码,还是电话号码在电话上自己拨?_Oop - Fatal编程技术网

Oop 设计问题:电话是拨电话号码,还是电话号码在电话上自己拨?

Oop 设计问题:电话是拨电话号码,还是电话号码在电话上自己拨?,oop,Oop,这是从我在DDD雅虎上发布的内容重新发布的!小组 在所有条件相同的情况下,你是写phone.dial(电话号码)还是phoneNumber.dialOn(电话号码)?记住未来可能的需求(除了电话号码之外的账号,除了电话之外的计算器) 这一选择倾向于说明信息专家的习惯用语、单一责任原则和告诉别人不要问别人是如何相互矛盾的 电话号码。拨号(电话)支持信息专家和告诉不要问,而电话。拨号(电话号码)支持单一责任原则 如果你熟悉Ken Pugh在预加工方面的工作,这是最重要的;是否添加行或列?phone.

这是从我在DDD雅虎上发布的内容重新发布的!小组

在所有条件相同的情况下,你是写phone.dial(电话号码)还是phoneNumber.dialOn(电话号码)?记住未来可能的需求(除了电话号码之外的账号,除了电话之外的计算器)

这一选择倾向于说明信息专家的习惯用语、单一责任原则和告诉别人不要问别人是如何相互矛盾的

电话号码。拨号(电话)支持信息专家和告诉不要问,而电话。拨号(电话号码)支持单一责任原则

如果你熟悉Ken Pugh在预加工方面的工作,这是最重要的;是否添加行或列?

phone.dial()
,因为是电话进行拨号


Actor.Verb(inputs)->outputs.

如果你写OO,那么你从基本对象开始,而不是数字,数字会进入电话,所以phone.dial()这样你也可以用phone.answer()phone.disconnect()phone.powerOFF,等等。

另一种看待它的方式是电话拨号码还是号码拨电话?

显然,电话。拨号(号码)

电话有拨号盘。他们不能自己拨号。 电话号码是数字。
用户通过电话拨号拨打电话号码。

这里不是否定的,但这类问题非常学术化。这完全取决于应用程序。无论采用哪种方式,我都能想出很好的理由,而且我见过太多优秀的程序员陷入这种模拟设计细节中。

我不确定这与电子表格难题有什么关系。您是否希望将来使用电话拨打帐户号码?在计算器上使用电话号码?你关于“未来需求准备”的例子不是很好

另外,你用动词“拨号”。当然,我可以想象在电话上“拨打”一个帐号。(虽然这是一个很大的延伸。)但是如果这个电话号码要用在计算器上,你会称这个动作为“拨号”吗?如果函数的名称根据传递的参数类型而改变,则表明存在设计错误

在典型的OO设计中,对象通过传递数据的方式接收发送的消息,而不是相反的方式

phone.dial()+1

电话号码的变体状态或行为是什么?我唯一想到的是“拨号规则”(如果在外线,请拨打国家代码,如果在外线,请拨打“9”,等等)。这种情况似乎非常适合手机


如果您的对象模型不需要变化——一个数字只是一个数字序列,“拨号”只是foreach(phonenumber中的数字){按(数字);}我支持Rob Conery:meh

显然,PhoneUserInterface接口(您可以从PhoneUserFactory.CreatePhoneUser()方法中获得实现)有一个方法拨号(电话,号码),您可以使用该方法拨号


编辑:回答评论。也不手机应该有一个按键()或类似的东西。用户通过该界面输入电话号码的数字/字符。

两者都不是。用户在电话上拨打电话号码。

问题假设答案的上下文,因此造成错误的困境

在本例中,“电子表格难题”是一个错误的二分法:行和列是表示层,不一定是数据层。下面的评论告诉我,我误解了这个类比,但我不认为这样说——说“这应该是一行还是一列,哪一行更有可能改变”会迫使在问题空间上做出不必要的选择——它们都同样有可能改变。在这个具体的例子中,这会导致为解决方案选择错误的[是错]范式。拨打电话是旧的机械设备如何启动与另一个旧的机械设备的连接;对于现代电话来说,这几乎不是一个恰当的类比。假设有一个“用户”来发起呼叫,那么问题就简单地转移了——尽管它朝着正确的方向移动,即远离旋转电话模型;-)

如果你看一下TAPI[很抱歉前面的错误,它是TAPI而不是ATAPI!]协议是如何工作的,那么就有一个调用控制器——我想在某种意义上相当于“用户”——来管理设备之间的连接。一个设备不呼叫另一个设备,呼叫控制器连接设备。所以下面的例子基本上还是正确的。使用CallController对象而不是泛型连接可能更正确,但类比应该足够清楚

在本例中,电话是一个地址为“电话号码”的设备。“拨号”操作员在两个设备之间建立连接。所以答案是:

Phone p1 = new Phone(phoneNumber1);
Phone p2 = new Phone(phoneNumber2);
Connection conn = new Connection(p1,p2);
conn.Open();
//...talk
conn.Close();
这也将支持多方调用,方法是重载连接以包括设备或其他连接的列表,例如

Connection confCall = new Connection(p1,p2,p3,p4,p5,p6);
confCall.Open();

Connection joinCall = new Connection(confCall,p7,p8,conn);
joinCall.Open();

查看TAPI协议以获取更多示例

我根本不会将电话号码作为一个类,因为它没有任何行为,它只是一个数据元素

电话拨号(电话号码)

电话号码是哑的,只是一个数据集。当“拨号”发生时,PhoneNumber对象是否应该知道如何拨号?有许多州需要跟踪,例如:

  • 电话已经接通另一个电话了吗?(如果是/否,怎么办?)
  • 如果拨号方式发生变化,会发生什么情况?(全球漫游、不同运营商等)
  • 还有,范围呢?打电话时,需要将电话号码添加到最近拨出的电话列表中
如果你的PhoneNumber对象需要知道所有这些,那么它不是干的,你的代码也会更少 便携式,更容易损坏

我想说史蒂文A。