我该怎么称呼协调不同行为组合的对象?

时间:2012-02-19 14:24:08

标签: design-patterns architecture

背景

我经常有单一职责的课程:

  • ReportReader
  • ReportWriter
  • ReportSender
  • ReportGenerator

但我需要通过协调它们来执行更高级别的任务。这些对象应该被叫什么?

示例1 - 生成然后发送报告

  • 我需要一个协调对象来使用ReportGenerator和ReportSender类生成报告然后发送它。
  • 我不能称之为发件人或发电机。
  • 调用一个类ReportGeneratorAndSender是一种气味,因为它负责两种不同的行为......
  • ...但它并不真正对这两种行为负责 - 只是协调那些做这两件事的对象。

示例2 - 生成然后发送报告

  • 另一个类需要生成一个报告,然后在同一个应用程序中使用ReportWriter和ReportGenerator将其写入磁盘 - 我遇到了同样的问题。

我的蹩脚解决方案

  • 我最终使用了ReportController或ReportCoordinator。
  • 这太通用了,不描述行为。

我的问题

我应该怎样称呼协调不同行为组合的对象?

是否有可以帮助我的设计模式?

4 个答案:

答案 0 :(得分:3)

不要被课程名称所困扰,这不是制作简洁设计的唯一方法。使用方法名称,方法重载,方法参数类型,方法参数名称,构造函数重载,构造函数参数类型等。该语言中的许多工具可以帮助您的课程用户。

例如,由于您正在讨论一些只组合现有类的简单函数,您可以在辅助类上创建静态方法(如果您愿意,甚至可以为Report类创建它们的扩展方法):

public static class ReportHelper
{
    public static void SaveToFile(Report report, string path) {};
    public static void Send(Report report, string address) {};
}

如果您想更加抽象并支持更复杂的行为,那么封装行为的对象的正确名称将是工作流程

public interface IReportAction 
{
    void Execute(Report report);
}

public class ReportWorkflow : IReportAction
{ 
    //Composite pattern to keep a list of actions and execute them one by one
}

public class SendReportAction : IReportAction {}
public class WriteReportAction : IReportAction {}

拥有您的工作流类,您可以创建它的几个实例,并为它们提供一些面向业务的名称。例如,您发送报告的工作流程的作用是什么?也许它是一个EndOfDayReportWorkflow,所以这样称呼它,里面可以格式化报告,对它做一些其他事情然后发送。您可以避免使用错误的名称,并且您将使用高级业务术语进行编码。

答案 1 :(得分:1)

ReportService 将是最常用的名称。第二位是 ReportAgent ReportWorker ReportController 也不常见。

不是模式和组织中的命名约定一样。

如上所述,一些后缀通常也带有意义。例如:

  • * 工作人员 - 多线程环境
  • * 控制器 - MVC环境
  • * 代理 - 队列侦听器
  • * 服务 - 一般行为汇总

答案 2 :(得分:1)

ReportSendCoordinator和ReportSaveCoordinator(并假设生成报告是发送/保存报告的一部分。例如,如果我要给自己写一个TODO,我会写一份发送报告给Susan,事实上大多数工作实际上写的是暗示)。或者,如果这些报告有特定的目标/用途,请在这些报告之后命名。例如,TPSReportService将使用ReportGenerator和ReportDumper。

答案 3 :(得分:1)

这是一个纯类命名问题。你有许多小的,单一的责任类,并希望抽象出一个更有用的东西,你可以开箱即用的东西。我将它命名为ReportUtil类。它甚至可以只有静态的公共方法。