2015-02-26 58 views
0

我已經創建了下面的接口的多個實施方式和混亂:接口,具有大約參數

public interface IReader 
{ 
    string Read(); 
} 

一種實現這一點,是一個封裝的邏輯讀入基於存儲在所述的路徑上從磁盤XML文件的XmlFileReader配置文件。

它的另一個實現是FileReader,它將根據指定的路徑作爲參數從磁盤讀取文件。

現在令人困惑的是,XMLFileReader在Read()方法中不需要任何參數,而FileReader則需要這樣的參數。我應該爲IReader.Read()方法添加一個可選參數,以便在FileReader的情況下,我可以使用參數提供文件路徑,而在XMLFileReader的情況下,不會使用該參數?

另一種選擇是使用帶參數的Read()方法創建單獨的接口。

什麼是這種情況下的好設計?

+0

爲什麼你認爲兩個不同的調用應該是相同的抽象? – Euphoric

+0

原因是它是相同的操作,即讀取操作。區別在於路徑是由調用者提供的還是從配置文件中提取的。你有什麼建議? –

+1

如果調用者提供的參數不同,則它們是不同的操作。僅僅因爲他們被稱爲相同的名稱並不會使他們相同。 – Euphoric

回答

1

的規範的解決辦法是把參數在具體類的構造的詳細說明。

這就是說,我不認爲你的設計是健全的:返回XmlReader.Read方法是什麼?請記住,接口的用戶應該忽略它使用的具體類。因此,在撥打IReader.Read()後,不應根據文件類型對字符串進行不同的詳細說明。這是你的情況嗎?

在我看來,你想捕獲的變化不是「讀取文件」部分,而是「我如何獲得正確的文件讀取」。在這種情況下,具有「讀取」方法的接口是無用的。

在任何情況下:IReaderXmlFileReaderFileReader對於您的課程而言確實是很糟糕的名稱。您應該避免-er後綴:請參閱this good article。請記住,繼承應該模擬一個IS-A關係。

0

我想你可以使用策略模式。它將算法隔離在不同的類中,以便能夠在運行時選擇不同的算法。

這裏是圖案 Strategy pattern explained

+0

請舉個例子。 –

+0

鏈接中有一個很好的例子。你有看到它嗎? –

+0

是的,我確實看到了,但是在我的場景中沒有多大意義。不管怎麼說,多謝拉 ! –