2011-04-07 21 views
2

我有三個簡單的類來說明。人們有很多項目有許多任務。這些課程應該如何分配責任?

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)將應該如何顯示對象的想法與該對象聯繫起來,但是感覺這應該在單個地方即Person中進行決定。這樣我可以輕鬆地從標準輸出更改爲文件。 3)讓Person直接訪問Task,這是一個以前沒有耦合到的類(至少它只是通過Project間接耦合)。

有沒有比這3更好的解決方案?

注:這可能是一個語言無關的問題,但我碰巧用Java編寫和我想象中有很好的可能是不同的語言不同的最佳解決方案,所以我想答案至少地址關於Java的這個問題。

回答

2

訪客模式:沒有人知道如何打印和打印什麼。您只需將項目/人員/任務放在與訪客對象相關的任何關係中。項目/人員/任務迭代他們自己/瞭解的對象並將訪問者傳遞給他們。它知道如何訪問它訪問的對象的信息,如果信息應該打印出來,以及控制檯/文件/數據庫或其他地方,它也知道如何格式化:xml/html /以純文本/ csv爲例。

這是你可以自由設計你的項目層次結構,無論你將會改變打印目標和格式等。

0

如果它是唯一的顯示任務的名字和你不想Person取決於Task,那麼我建議添加一個方法

List<String> getTaskNames(); 

Project類。這是項目應該能夠說明的事情:任務的名稱。

或創建一個額外的TaskMetaData類,該類包含所有屬性,一個人需要了解某個任務,並返回一個TaskMetaData對象的集合。我寧願通過串聯字符串。