在传递方法、泛型对象和专门化对象时,我经常在代码中遇到一个十字路口.听我解释.

我使用的是调解人模式.我有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
     )
    

在这里,我将Method From PlayerMoneyService传递给需要它的中介类.如果中介需要来自该服务对象的其他3个方法,我应该 for each 方法重复这个绑定过程吗?什么时候太多了?

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

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

这也让我感觉我更坚持SRP,但突然之间,我需要更多的类来特定于每个发生的事件,而不是单个服务对象.

  1. 我可以做与3相同的事情,但也可以在我的DAO类中创建相同的继承层次 struct 或组合,以便正确的服务对象接收可以访问服务对象试图实现的功能的DAO.

我在适当的地方使用接口,并且我的服务类经常使用相同的命名方法或抽象方法接收不同的DAO实现.

这里有没有正确或错误的答案,或者有什么特定的时刻强烈要求重构?如果是这样,那为什么呢?

推荐答案

为什么不 Select 4,我的DAO也是特定于事件的 服务对象接受一个完成数据库功能的DAO 什么时候从服务类调用?而不是特定于事件 服务类使用它可能不需要的方法接受DAO吗?

在了解了这些信息之后,我会继续使用第四个选项,因为这是鼓励在代码中使用SOLID principles的一种方式.它看起来也像Traditional "N-Layer" architecture applications

这也感觉像我坚持SRP更多,但突然我会 我需要更多的类,而不是一个 单一服务对象.

是啊,你说得对.但是,当您的代码行数较少时,它是:

  • 对于future 的读者来说更容易阅读(这个人也可以在两周内成为你)
  • 更容易对其进行更改
  • 更容易编写测试
  • 更容易为方法和类命名

如果我这样做,我可以使用继承或组合来扩展 每个特定于事件的类,以防止在 不同的事件特定类.

是啊,你说得对.你可以在这里阅读更多信息when to use composition or inheritance

Javascript相关问答推荐

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

具有相同参数的JS类

使用TMS Web Core中的HTML模板中的参数调用过程

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

Snowflake JavaScript存储过程返回成功,尽管预期失败

如何将react—flanet map添加到remixjs应用程序

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

禁用.js文件扩展名并从目录导入隐式根index.js时,找不到NodeJS导入模块

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

邮箱密码重置链接不适用于已部署的React应用程序

变量在导入到Vite中的另一个js文件时成为常量.

在不删除代码的情况下禁用Java弹出功能WordPress

如何组合Multer上传?

Reaction useState和useLoaderData的组合使用引发无限循环错误

ComponentWillReceiveProps仍在React 18.2.0中工作

Chrome上的印度时区名S有问题吗?

正则表达式以确定给定文本是否不只包含邮箱字符串

当S点击按钮时,我如何才能改变它的样式?

material UI自动完成全宽