在传递方法、泛型对象和专门化对象时,我经常在代码中遇到一个十字路口.听我解释.
我使用的是调解人模式.我有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 )
在这里,我将Method From PlayerMoneyService传递给需要它的中介类.如果中介需要来自该服务对象的其他3个方法,我应该 for each 方法重复这个绑定过程吗?什么时候太多了?
-
开始创建更多特定于事件的服务对象,这些服务对象接受DAO,但根据它们试图实现的内容重命名服务对象,然后将服务对象完整地传递到中介器中.这些方法是内聚的,并且都被引用,并可能在Mediator类中的特定情况下使用,并且类中没有针对其传入的给定中介的废弃方法.如果我这样做了,我可以使用继承或组合来扩展每个特定于事件的类,这样就可以防止在不同的特定于事件的类中重复方法.
const turn = new ServerTurnMediator( new DiceService(DiceDAO), new PlayerMoneyIncreaserService(PlayerMoneyDAO) )
这也让我感觉我更坚持SRP,但突然之间,我需要更多的类来特定于每个发生的事件,而不是单个服务对象.
- 我可以做与3相同的事情,但也可以在我的DAO类中创建相同的继承层次 struct 或组合,以便正确的服务对象接收可以访问服务对象试图实现的功能的DAO.
我在适当的地方使用接口,并且我的服务类经常使用相同的命名方法或抽象方法接收不同的DAO实现.
这里有没有正确或错误的答案,或者有什么特定的时刻强烈要求重构?如果是这样,那为什么呢?