Как я должен называть объекты, которые координируют различные комбинации поведения? - PullRequest
3 голосов
/ 19 февраля 2012

Фон

У меня часто бывают занятия с отдельными обязанностями:

  • ReportReader
  • ReportWriter
  • ReportSender
  • ReportGenerator

но мне нужно выполнить задачу более высокого уровня путем координации между ними. Как называть эти объекты?

Пример 1 - Генерация и отправка отчета

  • Мне нужен координирующий объект, чтобы использовать классы ReportGenerator и ReportSender, чтобы создать отчет и затем отправить его.
  • Я не могу назвать это отправителем или генератором.
  • Вызов класса ReportGeneratorAndSender - это запах, поскольку он отвечает за два различных поведения ...
  • ... но на самом деле они не ответственны за эти два поведения - просто координируют объекты, которые выполняют эти две вещи.

Пример 2 - Генерация и отправка отчета

  • Другой класс должен сгенерировать отчет, а затем записать его на диск, используя ReportWriter и ReportGenerator в одном приложении - и у меня такая же проблема.

My Crappy Solution

  • Я получаю что-то вроде ReportController или ReportCoordinator.
  • Это слишком общее и не описывает поведение.

Мой вопрос

Как называть объекты, которые координируют разные комбинации поведения?

Есть ли здесь шаблон дизайна, который может мне помочь?

Ответы [ 4 ]

3 голосов
/ 20 февраля 2012

Не зацикливайтесь на именах классов, это не единственный способ сделать чистый дизайн. Используйте имена методов, перегрузки методов, типы аргументов метода, имена аргументов метода, перегрузки конструктора, типы аргументов конструктора и так далее. Много инструментов на языке, чтобы помочь пользователю ваших классов.

Например, поскольку вы говорите о некоторых простых функциях, которые бы просто объединяли существующие классы, вы можете сделать их статическими методами на вспомогательном классе (вы можете даже сделать их методами расширения для класса 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 голос
/ 20 февраля 2012

ReportSendCoordinator и ReportSaveCoordinator (и предположим, что создание отчета является частью его отправки / сохранения. Например, если бы я написал TODO для себя, я бы написал «Отправить отчет» Сьюзен, учитывая, что большая часть работына самом деле пишет это подразумевается).Или, если для этих отчетов есть конкретные цели / применения, назовите их после них.Например, TPSReportService будет использовать ReportGenerator и ReportDumper.

1 голос
/ 20 февраля 2012

Это проблема именования классов.У вас есть много маленьких классов с одиночной ответственностью и вы хотите абстрагировать класс, который делает что-то более полезное, то, что вы можете использовать из коробки.Я бы назвал это ReportUtil классом.Он может иметь только статические публичные методы.

1 голос
/ 20 февраля 2012

ReportService будет наиболее часто используемым именем в дикой природе.Второе место занял бы ReportAgent . ReportWorker и ReportController тоже не редкость.

Это не шаблон , а соглашение об именах в вашеморганизация.

Таким образом, некоторые суффиксы обычно также имеют значение.Например:

  • * Рабочий - многопоточная среда
  • * Контроллер - среда MVC
  • *Агент - слушатель очереди
  • * Служба - общая совокупность поведения
...