2014-02-05 32 views
2

我目前正在試圖成爲一個有點熟悉接口仿製藥,所以根據自己的目標和實現我寫道:界面中發生了什麼?

public interface ICipher<T> 
{ 
     void EncryptData(T raw); 
     void DecryptData(T encrypted); 
} 

但是一個collegue說我不應該做這樣他說我應該這樣做:

public interface ICipher<TRaw, TEncrypt> 
{ 
    TEncrypt EncryptData(TRaw rawData); 
    TRaw DecryptData(TEncrypt encryptedData); 
} 

他提供後不久,他不得不離開。

雖然這個問題,爲什麼這是一個更好的解決方案?究竟有什麼區別?他們是不是都執行泛型,我能想到的唯一的事情就是要返回TRawTEncrypt對象。

我在這裏錯過了什麼嗎?這裏有什麼區別,有人能解釋嗎?

+0

具有兩個通用參數的接口允許任何cypher實現爲加密值返回不同的類型。它更加靈活。 – Oliver

回答

3

沒有更好或更糟的。這取決於用例。

想象一下你將如何實現這些接口。

class StringCipher : ICipher<string> 
{ 
void EncryptData(string plaintextString); 
void DecryptData(string ecnryptedString); 
} 

class StringCipher : ICipher<string, EncryptedContainerObject> 
{ 
EncryptedContainerObject EncryptData(string plaintextString); 
string DecryptData(EncryptedContainerObject encryptedObject); 
} 

第一個版本是爲了接受string,對其進行加密,結果預計將是一個string了。

第二個版本是更加靈活:你把string中,讓你選擇的對象回來(我做了EncryptedContainerObject,在現實中卻往往是byte[]類型)。也許你不希望你的加密數據是string,但可以直接存儲在數據庫中的某個實體?

另外:第一個版本缺少加密數據的返回值或存取器。你將如何從你的實現中再次獲得它?

0

如果您嘗試實施界面,我認爲其差異將會很明顯。你的第一個接口中的方法實際上並沒有返回任何數據 - 大概你想從你的方法中返回數據。

TRaw/TEncrypt的區別是因爲通常在加密之後,你會得到不同的類型 - 例如,加密string並取回byte[]

但是在這種情況下我並不真正看到泛型的需要。特別是輸出可能總是相同的類型(byte[],或者如果你想爲了方便base64編碼,可能是string)。輸入可能受益於通用,這取決於您計劃如何實現接口。

0

它將允許您使用兩種不同類型的解密和加密數據。在您的第一個實現中,加密數據類型將始終與解密數據相同。這很好,如果你正在做一個string哈希產生一個string但如果你想產生一個integer例如,只有第二個實現將工作。

在第二種實現中,沒有任何東西會強制您使用兩種不同的類型(即您仍然可以實現ICipher<string, string>):它比第一種更靈活。

在你的第一個實現中,你的方法不會返回任何東西,所以我想你想直接改變參數;在這種情況下,我希望引用類型,這是值得澄清這樣的:

interface ICipher<T> where T : class 
{ 
    //... 
} 

第二個實現返回的值是一個更好的設計;如果我要實現接口或使用實現它的類,我希望這些方法具有返回值而不是更改發送的參數。

2

這裏唯一的真正區別是:

  1. 的方法採取不同的參數類型
  2. 方法返回的東西(不void

不知道你的具體使用情況,很難說哪個更好,但似乎像EncryptDecrypt等方法應該返回東西 ...