我正在寫一個(非常小的)框架來檢查方法的前置和後置條件。入口點是(他們可以很容易地方法,這並不重要):.Net中是否有可能僅從客戶端程序集的調試版本調用某些代碼?
public static class Ensures {
public static Validation That {
get { ... }
}
}
public static class Requires {
public static Validation That {
get { ... }
}
}
顯然,檢查後置條件可能是昂貴的,而實際上不是必要的,當方法不馬車。所以,我想它的工作原理是這樣的方法:
public static class Ensures {
[ConditionalCallingCode("DEBUG")]
public static Validation ThatDuringDebug {
get { ... }
}
}
其中ConditionalCallingCodeAttribute
意味着,當調用代碼,並定義了DEBUG符號編譯此方法應只運行。這可能嗎?
我想客戶端代碼看起來像這樣:
public class Foo {
public void Bar() {
... // do some work
Ensures.That // do these checks always
.IsNotNull(result)
.IsInRange(result, 0, 100);
Ensures.WhileDebuggingThat // only do these checks in debug mode
.IsPositive(ExpensiveCalculation(result));
return result;
}
}
當然,我根本無法提供WhileDebuggingThat。隨後,客戶端代碼應該是這樣的:
public class Foo {
public void Bar() {
... // do some work
Ensures.That // do these checks always
.IsNotNull(result)
.IsInRange(result, 0, 100);
#ifdef DEBUG
Ensures.That // only do these checks in debug mode
.IsPositive(ExpensiveCalculation(result));
#endif
return result;
}
}
這是後備計劃,如果沒有別的辦法了,但它打破DRY實在太差了。
據我所知,標誌着WhileDebuggingThat
與[Conditional("DEBUG")]
將發射(或不)的庫的彙編,其中參考這個庫中的組件的不期間被定義取決於是否DEBUG此方法。所以我可以做到這一點,然後編寫文檔,告訴庫用戶將他們的代碼的調試版本與庫的調試版本聯繫起來,併發布版本與發佈版本。這並不是我最好的解決方案。
最後,我可以告訴圖書館用戶定義自己的項目裏面這個類:
using ValidationLibrary;
public static class EnsuresWhileDebugging {
[Conditional("DEBUG")]
public static Validation That() {
return Ensures.That;
}
}
我看這應該工作爲好,儘量,但仍需要突破DRY原則,如果只是輕微。
這不是什麼斷言? – 2008-12-27 13:29:17
斷言適用於檢查後置條件(僅適用於調試版本;我希望允許在發佈版本中保留後續檢查),而不驗證前置條件。 – 2008-12-27 14:05:24