2010-07-22 37 views
6

我一直在考慮創建一個Java框架,它允許程序員指定接口上的不變量(前置條件和後置條件)。目的是爲了使代碼更健壯,並減少需要爲同一接口的不同實現編寫的單元測試的數量。將不變量添加到Java中的接口中

我設想創建一些方法來註釋方法,程序員也可以編寫不變式。例如。

interface Sort { 
    int [] sort(int [] nums); 
} 

會裝飾一個註釋以確保任何實現返回一個排序列表。這個註釋將被鏈接到可以在編譯時針對任何實現運行的單元測試。

這是一個瘋狂的想法,還是這會對更廣泛的編程社區有用?

+0

我不確定在編譯期間是否將它與單元測試鏈接起來是一個好的舉措。因爲_having測試通過只是東西_,如果你知道我的意思。 使用方面編織器可能是一個更好的方法,不是嗎? (然後下一個問題將是 - performance) – yclian 2010-07-22 15:33:03

+2

@yclian,我認爲這個想法是使用這些前後條件來執行各種靜態分析,以減少需要按順序編寫的單元測試的數量獲得同等的覆蓋面。我沒有看到任何暗示這肯定會是一個運行時間的東西(儘管也許有些運行時斷言可以用來防範靜態分析無法證明安全的語句)。 – Gian 2010-07-22 15:53:32

回答

4

這聽起來像是它可能與JMLESC/Java有關,它們都在各種項目中找到合理的廣泛應用,這些項目需要的軟件質量比通常的一套技術提供的要多一點。

+0

謝謝我會看看JML – Tarski 2010-07-22 15:51:09

+1

我從來沒有聽說過。 「合理廣泛採用」 - 請提供數據。我敢打賭,你對這個聲明沒有任何基礎,除了你已經完成的一兩個項目。 – duffymo 2010-07-23 00:19:46

+1

@duffymo,我不認爲積極的語氣是必要的。我確實符合「合理廣泛採用」的條件。我基於這樣一個事實發表聲明,即至少在我知道的幾所大學中,有一個相當健康的JML工具生態系統(http://en.wikipedia.org/wiki/Java_Modeling_Language#Tool_Support),而大多數專業工程師可能至少熟悉JML作爲一個概念。也有相當數量的同行評審出版物涉及JML(http://scholar.google.com/scholar?hl=zh-CN&q=java+modeling+language)。 – Gian 2010-07-23 06:44:52

0

什麼偉大的編程思想不瘋狂!我絕對認爲這會很有用。

+2

同意,但不應該這是一個評論? – whiskeysierra 2010-07-22 21:27:03

1

我認爲Bertrand Meyer的合約創意編程在很大程度上已經死亡。他在埃菲爾建立了前置條件和後置條件,但是在使用規模上該語言低於拉丁語。

有合約庫的Java編程; Contractor就是其中之一。但是它的一天已經過去了。事實是,甚至艾菲爾都有辦法在生產中關閉它們,因爲運行時間成本不值得。

只有6埃菲爾堆棧溢出的問題 - 確實有一小部分。如果您在其中搜索帶有「合同」的SO標籤,您會看到一個非常小的數字。對這個網站上的主題沒有太大的興趣。它聲稱吸引了世界上最大的專業程序員。

+0

有趣的意見。你會說測試驅動開發比合同設計更好嗎? – Tarski 2010-07-22 22:29:02

+0

「你會說測試驅動開發比合同設計更好嗎?」 - 絕對。沒有運行時間的懲罰;他們提供關於類的行爲的更好的信息;他們的文件比合同要好得多。給出一個選擇,我寧願有測試。 – duffymo 2010-07-23 00:18:45

+3

我不會說他們的文件比合同要好得多。使用TDD,您可能會測試一些輸入來擴展功能,但聯繫人可能會以抽象的方式定義該功能實際執行的功能。例如一個sum(x,y)函數可能有合同回報x + y,而一個測試可能只是斷言sum(1,2)= 3 – Tarski 2010-07-23 07:36:03

2

我認爲契約設計是一個好主意,我瀏覽了一些提供Java功能的框架。我認爲讓我反感的是,從團隊獲得這種框架的支持可能很困難。我認爲它被認爲是唯一的學術興趣,這很奇怪,因爲它實際上就像在代碼中嵌入單元測試一樣。

Java在這方面的主要觀點,斷言聲明,已經存在好幾年了,但我很少看到它的使用 - 通常只有在我自己編寫的代碼中!使用斷言有很多里程(特別是與單元測試相結合),並且我發現了一些使用它們的錯誤,可惜人們並沒有使用它們。

乾杯,

伊恩。

+0

我同意你的觀點,即斷言未被充分利用。我剛剛完成SCJP考試,Sun建議僅使用斷言來檢查私有方法的先決條件。但是,真的,沒有什麼可以阻止你使用它們來檢查後置條件。 我有斷言的問題是,他們默認情況下禁用 - 我想用一個編譯時間檢查的框架。 – Tarski 2010-07-23 14:37:02