这个问题在某些地方是模糊的,所以这个答案中的一些也必然是模糊的。
那么,我可以将“付款方式”视为一个类吗?
在纯 OOP 中,一切都是类或方法。支付方式类是有意义的,尤其是当有不同的支付方式时。
我认为该类可以具有总计、小计、折扣、tpv 选择、结果、错误消息等属性......但是......其中一些已经是我的 Basket 类的一部分。
将支付方式归结为它们的基本组成部分和行为。问问自己这样的问题:货币数量真的是某人支付方式的一部分,还是他们支付的一部分?(对这个特定问题的回答:它们是付款的一部分,而不是付款方式)当进行付款时,将需要付款信息,但可以将其传递给需要它的任何方法(可能在 Payment 对象中,它表示从买方发送给卖方的货币金额,或者在 Order 对象中,或者 Order 对象可以实现 Payment 接口,尽管最后一个不会单向地模拟现实世界 )。
以及如何使用它?从外部调用它的函数并发送很多参数,例如信用卡要求?还是强制类在首选项文件中获取这些值?
如果付款要求是付款方式的一部分,则它们应该是付款方式的属性。至于如何初始化支付方法对象,可以应用依赖注入技术(其中一个单独的类负责确定在交易中应该涉及哪种支付方法以及其他特定类并设置它们),尽管它不是t 始终是最佳选择。您还可以有一个控制器,通过读取配置数据并创建支付方式对象,将所述数据传递给支付方式,来响应用户的操作(即选择支付方式)。
有几种有效的方法可以使用支付方式对象。任何时候一个动作涉及多个对象并且一个对象不是明确的参与者(即应该执行该动作的那个),您可以使用一个自由函数(即一个非方法函数)来调用适当对象的必要方法。如果函数的行为因多个对象的运行时类型而异,您将使用多方法(如果可能;没有多少语言本身支持多方法,尽管您可以使用具有某些模式的多种语言来模拟它,例如作为双重调度)。其他可能性包括将控制器作为主要参与者。
在实现设计时可以提供帮助的一个概念是在能力编程中明确的访问规则:对象可以访问它们创建的、知道创建(即传递给它们的构造函数)或被引入的其他对象。这些规则通知诸如依赖注入、模型-视图-控制器 (MVC) 等技术。
每种付款方式都有一个不同的类别,或者是一个包含所有付款方式的大类别……
中间某个地方。所有支付方式通用的任何东西(例如操作 URL)都应该放在基类中。如果支付方式需要覆盖常见行为或需要其他方法不需要的字段,则子类化基本支付方式。为了一致性起见,您可以扩展所有支付方式的基类,尽管某些子类可能不会覆盖任何东西。