2013-10-24 62 views
2

這是一個一般風格的問題,這是最佳實踐?哪個更具可測性?比方說,你有類:面向對象編程,它是否更面向對象傳遞參數給方法而不是構造函數?

public class MyExecutor { 
    public MyExecutor(Model model) { 
     this.model = model 
    } 
    public void execute() { 
    // Do something with model; 
    } 

    public String toString() { 
    return model.toString(); 
    } 
} 

有了上面的代碼,讓我們說我通過我的興趣對象的構造函數,然後以後使用該對象的唯一方法。將上面的代碼與下面的代碼進行比較。

public class MyExecutor implements TheExecutor { 
    public MyExecutor() { 
    } 
    @Override 
    public void execute(Model model) { 
    // Do something with model; 
    } 
} 

該代碼的一個優點是,我可以定義一個接口方法,並且可以定義所需的參數。不是面向構造函數的方法。

有了這些方法,只有一個構造函數和一個方法,您更喜歡哪種方法?爲什麼?

+2

這取決於你需要達到的目標。 –

+0

我會用第二個例子,用MyExecutor的一個實例,一次執行一個'Model'的多個實例。另外,很明顯'Model'不是'MyExecutor'的一部分。 –

+0

它主要取決於你是否需要_immutable objects_:看看http://www.javapractices.com/topic/TopicAction.do?Id=29 – davioooh

回答

4

您必須考慮對象的狀態(即對象是什麼,具有修改狀態的方式的狀態)。如果對象的狀態由模型確定,它應該在構造函數中。否則,它應該用作可能修改狀態或使用狀態來確定輸出/返回值的參數。

這與接口問題類似。 TheExecutor只能與Model一起運行嗎?如果需要Model那麼它應該是在參數列表或如果對象狀態取決於Model和執行只能用Model運行,那麼TheExecutor應該是一個abstract class持有的Model每個子類的構造函數應該調用super(model)

+0

所以真正的上述兩種方法是完全分開的。有些情況下,您想使用方法1,有些方法您想要使用方法2. –

+0

下面是另一個問題,其他一些編程語言(如Common Lisp)使用基於槽的OOP方法。在我上面的示例中,這種方法可能看起來像方法2。 MyExector真的必須有'狀態'嗎? –

+0

@BerlinBrown不,它不一定有一個狀態,但如果它沒有,它聽起來更像是一個靜態類。當然,除非你想讓其他類繼承它。 – clcto