Как должны быть распределены обязанности между этими классами? - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть три простых класса для иллюстрации.У людей есть много проектов, у которых много задач.

public class Person {
  private ArrayList<Project> projects;

  public Person() {
    projects = new ArrayList<Project>();
  }

  public printTasks() {
    //TODO
  }
}

public class Project {
  private String name;
  private ArrayList<Task> tasks;

  public Project(String name) {
    this.name = name;
    tasks = new ArrayList<Task>();
  }

  public getName() {
    return name;
  }
}

public class Task {
  private String name;
  private String description;

  public Task() {
    tasks = new ArrayList<Task>();
  }

  public getName() {
    return name;
  }

  public getDescription() {
    return description;
  }
}

Моя проблема связана с тем, что было бы наилучшим способом реализации Person.printTasks (). Я хочу вывести на стандартный вывод список имен проектов:У человека есть и после каждого проекта список имен задач + описания, которые есть у проекта.

  1. Создайте Task.printTask () и распечатайте имя и описание этой задачи.Создайте Project.printTasks () и распечатайте имя проекта, а затем вызовите printTask для каждой задачи.Попросите Person.printTasks вызвать printTasks для каждого проекта.
  2. Создайте Task.getTaskString (), и он объединит имя и описание для этой задачи и вернет его.Создайте Project.getTasksString () и создайте строку, содержащую имя проекта, а затем вызовите getTaskString для каждой задачи, объединяя каждый результат.Пусть Person.printTasks () вызовет getTasksString для каждого проекта и распечатает каждую строку.
  3. Создайте Project.getTasks () и верните ArrayList задач.Попросите Person.printTasks () вызвать Project.getName и Project.getTasks () для каждого проекта, напечатать имя проекта, а затем выполнить итерацию по массиву возвращаемых задач, вызывая getName () и getDescription () для каждого и распечатывая их.

Есть ли лучший способ справиться с этим или это действительно не имеет значения?Лично я склоняюсь к 2), потому что 1) связывает идею о том, как объект должен отображаться с этим объектом, но кажется, что это должно быть решено в одном месте, то есть личности.Таким образом, я могу легко перейти из стандартного вывода в файл, например.3) дает Лицу прямой доступ к Задаче, классу, с которым он ранее не был связан (по крайней мере, он был связан только косвенно через Проект).

Есть ли лучшее решение, чем эти 3?

Примечание: Это может быть не зависящий от языка вопрос, но я пишу на Java, и я думаю, что вполне могут быть разные лучшие решения для разных языков, поэтому я хотел бы получить ответы на вминимум решить эту проблему в отношении Java.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2011

Шаблон посетителя: никто не знает, как печатать и что печатать. Вы просто даете проекту / человеку / задаче, в каком бы отношении они ни были объект посетителя. проект / человек / задача перебирают объекты, которыми они владеют / знают о них, и передают посетителя им.

Посетитель делает правильные вещи - он знает, как получить доступ к информации из объектов, которые он посещает, и если информация должна быть напечатана и где: console / file / database или что-то еще, он также знает, как форматировать: xml / html / plain text / csv приходят на ум в качестве примеров.

Это вы можете создавать иерархию проекта независимо от того, что вы хотите, изменять цель и форматы печати и т. Д.

0 голосов
/ 07 апреля 2011

Если это только для отображения имен задач, и вы не хотите, чтобы Person зависело от Task, тогда я предлагаю добавить метод

 List<String> getTaskNames();

до Project класса. Вот что должен уметь сказать проект: названия его задач.

Или создайте дополнительный класс TaskMetaData, который содержит все свойства, которые человек должен знать о задаче, и возвращает коллекцию TaskMetaData объектов. Я бы предпочел это вместо объединения строк.

...