Java 软件设计原则:将您的收藏与处理对象分开?

Java 软件设计原则:将您的收藏与处理对象分开?,java,oop,software-design,Java,Oop,Software Design,在OOP设计中与一个小组合作一个小组成员和我有分歧,我在网上找不到答案 创建一个类似于非营利组织的软件,该组织有捐助者和他们的信用卡 一种方法是,creditCardList(collection类)应该只存储和返回creditCard对象。然后当它们被返回时,组织类应该为每个对象运行processCard(),作为信用卡对象的方法 另一方面是,CreditCardList应处理所有项目,并包含在集合中所有项目上运行的循环 一般来说,什么是更好的软件设计 我会选择第一个选项 由于您已经将信用卡

在OOP设计中与一个小组合作一个小组成员和我有分歧,我在网上找不到答案

创建一个类似于非营利组织的软件,该组织有捐助者和他们的信用卡

一种方法是,
creditCardList
(collection类)应该只存储和返回
creditCard
对象。然后当它们被返回时,
组织
类应该为每个对象运行
processCard()
,作为
信用卡
对象的方法

另一方面是,
CreditCardList
应处理所有项目,并包含在集合中所有项目上运行的循环


一般来说,什么是更好的软件设计

我会选择第一个选项

由于您已经将
信用卡列表
用作存储,因此该类不应承担任何其他责任。此类的功能仅限于提供卡片(全部/部分,有条件/按条件)


第二个选项提出了将存储器与卡处理机制耦合的问题。存储库现在取决于处理系统以及系统可能需要的输入参数。此外,存储确实知道它不应该知道的所有进程。

我会选择第一个选项

由于您已经将
信用卡列表
用作存储,因此该类不应承担任何其他责任。此类的功能仅限于提供卡片(全部/部分,有条件/按条件)


第二个选项提出了将存储器与卡处理机制耦合的问题。存储库现在取决于处理系统以及系统可能需要的输入参数。此外,存储器确实知道它不应该知道的所有过程。

很抱歉,但对于职责分离原则,我不会选择这两种方法中的任何一种。如果我正确理解该要求,则组织对象是代表接受捐赠的慈善组织的实体。CreditCardList是用于支付处理的所有信用卡的集合。它们都不是保存支付处理逻辑的好地方

相反,我将引入一个新的helper类,其名称类似于
PaymentProcessor
。此类将有一个名为
processPayment(列出信用卡)
的方法。此方法应包含处理信用卡付款的逻辑。在这个设计中,您还可以在这个类中引入其他方法来使用其他方式处理付款,例如从银行帐户或PayPal直接借记

根据OO设计原则,我们应该有一个类或接口用于一个目的,以便更好地维护


我希望这可能有助于解决您与同事之间的建设性分歧。:)

很抱歉,对于职责分离原则,我不会选择这两种方法。如果我正确理解该要求,则组织对象是代表接受捐赠的慈善组织的实体。CreditCardList是用于支付处理的所有信用卡的集合。它们都不是保存支付处理逻辑的好地方

相反,我将引入一个新的helper类,其名称类似于
PaymentProcessor
。此类将有一个名为
processPayment(列出信用卡)
的方法。此方法应包含处理信用卡付款的逻辑。在这个设计中,您还可以在这个类中引入其他方法来使用其他方式处理付款,例如从银行帐户或PayPal直接借记

根据OO设计原则,我们应该有一个类或接口用于一个目的,以便更好地维护


我希望这可能有助于解决您与同事之间的建设性分歧。:)

首先,对于图表中的每个调用,我都感到好奇:为什么组织调用CreditCard.processCard方法并将CreditCard实例作为参数传递

“处理信用卡”首先意味着什么?信用卡实例是否能够处理它? 我要做的第一个设计决策是,CreditCard对象不应该依赖于某些外部服务。处理信用卡听起来像是处理外部事务。 我会保持信用卡逻辑的纯洁。此处仅将逻辑操作放在本地字段和属性上

CreditCardList有一个主要任务。持有一套信用卡。您想要检索和存储信用卡列表的方式可能会改变,因此最好将关注点分开,并将处理逻辑排除在该类之外。 在CreditCardList中运行循环的一个原因可能是,您不想公开信用卡的具体列表。但这可以用一种更优雅的方式来处理。定义接口ICardProcessor并将其作为构造函数参数注入CreditCardList。
然后foreach可以留在类中,并对每个实例调用ICardProcessor.Process(card)。

首先,我发现对于图表中的每个调用,都很奇怪:为什么组织调用方法CreditCard.processCard并将CreditCard实例作为参数传递

“处理信用卡”首先意味着什么?信用卡实例是否能够处理它? 我要做的第一个设计决策是,CreditCard对象不应该依赖于某些外部服务。处理信用卡听起来像是处理外部事务。 我会保持信用卡逻辑的纯洁。此处仅将逻辑操作放在本地字段和属性上

<