> 近日來對Kotlin的使用頻率越來越高, 也對自己近年來寫過的Kotlin代碼嘗試進行一個簡單的整理. 翻到了自己五年前第一次使用Kotlin來完成的一個項目([貝塞爾曲線](https://juejin.cn/post/6844903556173004807)), 一時興起, 又用發展到現在的 ...
> 近日來對Kotlin的使用頻率越來越高, 也對自己近年來寫過的Kotlin代碼嘗試進行一個簡單的整理. 翻到了自己五年前第一次使用Kotlin來完成的一個項目([貝塞爾曲線](https://juejin.cn/post/6844903556173004807)), 一時興起, 又用發展到現在的Kotlin和Compose再次完成了這個項目. 也一遍來看看這幾年我都在Kotlin中學到了什麼.
關於貝塞爾曲線, 這裡就不多贅述了. 簡單來說, 針對每一個線段, 某個點到兩端的比例都是一樣的, 而貝塞爾曲線就是這個過程的中線段兩端都在同一位置的線段(點)過程的集合.
如圖, AD和AB的比例, BE和BC的比例還有DF和DE的比例都是一樣的.這個比例從0到1, F點的位置連成線, 就是ABC這三個點的貝塞爾曲線.
![Bezier](https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/449809-20191009163226592-1802036977.png)
# 兩次完成的感受
雖然時隔五年, 但是對這個項目的印象還是比較深刻的(畢竟當時找啥資料都不好找).
當時的項目還用的是Kotlin Synthetic來進行數據綁定(雖然現在已經被棄用了), 對於當時還一直用findViewById和@BindView的我來說, 這是對我最大的驚喜. 是的, 當時用Kotlin最大驚喜就是這個. 其它的感覺就是這個"語法糖"看起來還挺好用的. 而現在, 我可以通過Compose來完成頁面的佈局. 最直觀的結果是代碼量的減少, 初版功能代碼(帶xml)大概有800行, 而這次完成整個功能大概只需要450行.
在使用過程中對"Compose is function"理念的理解更深了一步, 數據就是數據. 將數據作為一個參數放到Compose這個function中, 在數據變化的時候重新調用function, 達到更新UI的效果. 顯而易見的事情是我們不需要的額外的持有UI的對象了, 我們不必考慮UI中某個元素和另一個元素直接的關聯, 不必考慮某個元素響應什麼樣的操作. 我們只需要考慮某個Compose(function) 在什麼樣的情況下(入參)需要表現成什麼樣子.
比如Change Point按鈕點下時, 會更改`mInChange`的內容, 從而影響許多其它元素的效果, 如果通過View來實現, 我需要監聽Change Point的點擊事件, 然後依次修改影響到的元素(這個過程中需要持有大量其它View的對象). 不過當使用Compose後, 雖然我們仍要監聽Change Point的點擊事件, 但是對對應Change Point的監聽動作來說, 它只需要修改`mInChange`的內容就行了, 修改這個值會發生什麼變化它不需要處理也不要知道. 真正需要變化的Compose來處理就可以了(可以理解為參數變化了, 重新調用了這個function)
特性的部分使用的並不多, 比較項目還是比較小, 很多特性並沒有體現出來.
最令我感到開心的是, 再一次完成同樣的功能所花費的時間僅僅只有半天多, 而5年前完成類似的功能大概用了一個多星期的時間. 也不知道我和Kotlin這5年來哪一方變化的更大