2016-03-03 129 views
6

我有一個類MyClass它有一個實施中的錯誤。這個類是庫的一部分,所以我不能改變這個類的實現,因爲它會默默地改變現有客戶端的行爲(客戶在這種情況下可能依賴於這個bug:例如參見https://connect.microsoft.com/VisualStudio/feedback/details/790160/httpclient-throws-operationcanceledexception-insead-of-timeoutexception命名約定:如何命名同一個類的不同版本?

我需要創建包含錯誤修復的同一個類的第二個版本。 我以前見過這種情況,但我看到的命名總是增量例如MyClass2,MyClass3

這些情況可能相當罕見,但我想知道是否有更好的方式命名這些「版本」類。 我想象一個能夠及時增長的解決方案,並且具有多種類型的這些類型,特別是對於圖書館而言,這可能會讓人感到困惑。我想象自己有MyClassV2MyClass之間挑選,MyClassV3

+0

不知道是否存在命名約定,但是我會使用'MyClassVX'並將之前的過時標記爲過時標記。 – thijmen321

+0

有人可能會認爲這個問題主要是基於意見的,所有關於命名約定的問題都是如此。也許你的問題會更好地在[programmers.stackexchange.com](http://programmers.stackexchange.com)上收到? –

回答

4

我想知道是否有更好的方式來命名這些「版本化」類。

「修復其他類中的錯誤的類」沒有.NET命名約定。我會建議你的工作場所的其他開發人員,看看他們是否有任何公司慣例。我認爲一致性比實際名稱更重要。

並在您的問題的側面說明,我不會創建一個新的類。我會用DeprecatedAttribute標記該方法,並在同一個類中實現該邏輯,從而公開一組新API方法,這些API方法已被正確記錄以表明它們在此處作爲修補程序。您的圖書館的客戶可能已經熟悉MyClass,這樣做可以減輕他們的使用,並使他們每次都需要問自己「我應該使用哪種版本」。

2

我將你現有的類的所有行爲複製到一個新的,重命名原來的以表明類已廢棄,重命名新的一個來自之前的實際名稱並將原始名稱(現在使用新名稱)標記爲[Obsolete],表示不應該再使用它。因此所有消費代碼都會自動調用新行爲。因此,具有正確行爲的新類將獲得原始類的名稱,例如,錯誤的類將獲得版本號。

對於遺留代碼,您可以做相反的操作,用新名稱創建一個新類並將其標記爲Obsolete。我知道帶有版本號的SDK,其中最後一個數字表示最新版本的類,其他所有版本都有這樣的屬性以及文檔中的提示,說明該類將被新版本取代。

0

我覺得重名班名會嚴重混淆別人超時。你用c#接口提取方法並實現不同的版本。

7

在理想的世界中,新版本將引入額外的功能,同時仍然保持100%向後兼容以前版本的API。不幸的是,理想的世界仍然難以捉摸,並不總能保持完全的向後兼容性。在這種情況下,版本後綴是適當的模式。

標準的.NET命名約定是使用增量編號,如Class,Class2,Class3等。這來自COM接口的命名約定,專爲您所描述的用例而設計。例如,IHTMLDocument接口目前有8個版本,從IHTMLDocument直到IHTMLDocument8

原來Framework Design Guidelines書,由Cwalina和艾布拉姆斯,明確建議這種做法,與具有作者這樣說的:

DO使用數字後綴來表示已有API的新版本,如果API的現有名稱是唯一有意義的名稱(即,它是行業標準),並且添加任何有意義的後綴(或更改名稱)不是合適的選項。

// old API 
[Obsolete("This type is obsolete. Please use the new version of the same class, X509Certificate2."] 
public class X509Certificate { ... } 

// new API 
public class X509Certificate2 { ... } 

的舊約定,再加上原有的Windows團隊,是後綴Ex添加到API,這是從字的新的和改善的版本「延長」。但這並不能很好地擴展,導致易混淆的後綴ExEx。我不認爲有一個ExExEx;每個人都害怕觸摸這些API。該框架設計指南建議明確這種做法,誰去建築師.NET鄉親們已經吸取了教訓:

不要使用「EX」(或類似)後綴的標識符以區別於同一API的早期版本。

[Obsolete("This type is obsolete. ..."] 
public class Car { ... } 

// new API 
public class CarEx  { ... }  // the wrong way 
public class CarNew  { ... }  // the wrong way 
public class Car2  { ... }  // the right way 
public class Automobile { ... }  // the right way 

顯然,作爲他們最後的代碼示例提示,如果你是在API的新版本增加了特定功能的支持,你最好關閉命名新的類/接口並提及該特定功能。

雖然上面幾乎專注於類和接口,但對於可能在稍後版本中添加的該類的任何成員函數,同樣的邏輯也適用。原始函數可以保留其原始名稱,新添加的函數具有不同的名稱,以反映其迭代或其添加的功能。

+0

Upvoted張貼在設計指引和突出約定。雖然不贊成使用的方法也是我的首選解決方案,但這種特殊的解決方案在我所遇到的邊緣案例中是必需的。 – David

0

爲了清楚起見,如果發生這種情況,我使用ClassV2.這表明它是該類的另一個版本。