Java 这些班级之间应该如何分配职责?

Java 这些班级之间应该如何分配职责?,java,class-design,Java,Class Design,我有三个简单的例子。人们有很多项目,有很多任务 public class Person { private ArrayList<Project> projects; public Person() { projects = new ArrayList<Project>(); } public printTasks() { //TODO } } public class Project { private String name

我有三个简单的例子。人们有很多项目,有很多任务

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;
  }
}
公共类人物{
私人ArrayList项目;
公众人士(){
projects=newarraylist();
}
公共打印任务(){
//待办事项
}
}
公共类项目{
私有字符串名称;
私有数组列表任务;
公共项目(字符串名称){
this.name=名称;
tasks=newarraylist();
}
公共getName(){
返回名称;
}
}
公开课任务{
私有字符串名称;
私有字符串描述;
公共任务(){
tasks=newarraylist();
}
公共getName(){
返回名称;
}
公共描述(){
返回说明;
}
}
我的问题与实现Person.printTasks()的最佳方式有关……我想在标准输出上显示一个人拥有的项目名称列表,在每个项目之后,显示一个项目拥有的任务名称+描述列表

  • 创建Task.printTask(),并将该任务的名称和描述打印出来。创建Project.printTasks(),让它打印出项目名称,然后对每个任务调用printTask。让Person.printTasks对每个项目调用printTasks
  • 创建Task.getTaskString()并让它连接该任务的名称和描述,然后返回它。创建Project.getTasksString(),并创建一个包含项目名称的字符串,然后在每个任务上调用getTaskString,连接每个结果。让Person.printTasks()对每个项目调用getTaskString并打印出每个字符串
  • 创建Project.getTasks()并让它返回任务的ArrayList。让Person.printTasks()为每个项目调用Project.getName和Project.getTasks(),打印项目名称,然后迭代返回的任务数组,对每个任务调用getName()和getDescription(),并将它们打印出来
  • 有没有最好的方法来处理这个问题,还是真的没关系?就我个人而言,我倾向于2)因为1)将一个对象应该如何显示的想法与该对象联系在一起,但感觉这应该在一个地方,即人来决定。这样我就可以轻松地从标准输出更改为文件。3) 允许人员直接访问Task,而Task以前并没有耦合到该类(至少它只是通过Project间接耦合的)

    有比这3个更好的解决方案吗


    注意:这可能是一个与语言无关的问题,但我碰巧是用Java编写的,我认为对于不同的语言可能会有不同的最佳解决方案,所以我希望至少能够解决Java方面的这个问题。

    如果它只是用于显示任务名称,而您不希望
    Person
    依赖于
    Task
    ,然后我建议添加一个方法

     List<String> getTaskNames();
    
    List getTaskNames();
    
    项目
    类。这就是一个项目应该知道的:它的任务的名称


    或者创建一个额外的
    taskmatadata
    类,该类包含所有属性,用户需要了解任务,并返回
    taskmatadata
    对象的集合。我更喜欢它而不是串接字符串。

    访问者模式:没有人知道如何打印和打印什么。您只需将项目/人员/任务置于任何关系中,无论它们是访问者对象。项目/人员/任务迭代他们拥有/知道的对象,并将访问者传递给他们

    访问者做的事情是正确的——它知道如何从它访问的对象中访问信息,以及信息是否应该打印,以及在哪里:控制台/文件/数据库或其他什么地方,它还知道如何格式化:例如,我想到的xml/html/纯文本/csv

    这是你可以自由设计你的项目层次结构,无论你想,改变打印目标和格式等