軟件構造-對specifications的一些理解和總結

本篇blog的內容來源於對MIT課程中的readings 6 - Specifitions閱讀後的一些總結和我的的理解java

網址:http://web.mit.edu/6.031/www/fa18/classes/06-specifications/程序員

這篇reading詳細介紹了java程序編寫中的specifications的相關,通篇讀下來以爲酣暢淋漓,寫的十分精彩。web

總結

Specification是一個至關嚴謹的概念。若是上課沒有仔細聽課,或者看書的時候沒有認真,很容易把specification直接理解成「就是給每一個方法寫一個大體的描述」。實際上,specification比這要複雜得多。編程

如下是我在閱讀過程當中,對重點內容的一些總結。工具

Specification的做用

簡單來講,Specification就是在程序中方法的層層調用之間添加一層約定,已達到解耦和的目的。post

稍微詳細一點講:咱們在編程的時候會寫不少方法,不少類,這些方法與類層層調用,互相影響。程序越大,這個調用關係就越複雜,代碼就愈加臃腫和難以理解,程序的維護就變得至關困難,更是給全部嘗試理解代碼的人靈魂上的折磨。而Specification用來在不一樣方法之間劃清界限,寫下約定條件,對敲代碼的人來講是一種目標與約束,對閱讀代碼的人來講則是提示。測試

specification的組成

粗略的瞭解specification,大概須要掌握四個方面的內容:設計

 

  • Precondition(前置條件)與Postcondition(後置條件)
  • 測試用例的設計
  • Checked Exception 與 Unchecked Exception的區別
  • 使用Exception時的取捨

Precondition與Postcondition

若是說沒有specification的代碼是一大堆便便,那麼加入了specification,用pre和post condition限制了以後的代碼就是用許多塑料袋把便便按功能封裝起來,這樣,Client,也就是調用者,只可以看到塑料袋,條理天然要清晰明確不少。blog

兩者區別何在:
方法要有輸入與輸出,Precondition用於限制輸入,Postcondition用於限制輸出。ci

更進一步

Precondition規定了這個方法所接受的合法輸入,也就是在client調用這個方法時,要想使方法可以產生正確的結果,client所須要知足的條件(其實就是輸入的變量的條件)

Postcondition只會在Precondition被知足時纔有意義。Postcondition規定了在Precondition被知足的狀況下,調用當前方法所產生的影響。

分工明確,方法的調用者以知足precondition爲目標,方法的編寫者則默認precondition已經被知足,以知足postcondition爲目標。

 

 

specification只給出了知足precondition條件下,postcondition必須被知足。若是precondition沒有被知足,那麼方法就能夠隨心所欲。


舉個例子,某個方法要求輸入一個大於0的整數。若是輸入的整數小於0,咱們的方法能夠:

  • throw一個異常出去
  • 返回一個null值
  • 在控制檯輸出信息
  • 唱,跳,rap,籃球
  • 停止程序執行
  • 播放歌曲
  • ~~爆炸~~

除非spec裏提到了輸入值小於0時方法應該怎麼作,不然方法能夠隨心所欲

關於NULL

null爲何要存在?

爲了給程序員找麻煩

 

readings裏面只介紹瞭如何避免null帶來的麻煩,卻沒有說明null存在的合理性,無需多言,你們都懂。

妙的是,readings說「null values are implicitly disallowed in parameters and retur  values ... Avoid null

在編程中應該時刻注意null的處理

  • 基本數據類型不可以被聲明爲null

測試用例的設計

如何保證給出的pre 和post condition是正確的?針對兩者設計測試用例

 

測試用例能夠分爲兩類:

  • black box
  • glass box

兩者都必須遵循specification

black box很好理解,就是針對preconditon與postcondition,充分考慮各類邊界條件來設計測試用例便可。

可是glass box存在的理由是什麼?咱們設計測試用例是絕對不能踏出specificatioin一步的,雖然specification隱藏了方法的內部實現,可是並非說對方法內部設計測試用例就會跨越這條界限。

方法之間也許存在相互依賴。?留一個疑問在這裏,我仍然不能很好的理解glass box的意義

 

Checked Exception 與 Unchecked Exception


兩者的區別在於,checked Exception必需要被try catch語句包圍,或者要在外圍方法中添加throws語句即意味着:這個exception必須顯式地被處理掉。

checked exception通常用於處理意料之中的特殊狀況,好比說錯誤的輸入,這是徹底有可能的。那麼在這裏exception其實就是一個很方便的 fail fast的工具,是用來馬上對特殊狀況產生響應的。

unchecked exception則不須要被try catch 包圍,也就是說,不用去管。

unchecked exception用於處理錯誤狀況,通常會有兩種可能

  1. 這個問題解決不了,程序沒有任何但願了,只能直接報錯
  2. ??這裏爲何會出問題?這是徹底意料以外的,無法預先設置處理方案,只能直接報錯

理解

specification的做用說來講去,仍是解耦和。把功能包裝起來,把問題產生的範圍縮小,不一樣的人能夠專心於不一樣的工做,不須要爲各類不肯定的條件所煩惱。

相關文章
相關標籤/搜索