在传递方法、通用对象和专用对象时,我的代码经常遇到十字路口。让我解释一下。
我正在使用中介者模式。我有 DAO,它具有基于其目标数据库的特定实体的通用方法。如果某个方法针对该特定实体,我会将其放入该类中。有时目标实体是一个表,有时它是表中的一列,具体取决于该 DAO 类是否开始变得复杂并需要分解。然后我有服务类型类,它接收 DAO 作为依赖项。这是一个附加层,但它阻止我将 DAO 类直接传递到中介器中。这样我就可以对主冥想器外部的每个类进行单元测试,并调用中介器内部每个服务类的方法。这还允许我潜在地选择一起调解的服务对象,并在我的依赖性开始增长时将该调解器传递到主调解器。
然而,在决定下一步时我常常感到挣扎。我做吗
将整个服务对象传递给中介者,使其能够访问它从未打算使用的东西。我读到这违反了最小特权原则。像这样
const turn = new ServerTurnMediator(
new DiceService(DiceDAO),
new PlayerMoneyService(PlayerMoneyDAO)
)
仅将特定服务类中的方法传递到中介器,并将我传入的方法绑定到服务对象的实例,如下所示:
const playerMoneyService = new PlayerMoneyService(PlayerMoneyDAO);
const methodFromPlayerMoneyService = playerMoneyService.addMoneyToPlayer.bind(playerMoneyService);
const turn = new ServerTurnMediator(
new DiceService(DiceDAO),
methodFromPlayerMoneyService
)
这里我将 methodFromPlayerMoneyService 传递到需要它的中介类中。如果中介器需要来自该服务对象的 3 个其他方法,我应该为每个方法重复此绑定过程吗?什么时候这太多了?
开始创建更多特定于事件的服务对象,这些对象接受 DAO,但围绕它们试图实现的目标重命名服务对象,然后将服务对象完整传递到中介器中。这些方法是内聚的,并且全部被引用,并且可能在中介者类中的特定情况下使用,并且该类中不存在针对其传递给的给定中介者的废弃方法。如果我这样做,我可以使用继承或组合来扩展每个特定于事件的类,以便防止在不同的特定于事件的类中重复方法。
const turn = new ServerTurnMediator(
new DiceService(DiceDAO),
new PlayerMoneyIncreaserService(PlayerMoneyDAO)
)
这也感觉我更加遵守 SRP,但突然间我将需要更多特定于发生的每个事件的类,而不是单个服务对象。
我在适当的情况下使用接口,并且我的服务类经常接收具有相同命名方法或抽象方法的不同 DAO 实现。
这里是否有正确或错误的答案,或者有任何需要重构的特定时刻?如果是这样那为什么?