高效的Kotlin——為可讀性設計

為可讀性設計(Design for readability)

可讀性是一種半玄學的話題,它的評價標準常常取決于上下文環(huán)境和你對一門語言的了解程度横朋。來看一個具體的例子:

// Implementation A
if (person != null && person.isAdult) {
    view.showPerson(person)
} else {
    view.showError()
}

// Implementation B
person?.takeIf { it.isAdult }
    ?.let(view::showPerson)
    ?: view.showError()

以上兩種實現(xiàn)在表意上是完全等價的仑乌,那么你覺得哪種可讀性更好呢?顯然琴锭,不是代碼越短可讀性就越好晰甚,代碼越簡潔,往往需要我們載入更多的關于這門語言的“方言”决帖,這些方言在特定實現(xiàn)下是提升了可讀性還是降低了可讀性厕九,這是個玄學問題。僅就上述兩種實現(xiàn)而言地回,作者和我都認為第一種可讀性更高扁远,第二種可讀性差一下,但是更加“地道”(?. takeIf let ?:)刻像。
命令式編程(A實現(xiàn))是人們的直覺畅买,也是所有編程語言的基礎結構,國際通用語言细睡;面向表達式編程(B實現(xiàn))是特定編程語言的方言谷羞,更偏向于表述做什么而不是怎么做。兩種編程方式都有其應用場景溜徙,合理使用都能提升代碼的可讀性湃缎。

現(xiàn)在假設需求變了犀填,我們需要修改代碼:

// Implementation A
if (person != null && person.isAdult) {
    view.showPerson(person)
    view.hideProgressWithSuccess()
} else {
    view.showError()
    view.hideProgress()
}

// Implementation B
person?.takeIf { it.isAdult }
    ?.let {
        view.showPerson(it)
        view.hideProgressWithSuccess()
    } ?: run {
        view.showError()
        view.hideProgress()
    }

顯然A實現(xiàn)更加便于修改,并且表意也更加清晰嗓违。B實現(xiàn)不僅不便于修改九巡,而且在此情形下,表意上與A實現(xiàn)也有細微差別(person == null情況下)靠瞎。

以上例子僅僅是為了說明比庄,在“這種情況”下,命令式編程可讀性更強乏盐,并不是說命令式編程在任何情況下都優(yōu)于表達式編程佳窑,表達式編程的主要應用場景在于各種“流”的操作上:

students
    .filter { it.pointsInSemester > 15 && it.result >= 50 }
    .sortedWith(compareBy({ it.surname }, { it.name }))
    .joinToString(separator = "\n") {
        "${it.name} ${it.surname}, ${it.result}"
    }
    .let(::print)

var obj = FileInputStream("/file.gz")
    .let(::BufferedInputStream)
    .let(::ZipInputStream)
    .let(::ObjectInputStream)
    .readObject() as SomeObject

典型的“流”就如上述例子給出的那樣:集合和各種Stream(肯定還有更多其它類型的流帜平,我暫時也想不起來)腰涧。Kotlin標準庫定義在集合上的擴展函數(shù)的數(shù)量我就不必贅述了,它們都為面向表達式編程提供了非常好的條件竿报;而各種Stream的層層包裝自然也是面向表達式編程很好的應用場景何吝。
流與表達式的結合可以大大提升代碼的可讀性溉委,流本身的步驟性與表達式簡潔性的結合相得益彰。這種結合可能不利于debug爱榕,不利于Kotlin初學者瓣喊,但是平衡了所得與所失之后,仍然推薦上述編程方式黔酥。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(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
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勉耀。 經常有香客問我指煎,道長蹋偏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任至壤,我火速辦了婚禮威始,結果婚禮上,老公的妹妹穿的比我還像新娘像街。我一直安慰自己黎棠,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布镰绎。 她就那樣靜靜地躺著脓斩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畴栖。 梳的紋絲不亂的頭發(fā)上随静,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音吗讶,去河邊找鬼燎猛。 笑死,一個胖子當著我的面吹牛照皆,可吹牛的內容都是我干的重绷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膜毁,長吁一口氣:“原來是場噩夢啊……” “哼昭卓!你這毒婦竟也來了?” 一聲冷哼從身側響起爽茴,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤葬凳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后室奏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體火焰,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年胧沫,在試婚紗的時候發(fā)現(xiàn)自己被綠了昌简。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绒怨,死狀恐怖纯赎,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情南蹂,我是刑警寧澤犬金,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響晚顷,放射性物質發(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