Kotlin邊用邊學:利用 require / check / assert 完善接口定義

Key Takeaways(劃重點):

  • require對外、check對內(nèi),組成了協(xié)議的前置條件
  • assert是協(xié)議的后置條件

接觸過Design by contractOCL(Object Constraint Language)或平時設(shè)計比較嚴謹?shù)耐瑢W應該知道,一個良好的接口設(shè)計/文檔其實是應該包括了接口的前置條件(即滿足什么條件才可以調(diào)用這個接口)和后置條件的(執(zhí)行完畢這個接口后,哪些是真)。在2000年初期MDA (Model-driven Architecture)還比較紅火的時候续室,很多模型師、架構(gòu)師都會在接口中追加此類定義谒养。這個追加行為挺狰,除了本身有利于源代碼的輸出(是的,當時MDA的口號其實就是以后不需要碼農(nóng)买窟,只要模型師的)丰泊,確實可以讓接口的定義更完整、清晰始绍,顯得專業(yè)味十足瞳购。

現(xiàn)在MDA雖然不怎么再提到,但其科普的前置/后置條件還是一定程度幫助了軟件業(yè)的完善亏推。Kotlin作為一個比較現(xiàn)代的語言苛败,在汲取了多類語言和設(shè)計概念后,很多原先其他語言需要特定實現(xiàn)(或重復發(fā)明輪子)的事情径簿,在Kotlin的標準庫就自帶了,譬如require / check / assert 對于前置/后置條件的支持嘀韧。

先看下三者的定義:

  • require(Boolean) throw IllegalArgumentException
  • check(Boolean) throw IllegalStateException
  • assert(Boolean) throw AssertionError

其實對應著看到各自的輸出篇亭,應該能猜測到一些東西。譬如

  • IllegalArgumentException: 傳入的參數(shù)有問題
  • IllegalStateException:自身狀態(tài)不對
  • AssertionError:和預估的不一樣 (在后置條件的維基百科中其實就是這么定義的)

    Postconditions are sometimes tested using assertions within the code itself

所以總結(jié)下來锄贷,大概就是這么回事了:

  • require負責檢查輸入的參數(shù)译蒂,如果有問題曼月,拋出IllegalArgumentException
  • check負責檢查自身是否萬事俱備可以執(zhí)行了,如果不是柔昼,拋出IllegalStateException
  • require + check就是在做前置條件的檢查哑芹,通過了才可以執(zhí)行真正的程序邏輯
  • assert負責確保程序執(zhí)行完畢后的結(jié)果/內(nèi)部狀態(tài)是否符合預期,如果不是捕透,拋出AssertionError

一個完整應用了這幾個檢查的代碼大概如下(一個方法用于單次執(zhí)行指定的sql語句聪姿,每次執(zhí)行連接數(shù)據(jù)庫并在執(zhí)行完畢后釋放連接(老土的demo,沒有連接池-_-)):

fun execute(sql: String) : Unit {
    // 輸入?yún)?shù)的檢查
    require(!sql.isNullOrBlank()) {
        "被執(zhí)行的sql語句不能為空"
    }

    // 自身狀態(tài)檢查
    check(!this.host.isNullOrBlank()) {
        "sql server未指定"
    }

    /*
     * conn = ...
     * conn.execute(sql)
     * conn.disconnect()
     */

    // 執(zhí)行完畢后狀態(tài)檢查
    assert(!conn.isConnected) {
        "每次執(zhí)行完畢后都需要釋放連接"
    }
}

上面的require和check的順序乙嘀,沒有一定的誰先誰后末购,這個純粹看個人風格/習慣。不過如果涉及到某些執(zhí)行/檢查比較費資源時虎谢,還是讓不費資源的優(yōu)先執(zhí)行為上盟榴。

Kotlin標準庫的這幾個函數(shù),雖小卻清晰的用代碼來定義了契約婴噩,講究協(xié)作的今天擎场,還是挺需要的。

希望這篇博文能對你有所幫助几莽,喜歡的話點個贊吧迅办!

更多Kotlin的實用技巧,請參考《Kotlin邊用邊學系列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末银觅,一起剝皮案震驚了整個濱河市礼饱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌究驴,老刑警劉巖镊绪,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洒忧,居然都是意外死亡蝴韭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門熙侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榄鉴,“玉大人,你說我怎么就攤上這事蛉抓∏斐荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵巷送,是天一觀的道長驶忌。 經(jīng)常有香客問我,道長笑跛,這世上最難降的妖魔是什么付魔? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任聊品,我火速辦了婚禮,結(jié)果婚禮上几苍,老公的妹妹穿的比我還像新娘翻屈。我一直安慰自己,他們只是感情好妻坝,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布伸眶。 她就那樣靜靜地躺著,像睡著了一般惠勒。 火紅的嫁衣襯著肌膚如雪赚抡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天纠屋,我揣著相機與錄音涂臣,去河邊找鬼。 笑死售担,一個胖子當著我的面吹牛赁遗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播族铆,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岩四,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哥攘?” 一聲冷哼從身側(cè)響起剖煌,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逝淹,沒想到半個月后耕姊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡栅葡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年茉兰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欣簇。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡规脸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熊咽,到底是詐尸還是另有隱情莫鸭,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布横殴,位于F島的核電站被因,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氏身,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惑畴。 院中可真熱鬧蛋欣,春花似錦、人聲如沸如贷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杠袱。三九已至尚猿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楣富,已是汗流浹背凿掂。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纹蝴,地道東北人庄萎。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像塘安,于是被迫代替她去往敵國和親糠涛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理兼犯,服務發(fā)現(xiàn)忍捡,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 本文是在學習和使用kotlin時的一些總結(jié)與體會切黔,一些代碼示例來自于網(wǎng)絡(luò)或Kotlin官方文檔砸脊,持續(xù)更新... 對...
    竹塵居士閱讀 3,281評論 0 8
  • 一、什么是擴展函數(shù)绕娘? 擴展函數(shù)數(shù)是指在一個類上增加一種新的行為脓规,甚至我們沒有這個類代碼的訪問權(quán)限。這是一個在缺少有...
    常思行閱讀 952評論 1 2
  • 前言 人生苦多险领,快來 Kotlin 侨舆,快速學習Kotlin! 什么是Kotlin绢陌? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,208評論 9 118
  • 今天滿天都是烏云密布挨下,把雨水藏在云霄間,還沒有下脐湾。就像是太陽公公用一塊麻布遮住臉頰臭笆,不讓我們知道它的真面目。就好像...
    王玉笙閱讀 204評論 0 0