代码之家  ›  专栏  ›  技术社区  ›  moffdub

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

oop
  •  8
  • moffdub  · 技术社区  · 17 年前

    这是从我在ddd雅虎上发布的内容中重新发布的!组。

    一切都一样,你写电话。拨(电话号码)还是电话号码。拨(电话)?记住未来可能的要求(除了电话号码之外的帐号,除了电话之外的计算器)。

    这种选择往往说明信息专家的成语、单一责任原则和“不问不说”之间的矛盾。

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

    如果您熟悉Ken Pugh的预制工作,这是 Spreadsheet Conundrum ;是否添加行或列?

    13 回复  |  直到 17 年前
        1
  •  1
  •   dbs    17 年前

    选择是给列对象还是给行对象使用拨号方法不会改变程序的缩放方式。

    拨号方法本身就是一系列行和列方法。你必须问那些方法依赖于什么。

    如果行方法的顺序不依赖于确切知道涉及哪个列对象(但确实取决于涉及哪个特定的行对象),以及 反之亦然 对于列方法的序列,问题的规模为m+n(m=num.rows,n=num.cols)。当您创建新行时,如果列方法被分配为“拨号”方法,它实际上不会为您保存任何工作。您仍然需要指定一个唯一的行方法序列,以便在“dial”某处使用!

    但是,如果“dial”中的列方法序列甚至不依赖于 涉及对象(它们使用一个“通用”的列方法序列),然后问题只缩放为m。实际上,如果您已将“拨号”方法分配给列对象,则程序仍缩放为m并不重要;基本上,在添加一个列对象时,不需要做任何工作来创建新的拨号方法,而且您显然有选择权将所有这些拨号方法本身抽象为一个通用拨号方法。

        2
  •  18
  •   Jason Cohen    17 年前

    phone.dial() 因为是电话拨号。

    actor.verb(输入)->输出。

        3
  •  9
  •   user1151    17 年前

    meh-用户。拨号(号码)。在给定的上下文中,电话是没有意义的。索尔(大声说出来)是一个很好的思考方法(除了习惯用法和原则):

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

        4
  •  3
  •   Steven A. Lowe    17 年前

    这个问题假定了答案的上下文,因此造成了一个错误的困境。

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

    如果你看看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协议了解更多示例

        5
  •  1
  •   UnkwnTech    17 年前

    如果编写OO,则从基本对象开始,该对象不是号码,该号码将进入电话,因此phone.dial()也可以通过这种方式拨打phone.answer()phone.disconnect()phone.poweroff等。

    另一种看它的方法是,电话是拨号码还是拨号码?

        6
  •  1
  •   David Thibault    17 年前

    很明显,打电话。拨(号码)

        7
  •  1
  •   Jeff Hubbard    17 年前

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

        8
  •  1
  •   Jason Dagit    17 年前

    显然,可以从phoneUserFactory.createPhoneUser()方法中获得的phoneUserInterface接口具有可用于拨打电话的方法拨号(phone,number)。

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

        9
  •  1
  •   Dan Harper    17 年前

    A:电话。拨(电话号码)

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

    • 电话已经在打另一个电话了吗?(如果是/否,该怎么办?)
    • 如果拨号方式改变了会发生什么?(全球漫游、不同运营商等)
    • 还有,范围呢?打电话时,需要将电话号码添加到最近拨出的电话列表中。

    如果你的phonenumber对象需要知道所有这些,它不会变干,你的代码也会变少。 携带方便,更容易断裂。

    我想说史蒂文·A·洛把它放下了。这应该由一个控制器类型的对象来处理不同的状态,等等。保持你的PhoneNumber对象哑,并给需要担心保持手机嗡嗡作响的中间人以聪明。

        10
  •  0
  •   Lucas Oman    17 年前

    这里不是否定的,但是这些问题很学术。这完全取决于应用程序。我能想到任何一种方式都能做到的很好的理由,而且我见过太多优秀的程序员陷入这种无表情的设计细节中。

        11
  •  0
  •   consumerwhore    17 年前

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

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

    在一个典型的OO设计中,对象会收到带有数据的发送消息,而不是相反。

        12
  •  0
  •   Larry OBrien    17 年前

    phone.dial()+1。

    电话号码的变化状态或行为是什么?唯一能想到的就是“拨号规则”(如果在外面,请拨国家代码,如果在外面,请拨“9”拨外线,等等)。这种背景似乎很适合电话。

    如果你的对象模型不需要变化——一个数字只是一个数字序列,“拨号”只是在每个(电话号码中的数字)前按(数字);我和Rob Conery在一起:Meh。

        13
  •  0
  •   Sijin    17 年前

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