2010-06-24 33 views
9

我一直在研究.NET 4.0 Code Contracts,並在關於這個問題的問題上尋找stackoverflow。.net 4.0代碼合同。何時使用?他們什麼時候浪費時間?

我還沒有遇到任何使用代碼合同的示例代碼,這讓我想知道..這真的很有用嗎?或者,也許它唯一有用的代碼達到了一定的複雜度?任何人在那裏使用代碼合同,真的很高興他們做到了?

在我看來,所有的代碼合同都是一個斷言的方法,除了能夠嘗試找出在編譯時進出的值的方法是什麼... ...但是那麼這將需要更多的代碼在你所有的方法..是否值得嗎?

我注意到的一個好處是,在我看來,你可以使用代碼合同作爲單元測試的第一行......然後當你編寫單元測試可以避免編寫一些更基本的測試,因爲代碼合同已經覆蓋了......這是真的嗎?

契約是否可以與WCF調用一起使用?我猜測沒有,因爲代理與您自動創建,你不能改變。

+0

我想知道這與ASP.NET驗證器有什麼關係?或者這個東西只適用於BLL? – punkouter 2010-06-24 16:13:43

回答

7

我隨時使用它們,我需要驗證一個輸入參數需要具有特定的值(數字是正數,對象不爲空)。

對於輸出,我會在任何時候使用它們來確定返回值應該處於特定狀態(例如不爲null)。

通過代碼中的契約,可以確保在出現意外值時立即拋出異常,並且不會在代碼中由於意外假設而意外地將對象遺留在損壞狀態的代碼中。

就我個人而言,我認爲它使代碼更清潔。這個符號使得它更少寫(而不是使用if(.... == null)....)。這種方式Contract.Requires在它正試圖完成的事情中是非常先行的。當我看到我知道代碼正在評估參數處於特定狀態時。

+0

整體節省時間嗎?你認爲你使用斷言的主要優點是什麼? 我擔心代碼合同是我把所有的代碼,但實際上它的矯枉過正,只是膨脹的代碼,因爲檢查是非常明顯的其中之一.. 我想我仍然在等待一個更好的例子'看到?它檢查字符串是否爲null!' – punkouter 2010-06-24 15:25:55

+4

無論如何,您應該驗證您的輸入。我認爲這樣可以節省時間,因爲其他程序員很容易明白你的意圖。你可以用if語句做同樣的事情,但是Contract.Requires表明你正在驗證一個輸入。對於發生的事情沒有猜測。另一個很酷的事情是,你可以定義合同在項目文件中的工作方式。在開發過程中,您可以將合同設置爲在違規發生時立即停止程序。 – kemiller2002 2010-06-24 15:28:57

+0

代碼合約在WCF中如何實現?它是否使用導出策略。您可以在代碼合同用於業務驗證時提供參考嗎? – Lijo 2013-03-26 16:28:31

2

有合同的研究領域:http://en.wikipedia.org/wiki/Design_by_contract很久以前,它們被引入.net。

代碼合同給予回答下列問題有用:

  • 什麼方法期待?
  • 方法保證什麼?
  • 方法維護什麼?

如果您可以爲這些問題寫出小而可讀的合同,然後使用它。

+0

所以如果一個項目開始,鮑勃做的UI和喬做的BLL ......是這種類型的設計,這樣不僅將鮑勃和喬交換什麼方法和參數..但我也是在UML(或無論)參數的允許值被定義......然後你在你的方法的頂部使用代碼合約來添加這些驗證......這將如何工作? – punkouter 2010-06-24 16:15:50

+0

類似的東西。它只是擴展驗證。有一些工具可以將聯繫人提取到獨立文檔。 – Andrey 2010-06-24 18:07:45

2

其中一個使用CodeContracts的主要原因是爲了使靜態分析能夠檢測CodeContracts的違規行爲,以便它們在運行時被及早發現而不會導致錯誤或未知行爲。

如果需要,您可以禁用CodeContracts的運行時實施。

使用它們的另一個很好的理由是將合同定義添加到XML代碼註釋以增強API文檔。這也適用於Sandcastle,儘管需要進行一些調整以充分整合它們。代碼合同用戶手冊日期爲2011年2月4日(或更晚)的第8.3節提供http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf