软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结...
?
健壯性與正確性
健壯性與正確性是不同的——一個傾向于使程序盡可能保持運行,即使遇到錯誤,一個傾向于使程序盡可能正確,不在意保持運行
異常
異常分為兩種——checked exception與unchecked exception
二者的區別在于:
- checked exception需要顯式的處理,說白了就是編程者必須要么用catch抓住它,然后在try中想辦法處理掉,要么顯式的將這個異常扔到調用的上一級方法,也就是甩鍋??偠灾?#xff0c;你永遠不能無視checked exception
- unchecked exception則完全相反,你不捕捉不到它們。因為這些異常一旦產生,就像接到了燙手山芋一樣,容不得我們再把他保留著或者throw到上一級方法,這些異常會在其產生的地方直接中止程序,并在控制臺打印錯誤信息。
?
?
?異常使用的注意事項
- catch 不能獨立于 try 存在。
- 在 try/catch 后面添加 finally 塊并非強制性要求的。
- try 代碼后不能既沒 catch 塊也沒 finally 塊。
- try, catch, finally 塊之間不能添加任何代碼。
關于異常的LSP原則
- 如果子類型中override了父類型中的函數,那么子類型中方法拋出的異常不能比父類型拋出的異常類型更廣泛
- 子類型方法可以拋出更具體的異常,也可以不拋出任何異常
- 如果父類型的方法未拋出異常,那么子類型的方法也不能拋出異常。
那么結合我之前對繼承關系的理解,——前置條件不能加強,后置條件不能減弱
如果父類拋出了一個異常,子類拋出一個更具體的異?!?#xff1f;
這我能理解。因為異常也可以看做方法的后置條件,后置條件不能減弱,固異常變得更加具體是完全符合的
如果父類拋出了一個異常,子類可以不拋出異常————???
那么這個就只能夠理解為”不拋出任何異常是比拋出某一種異常更加具體的條件。”, 我們可以就這樣理解,不跑出異常相當于把異常拋出的條件無限加強。
?
?防御式編程
防御式編程(Avoiding debugging),顧名思義,就是為了減少bug的出現而采用的一系列措施。
第一道防線:不讓bug產生
聽起來很厲害哈哈哈哈,說得倒輕巧。
其實這第一道防線的意思就是減少bug的一些編程技巧,比如說:
- 靜態檢查
- 動態檢查
- 使用immutable的對象
- 使用immutable的引用
第二道防線:縮小bug的影響范圍
也就是老生常談的fail fast
使用Assertion是一個重要技巧,但是哪些東西需要使用asserrtion呢,這也有一些套路的
- 需要assert的
- 方法參數的條件(前置條件)
- 方法的返回值的條件(后置條件)
- 不需要assert的
- java中的算式等從語法角度不會犯錯的(也就是不要試圖用assert尋找虛擬機的錯誤)
- 外部的錯誤(比如說用戶的輸入,文件的存在性等,這個我們管不著)
其它方法
- Incremental Development
- Modularity
- Encapsulation
Debugging
?。。。。。。(這里真的沒有什么內容啊)
Testing
測試用例很重要,但是也很繁瑣。本學期軟件構造課的實驗中,對我來說的最大的噩夢就是為自己的代碼寫test用例了。
如何選擇測試用例
簡而言之,就是通過對方法的輸入空間和解空間,根據方法的特性來設定測試用例。
一個簡單的例子:
如果要測試BigInteger.multiply(BigInteger b)
?
如何劃分?
- 正值,負值與0
- 很小的值,很大的值
- 特殊值(比如0,-1,1)
然后只要按照這些劃分來寫測試用例即可。
這是一個很淺顯的例子,事實上ppt與mit的reading中都明確給出了關于等價類劃分的一套證明,但我認為如果要理解測試用例的書寫,只需要理解
- 錯誤經常發生在邊界條件處
- 對每一種情況選擇一個代表元素
即可。
Documenting test strategy
選擇測試用例的劃分是編程時經常用到的技巧,但是對于考試題來說,還必須會將測試用例書寫下來才行。不要到考場上才慌慌張張想著怎么排版按什么格式
?
?白盒測試與黑盒測試
黑盒測試就是在不知道方法的內部實現的情況下,只根據前置條件和后置條件對方法進行測試,這是最常用的。
而白盒測試則是對方法的內部實現進行測試?例子?
?
轉載于:https://www.cnblogs.com/giere/p/11074043.html
總結
以上是生活随笔為你收集整理的软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 安装svn客户端
- 下一篇: oracle Sql语句分类