用Kotlin改寫PHP程式是什麼樣的體驗
學Kotlin其實要看:http://kotlinlang.org/docs/kotlin-docs.pdf
線上版是不完整的!!!少了一些章節,會有點難看懂後面的文件。
我選擇了WordPress裡的錯誤訊息管理類wp-error.php為物件,沒有依賴其他具體場景和類,所以比較適合移植和對比。
程式碼是前幾天整理的,為了便於線上檢視,把它貼到Git上了。程式碼檢視地址:http://git.oschina.net/web3d/kotpress/blob/master/Error.kt
為了簡化邏輯,將Error類中要儲存的data、code全部設定為String型別。
基礎知識
1.語感
上帝說,要有光,從此就有光了;奧巴馬說,程式語言是門外語,從此,我們也是精通多種外語的人啦。
Kotlin從程式碼的語感上,是有著python的風格的,像:
if (obj is String) return obj.length
if (x in 1..y - 1) println("OK")
是不是很接近英文原生語句?
2.變數
區域性變數分為可變變數和不變變數,分別用 var(variable) 和 val(?)來宣告。
variable
記憶體中的變數初始化,一般要經過兩步,宣告變數型別、開闢記憶體空間;賦值初始化。
var y: Int;
y = 10;
目前多數語言的寫法,都是一句話完成這兩步。
var y: Int = 10;
而Kotlin中更簡潔的寫法是:
var y = 10;
y 被賦值時,會被自動推斷(inferred)為整型Int,這種寫法有點親切感了。
注:型別自動推斷是強靜態型別語言範圍的一種特性。自動推斷型別的能力讓很多程式設計任務變得容易,讓程式設計師可以忽略型別標註的同時仍然允許型別檢查。型別推導不是Go語言首創,但是現代語言中,Go中運用廣泛,Kotlin也引入了這種特性。
Kotlin是靜態型別的,如果想將y重新賦值為其它型別如字串是不行的:
y = "13"
Val
val 基本特性和用法與var相同,但有點類似我們一般語言中常量的概念:被初始化賦值一次後,不能再重新賦值;與常量不同的是,它可以作為區域性變數。如:
val y = 10
如果繼續在後面:
y = 12
編譯器就會報錯。
當然,不能重新賦值不是說變數所代表的物件包含的值不能變,下文的陣列物件array,同樣是通過val宣告的,但它裡面包含的值是可以繼續操作的。
剛從PHP轉過來的話,應該還有點適應不了:要熟悉和記憶各種資料型別和集合型別;每次宣告一個變數,還要想這個變數是否可變,太燒腦了。但這就是一種更樸實的思維方式,前面多想想,後面的程式碼就會更可靠,不會因為一些意外的操作造成資料的值或型別被破壞。
類的普通屬性應該都用 var 來宣告,因為可能要在某個方法中將另一個物件賦給它;但區域性變數應當儘可能用val。
3.型別推導
Java裡面定義一個字串型別的一維陣列列表要這樣寫:
ArrayList<String> array = new ArrayList<String>();
Kotlin裡面:
Kotlin可與Java互通,所以,它也可以寫成類似上面的形式:
val array: ArrayList<String> = ArrayList<String>();//沒有new關鍵詞
array.add("abc")
但Kotlin風格的寫法為:
val array = arrayListOf<String>();
array.add("abc")
PHP裡面:
$array = [];
$array[] = `abc`;
4.this
和Java一樣,Kotlin中大多數時候,this可以省略,這是現代程式語言都支援的特性。
像PHP、Python這種都需要有個指代物件去訪問。
5.empty/Blank
再牛掰的語言,可能也解決不了空字串的問題;一個字串物件就是可以包含空字串、或者可能含有多個空格的字串。但邏輯上,他們是無效的資料!所以幾乎每個有字串的地方,可能都要判斷一下,尤其是做鍵名等名稱標識的場景。
WordPress這個Error類就是典型場景。錯誤訊息是按錯誤程式碼 => 錯誤訊息 的格式儲存的,如果以空字串為鍵名,它到底代表什麼含義,無法明確得知。所以我們就要判斷是否為empty,但php裡的empty判斷在這真正有用嗎,如果這個鍵名裡包含的字元全是空格呢?所以像Java和Kotlin中的String物件除了isEmtpy()方法外都會有個isBlank()的判斷。
但在演示程式碼中,我反覆斟酌後,還是去掉了相關判斷,因為幾乎這個類每個方法裡都得加,這樣沒有美感,不科學。
6.句尾分號可省略
單行語句多數情況可以省略分號
7.燒腦的Exception
PHP中,我們還沒有養成丟擲異常、然後捕捉異常的程式設計習慣。一般都是通過多種返回值型別或範圍去判斷結果,是成功還是失敗、正常還是異常。到了Kotlin這類靜態型別語言中,方法返回值也是需要一種確定的型別,那麼失敗或異常就只能通過丟擲異常的方式去做了。異常的捕捉如果不到位的話,就很容易出現不健壯的體驗,動不動的崩潰了。
相關文章
- 在大公司寫程式碼是一種什麼樣的體驗?
- 用 C 語言寫面向的物件是一種什麼樣的體驗物件
- 用C語言寫面向的物件是一種什麼樣的體驗C語言物件
- 像排程程式那樣安排任務,是什麼樣的體驗?
- 和程式設計師談戀愛,是什麼樣的體驗程式設計師
- 在小公司程式設計是一種什麼樣的體驗?程式設計
- 被文獻坑是一種什麼樣的體驗?
- PHP - 什麼是 PHP? 為什麼用 PHP? 有誰在用 PHP?PHP
- 用 Kotlin 開發 Android 專案是一種什麼樣的感受?KotlinAndroid
- 30 歲轉行做初級程式設計師是什麼樣的體驗程式設計師
- 用 Kotlin 開發 Android 專案是一種什麼樣的感受?(二)KotlinAndroid
- 【開源訪談】厲華:寫一個開源容器引擎會是什麼樣的體驗?
- 當 dotnet-monitor 遇上 Prometheus, 是種什麼樣的體驗?Prometheus
- 當一名阿里P9是什麼樣的體驗?阿里
- 在農業銀行做開發是什麼樣的體驗?
- 在MacBook上使用Win 10是一種什麼樣的體驗Mac
- 在Excel VBA中寫SQL,是一種什麼體驗ExcelSQL
- 搶先體驗! 在瀏覽器裡寫 Flutter 是一種什麼體驗?瀏覽器Flutter
- 30歲轉行做初級程式設計師是一種什麼樣的體驗?程式設計師
- 手把手自己造無人駕駛車,是什麼樣的體驗?
- 《新神》開發者:獨立遊戲開發是種什麼樣的體驗?遊戲開發
- 深度學習中資料集很小是一種什麼樣的體驗深度學習
- 在Android上使用JS引擎是一種什麼樣的體驗?AndroidJS
- PHP需要改變什麼PHP
- 為什麼我拒絕用Kotlin編寫安卓應用?Kotlin安卓
- 什麼是PHP或PHP程式碼以及PHP程式設計的工作原理PHP程式設計
- 同樣是車、球,為什麼《火箭聯盟》改變了體育遊戲?遊戲
- 什麼是開發者體驗DX? - redmonk
- 在 2016 年學 JavaScript 是一種什麼樣的體驗?JavaScript
- 支付寶王益:40歲寫30年程式碼是一種什麼體驗?
- 用 Kotlin 開發 Android 專案是一種什麼樣的感受?(用 DSL 配置自定義 view)KotlinAndroidView
- 什麼是PHPPHP
- 什麼樣的程式碼稱得上是好程式碼?
- 寫程式碼的妹紙會是怎麼樣的?
- 招一個寫程式碼的女生:國外女程式設計師是什麼樣的程式設計師
- 究竟什麼樣的遊戲體驗才能稱得上“好玩”遊戲
- 在 2016 年學 Android 是一種什麼樣的體驗?Android
- 最終一輪面試被 Google 刷掉,這是一種什麼樣的體驗?面試Go