用Kotlin改寫PHP程式是什麼樣的體驗

x3d發表於2016-08-26

學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這類靜態型別語言中,方法返回值也是需要一種確定的型別,那麼失敗或異常就只能通過丟擲異常的方式去做了。異常的捕捉如果不到位的話,就很容易出現不健壯的體驗,動不動的崩潰了。


相關文章