2011-03-18 58 views
0

讀碼爲一個項目,我注意到了這個情況,有兩個類如下面的例子:OOD:代碼重構和最佳設計(保護或的getter/setter)


class A { 
    private class E aE; 
    private class F aF; 

    public A(){ 
     aE = new E(); 
     aF = new F(); 
    } 

    public void foo1(){ 
     aE.bar(); 
     ... 
     aF.poo(); 
    } 
} 

class B implements Runnable { 
    private class E aE; 
    private class F aF; 

    public B(){ 
     aE = new E(); 
     aF = new F(); 
    } 

    public void run(){ 
     ... 
     x = aE.bar() 
     ... 
    } 

} 

我會重構這個代碼爲了得到一個超類A,但是沿着這種方式,最好在類A中使aE和aF保護字段,並在類B中使用它們,或者在類A中添加兩個方法getE()和getF(),並使用此方法在B班?

回答

2

B不延伸A,它似乎是一個簡單的複製粘貼作業,其中包含實現Runnable所需的方法。你明顯應該避免這樣做並創建另一個專門運行應用程序的類,那麼你可能不需要類B

0

Mark,從這個例子中很難指出你應該如何重構這段代碼。以下是一些可能性 -

  1. A和B是否具有共同的父類取決於實際類之間是否存在邏輯父 - 子關係。

  2. 如果存在關係,也可以從A擴展B類。在這種情況下,您必須將aE和aF公開爲屬性。

  3. 另一種可能性是,你可以在自身實現Runnable,消除B類

  4. 如果它是很常見的有兩種E級和F爲私有字段在一起,那麼你可以考慮在一個封裝它們鍵入,比如說EF,然後用該類組合其他類。

但是,只有在知道實際的類是什麼後才能給出正確的答案。

0

有關名爲'A'和'B'的類的任何聲明可能沒有足夠的上下文來錯誤或正確。

但是我想,假設一個合理的擴展B擴展A的情況,幾乎總是更喜歡使用受保護或包級數據成員訪問。如果你有一個正式和嚴重的接口來使用Get/Set訪問器,那麼你可能在實現繼承是一個好的設計選擇的上下文之外。