2012-06-20 40 views
1

我經常看到這樣的代碼:它是反模式嗎?

public abstract class AbstractDataReader 
{ 
    public void Read() 
    { 
     var reader = new StreamReader(FileName); 
     ........ 
    } 

    protected abstract string FileName 
    { 
     get; 
    } 
} 

public class DataReader : AbstractDataReader 
{ 
    protected override string FileName 
    { 
     get { return "data.txt"; } 
    } 
} 

對於我來說,接縫作爲反模式,爲的DataReader類沒有邏輯,我不能沒有從它繼承使用AbstractDataReader,這也是奇怪的是我不得不繼承這個類只是爲了指定參數,而且我工作得比較慢,然後只是通過構造函數來傳遞參數。

但我不能找到這個反模式的名稱。

有誰知道嗎?

+2

這是C#代碼,而不是java,爲什麼** Java **標籤? –

+2

@Mauricio:Java標籤由其他用戶編輯,而不是由OP編輯。我已經將它回滾,並以C#的形式正確地重新簽名。 – Ani

+0

它沒有被任何語言標記,因爲我已經發布了它。但我認爲這樣的代碼也可能在Java語言中遇到。 –

回答

6

是的,這是一個反模式。抽象類已經規定派生類將如何工作,這對於單個類中的類層次結構沒有任何優勢。

如果抽象類,而不是所謂的純虛函數來獲取StreamReader,它將使意義。然後,不同的派生類可以附加到文件,網絡流或動態生成的數據。

這裏的反模式是「的開閉原則,侵犯」(固態第二部分)。

+0

本,繼承總是違反了開放 - 封閉的princilpe,因爲子類不能完全保護基礎類別不變。但這不是稱之爲違規的原因。那麼你能否澄清一下究竟在哪裏? –

+0

@Oleg:這不僅僅是「子類不能保護基類的變化」。它們不應該是,子類與基類強烈耦合。這裏發生的事情是,基類正在使用泛型編程技術(純虛函數,虛擬調度)而沒有增加任何靈活性。基類不能用於任何不是文件的東西,所以抽象沒有任何好處。 –

0

是/否。

對我來說,這看起來像一個試圖抽象的setter注入,這我不知道是個好主意。它使事情不清楚並導致代碼被髮布,但setter注入本身並不是反模式。