2013-04-30 65 views
0

實施例1:下面三種java類設計中的哪一種更好,爲什麼?

public interface Adder { 
    public int getSum(); 
} 

public class AdderImpl implements Adder { 
    private int v1; 
    private int v2; 
    public AdderImpl(final int v1, final int v2) { 
     if (validate(v1,v2) == false) { 
      throw some exception; 
     } 
     this.v1 = v1; 
     this.v2 = v2; 
    } 
    public int getSum() { 
     return this.v1+this.v2; 
    } 
} 

實施例2:

public interface Adder { 
    public int getSum(final int v1,final int v2); 
} 

public class AdderImpl implements Adder { 

    public int getSum(final int v1, final int v2) { 

     if (validate(v1,v2) == false) { 
      throw some exception; 
     } 
     return v1+v2; 
    } 
} 

實施例3:

public interface Adder { 
    public int getSum(); 
} 

public class AdderImpl implements Adder { 

    private int sum; 

    public AdderImpl(final int v1, final int v2) { 
     if (validate(v1,v2) == false) { 
      throw some exception; 
     } 
     this.sum = v1 + v2; 
    } 
    public int getSum() { 
     return this.sum; 
    } 
} 

我在這裏我的簡化生產場景到這個簡單的類和interface.Example 1具有不利的是,如果有人眼球接口,他將無法知道接口的輸入。例2克服了這個優點。通過查看getSum接口,用戶將能夠知道哪個接口起作用的輸入。然而,如果稍後某人在示例2設計中爲該接口添加了另一個函數,並且使用了這兩個接口,則會重複輸入驗證。如果調用者多次調用getSum,則示例3給出了不計算總和的明顯優勢。對我來說,他們三人現在都在工作。我在示例1和示例2之間更混淆,輸入驗證的責任應該與構造函數(示例2)或更容易理解的接口應該是首選(示例1)?

+1

你是什麼意思「更好」?如何添加一些要求或標準? – OldProgrammer 2013-04-30 13:40:24

+3

這取決於你使用它們。 – SLaks 2013-04-30 13:40:27

+1

這不應該繼續[Code Review](http://codereview.stackexchange.com/)?顯然,有一些更詳細的信息。 – MikeTheLiar 2013-04-30 13:41:02

回答

2

而不是說什麼更好,我會說這取決於你的情況。

  1. 如果您以後需要能夠訪問個人會員,這很好。我絕不會以當前的形式使用它,但如果要添加getter方法,它可能會更好。通過預先計算總和,您可以稍微提高運行時性能(請參閱版本3)
  2. 如果要重新使用該類來添加其他內容,則此版本很不錯。它允許您重用功能而無需創建新對象。然而,在這種情況下,你的功能非常簡單,沒有必要擔心,但對於更復雜的情況下,這可能是正確的
    • 順便說一句,這個人將不能編譯,您應該刪除this.
  3. 這和#1完全一樣,除了你只計算一次總和。通過預先計算,可以提高此類的運行時性能。請注意,這個版本沒有任何可用的值,如果你想添加一個getter方法後
1

1和3是有狀態的接口,你構建和實例,然後有效地記得哪些可以問的問題,一些immuatable狀態多次,總是給出相同的答案。我們可以想象一個更復雜的例子,它封裝了一些較大的數據集並返回更多的派生值(例如,我們可以計算平均值,模式,中位數標準偏差等的數據系列)。因此,1和3使生產者消費者有一種關係。

雖然2允許某些數據的擁有者只需對該數據進行計算,但計算器不會保留任何狀態。當我們只需要封裝計算時,這似乎是合適的。按照事實,我們可以使用Singleton作爲這個計算類。實際上,我們正在將數據與邏輯分離,這可能意味着我們沒有盡我們所能封裝。