jan*_*ith 13 language-agnostic oop
我正在尝试以面向对象的方式编写程序.编码两个对象之间的交互时,我有一些困惑.
情景:人(约翰)给人(贝蒂)5美元.
可能的解决方案(伪代码):
A)John.pays(Betty,5);
B)Betty.receives(John,5);
C)Bank.transfer(John,Betty,5);
D)
开始交易:
John.decrease(5);
Betty.increase(5);
结束交易:
E)Service.transferMoney(John,Betty,5); // Service是一个通用服务对象
请告诉我哪一个是以OOP方式编码的更合适的方式,以及它背后的原因.我正在寻找一些指导,如"告诉,不要问"规则.
谢谢.
Bet*_*zel 10
我注意到的一件事是,那些不熟悉OOP的人会试图将物理世界映射到他们正在编写的代码中.你真的在乎约翰和贝蒂是人还是你真的想要描绘一个银行账户?我认为您在示例中选择的对象实际上使得更难找出问题的解决方案.
其中重要的部分是1)在哪里提出如何转移资金的逻辑.2)在哪里存储每个人有多少钱的数据.
您需要决定是否要在银行的个人或客户(可能是个人,公司或其他人)的背景下谈论问题.我猜你是在谈论一个客户,因为假设它是一个人会限制和误导.此外,银行是一个非常通用的术语,它是内部有人的大砖建筑物,还是具有不同页面的不同页面的在线网站.银行帐户对象可以有一个方法(可能是静态的,具体取决于您决定存储数据的方式以及您将使用对象的所有内容),该方法知道如何从一个帐户转移到另一个帐户.如何转让的逻辑不属于贝蒂或约翰或银行,它属于银行账户,如果有费用,可以根据账户类型设置特殊逻辑 涉及的等等.如果你把这个逻辑提供给银行,你最终会得到一个巨大的银行类,其中包括从贪婪的客户到处理特定账户类型的资金等各种方法.我对每种帐户类型都有不同的处理转移规则.想想您可能希望将转账或存款显示为待处理的时间.
如果您只是解决转移资金的问题,则无需创建一堆对象.根据已知要求和假定的未来要求,以下将是一个不错的选择.CheckingAccount.Transfer(johnsAccountNo,bettysAccountNo,金额)
小智 0
我的投票:C。C 做D 所做的事情(例如不赔钱等)。
在这个小例子中,“银行”是一个完全有效的实体,它知道约翰和贝蒂有多少钱。约翰和贝蒂都不能向银行撒谎。
不要害怕根据情况的需要反转(或不反转)“OO”程序中的逻辑。
| 归档时间: |
|
| 查看次数: |
1979 次 |
| 最近记录: |