传递方法与通用对象与事件特定对象

问题描述 投票:0回答:1

在传递方法、通用对象和专用对象时,我的代码经常遇到十字路口。让我解释一下。

我正在使用中介者模式。我有 DAO,它具有基于其目标数据库的特定实体的通用方法。如果某个方法针对该特定实体,我会将其放入该类中。有时目标实体是一个表,有时它是表中的一列,具体取决于该 DAO 类是否开始变得复杂并需要分解。然后我有服务类型类,它接收 DAO 作为依赖项。这是一个附加层,但它阻止我将 DAO 类直接传递到中介器中。这样我就可以对主冥想器外部的每个类进行单元测试,并调用中介器内部每个服务类的方法。这还允许我潜在地选择一起调解的服务对象,并在我的依赖性开始增长时将该调解器传递到主调解器。

然而,在决定下一步时我常常感到挣扎。我做吗

  1. 将整个服务对象传递给中介者,使其能够访问它从未打算使用的东西。我读到这违反了最小特权原则。像这样

    const turn = new ServerTurnMediator(
     new DiceService(DiceDAO),
     new PlayerMoneyService(PlayerMoneyDAO)
    )
    
  2. 仅将特定服务类中的方法传递到中介器,并将我传入的方法绑定到服务对象的实例,如下所示:

     const playerMoneyService = new PlayerMoneyService(PlayerMoneyDAO);
     const methodFromPlayerMoneyService = playerMoneyService.addMoneyToPlayer.bind(playerMoneyService);
    
     const turn = new ServerTurnMediator(
      new DiceService(DiceDAO),
      methodFromPlayerMoneyService
     )
    

这里我将 methodFromPlayerMoneyService 传递到需要它的中介类中。如果中介器需要来自该服务对象的 3 个其他方法,我应该为每个方法重复此绑定过程吗?什么时候这太多了?

  1. 开始创建更多特定于事件的服务对象,这些对象接受 DAO,但围绕它们试图实现的目标重命名服务对象,然后将服务对象完整传递到中介器中。这些方法是内聚的,并且全部被引用,并且可能在中介者类中的特定情况下使用,并且该类中不存在针对其传递给的给定中介者的废弃方法。如果我这样做,我可以使用继承或组合来扩展每个特定于事件的类,以便防止在不同的特定于事件的类中重复方法。

    const turn = new ServerTurnMediator(
     new DiceService(DiceDAO),
     new PlayerMoneyIncreaserService(PlayerMoneyDAO)
    )
    

这也感觉我更加遵守 SRP,但突然间我将需要更多特定于发生的每个事件的类,而不是单个服务对象。

  1. 我可以执行与 3 相同的操作,但也在我的 DAO 类中创建相同的继承层次结构或组合,以便正确的服务对象接收有权访问服务对象试图实现的功能的 DAO。

我在适当的情况下使用接口,并且我的服务类经常接收具有相同命名方法或抽象方法的不同 DAO 实现。

这里是否有正确或错误的答案,或者有任何需要重构的特定时刻?如果是这样那为什么?

javascript node.js oop design-patterns mediator
1个回答
0
投票

我会保留第三个选项,因为这是鼓励在代码中使用SOLID原则的一种方式。

这也感觉我更加坚持SRP,但突然我会 需要更多针对每个发生的事件的类,而不是 服务对象单一。

是的,你是对的。然而,当你的代码行数较少时,则是:

  • 让未来的读者更容易阅读(这个人也可以是两周后的你)
  • 更容易对其进行更改
  • 更容易编写测试
  • 更容易为方法和类命名

如果我这样做,我可以使用继承或组合来扩展 每个事件特定的类,这样我就可以防止重复方法 不同的事件特定课程。

是的,你是对的。您可以在这里阅读更多内容何时使用组合或继承

© www.soinside.com 2019 - 2024. All rights reserved.