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

来源:http://www.cnblogs.com/x3d/archive/2016/08/26/5812001.html
-Advertisement-
Play Games

學Kotlin其實要看:http://kotlinlang.org/docs/kotlin docs.pdf 線上版是不完整的!!!少了一些章節,會有點難看懂後面的文檔。 我選擇了WordPress里的錯誤消息管理類wp error.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這類靜態類型語言中,方法返回值也是需要一種確定的類型,那麼失敗或異常就只能通過拋出異常的方式去做了。異常的捕捉如果不到位的話,就很容易出現不健壯的體驗,動不動的崩潰了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (此文章同時發表在本人微信公眾號“dotNET每日精華文章”,歡迎右邊二維碼來關註。) 題記:最近在開發釘釘的微應用,考慮到性能和UI庫的支持,遂採用了React來開發前端。 目前我的項目是基於ABP框架的ASP.NET MVC/WEB API作為後端,AngularJS作為前端。但是發現釘釘官方的... ...
  • 第一次寫博文寫的不好,但希望能幫助大家,有什麼偏頗的地方希望大家多多斧正。在這個問題上困擾了我兩天,這兩天翻來覆去睡不著。一直在想這個問題。廢話不多說下麵進入正題。 1.創建創建web項目,加入SpringMVC的jar,我這裡演示用spring-framework-4.2.3.RELEASE。ja ...
  • 1.引用的Jar 2. BitTransform.java package com.test; public class BitTransform { public static int getUShort(byte[] byteArray) { int value = 0; value += (b... ...
  • 說明:Firemonkey 圖片按鈕(支持三種狀態:MouseOver, MouseDown, MouseUp,可各別指定圖片) 原碼下載:[示例]TestImageButton_圖片按鈕(3態).zip 運行展示: ...
  • 不多說,先上代碼,代碼的註釋寫的已經挺詳細的了 首先先瞭解了URL的一些常用的方法,現在我嘗試利用網址讀入內容到控制台列印輸出 很好奇會列印出什麼東西呢 下麵就是列印出來的東西 並不是想象中的會將我寫的博客列印出來,而是列印出了頁面的HTML佈局代碼 而教程中,使用Tomcat伺服器,URL地址指定 ...
  • 自定義模板引擎類 MyTpl.class.php 1 <?php 2 class MyTpl 3 { 4 private $tpl_vars = array(); 5 //分配 6 public function assign($key,$value){ 7 $this->tpl_vars[$key ...
  • 設計模式重點在於代碼風格的實現,使項目易於開發維護以及更新,同時,在底層代碼中存在著各種設計模式,使之易於拓展。總而言之,學會設計模式非常重要,在學習了《Head first 設計模式》之後,根據個人見解將裡面的知識與個人知識經驗結合提煉出來,方便以後自己回頭查閱複習,也同大家一起學習,如有不足,歡 ...
  • 首先如果TCP學過以後,再看UDP進行數據傳輸也是大同小異的,只是用到的類不同 UDP進行傳輸需要DataSocket和Datapacket類,Datapacket叫數據報,每一個數據報不能大於64k,都記錄著數據信息,發送端的IP、埠號, 以及要發送到的接收端的IP、埠號。 UDP進行傳輸是將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...