2016年6月17日 星期五

研究 Scala 的一小部分想法

這幾天開始研究 Scala ,相較於 Javascript ,嚴謹多了,而它主要是基於 JVM 的下一代 Java 語言。其中有不少語法特性,值得思考。

比方像是 override 關鍵字,若子類別使用到父類別同名的成員變數或功能,則必需指定 override ,表示子類別「確實」要使用同名的變數或功能,而且要自己實作這個功能。這樣的語法,使得軟體工程師在寫程式,一定會注意到是否寫到 override 的部分。

以前作大型專案時,曾經有個網頁程式一直出錯,但很難查出問題在那。後來就從頭一步一步查起,結果是在前端的 javascript 中,有一個功能的名字,跟使用到的 javascript lib 「一模一樣」,但因為 javascript 沒有「強制」override 的識別功能,所以,程式跑起來就不穩定,只要使用到這個同名功能時,就會出錯。

另一個看到的是 Structural typing。這個跟 Groovy 的 duck 的概念類似,也就是,如果走起來像個鴨子,叫聲像個鴨子。那它就應該是個鴨子。Scala 的 Structural typing,可以自行定義一個結構,來表示這些行為,從而使用這些動作,即使是沒有關係的類別,只要符合結構定義的行為,就可以使用這個行為。

def doQuack(o: {def quack(value: String): String}) {
  println (o.quack("Quack"))
}
class NorthDuck {
  def quack = "quack"
}
class SouthDuck {
  def quack = "quack quack"
}
doQuack(NorthDuck)
doQuack(SouthDuck)

這樣的特性,有什麼用處?有時候,我們需要增加既有的程式一些功能,但原程式並沒有提出 interface 之類的元件,可以讓我們用繼承的方式使用時,就可以藉由結構,把需要的「行為」定義出來,這樣就可以增加新的類別元件,採用跟原程式庫中相同的「行為」名稱,而不需動到既有的程式庫。

2016年6月16日 星期四

Javascript是個有「洞」的語言

直到 ECMAScript 2015 出來之前,Javascript 一直是個有洞的語言,它很容易讓程式出錯,讓開發人員看不懂程式碼的用意,尤其是一些「所謂」的技巧

5 nifty JavaScript tricks that you may not know

比方像第一個 case
if(fruit === 'apple' || fruit === 'banana' || fruit === 'chikoo'){
    doMagic();
}

改寫成底下
if({apple:1,banana:1,chikoo:1}[fruit]){
    doMagic();
}
這樣作的目的是讓原來的文字檢查,變成用一個 {} 物件的 key / value 檢查,但這種寫法,其它的語言不一定能直接實作,尤其是現在是跨語言使用的時代,愈多特定語法的使用,愈不能在別的語言運用。同時,這種技巧也愈需要花時間了解。

寫程式,是要解決問題,而不是解決程式的問題。

由於 Web 前端都採用 javascript 處理,故使用這個語言,最佳的策略便是使用「高手們」作出的套件,愈高階愈好,像JQuery比較低階。而AngularJS 就比較高階。因為採用高階套件,就不需寫太多javascript程式碼,就可以避免出錯。Google 有 GWT,可以用 Java 寫 javascript ,可惜它的 Designer 及似乎停止發展,更新緩慢。這可能是因為後起之秀 Vaadin 有開發付費版本的 Designer ,要避免競爭之故吧。

但現在的程式開發,重點不是開發,因為現今能用的技術,幾乎都能很快速實作出需要的功能,而只有好的點子的實作,才會有最多人使用。因此,如果構思好點子,會比使用這些炫麗的功能更為重要。

2016年6月15日 星期三

Eclipse Java Swing BeansBinding JSR 295

UI 元件常需跟 Model 的資料作連動,除了自己寫程式之外,也可以用 Eclipse WindowBuilder + BeansBinding 提供的方式作連動。

底下是簡單的範例,當使用者輸入最上方的文字方塊,最下方會同步顯示輸入的文字。按下 Add 後,該文字就會置入中央的列表中,並清空文字方塊。

 


1.首先要加裝  jsr 295 Beans Binding 的實作,選用的是 BetterBeansBinding ,如果使用 Gradle,則要設定 BetterBeansBinding SwingBinding


2.執行 gradlew.bat 把 jar 檔設定好後,隨便拉一下 Swing 組成如下的視窗,可以看到有個Bindings的tab
 

3. 把 Target 跟 Model 的 text 綁定起來。
 

4.底下是自動產生的程式碼片斷,怎麼解讀?算了,不重要,有興趣自己去看 JSR 295,只要它能讓兩個元件彼此資料連動就好了。
 

好啦,這樣就可以連動兩個元件的資料了。

不過 JSR 295 好像熄火了,沒什麼動作,所以這些程式庫也很久沒有新版。目前比較「熱」的是 JGoodies Binding ,至於怎麼用,下次再研究吧 ......

2016年6月13日 星期一

Eclipse WindowBuilder 的使用心得

Eclipse 預設在建立 Swing 物件時,會把一切組件宣告通通放在 constructor 中。

但有時要特別處理某組件,我們可以將它 expose 出來,也就是多一個 get method 並把該組件宣告成 class 成員變數,如果沒有外部程式使用 get method,那就刪除那個 get method。另外使用 private method 操作該組件。

例如:
1.底下是一個簡單的 Swing 程式
 

2.在 Eclipse 的程式碼如下,可見綠色框的部分,已經是成員變數,而紅色框的部分,則定義在method中
 

3. 回到 Desgin 模式,將 textArea Expose 出來
 

4.  切換到程式碼模式,就可以看到改變的部分
 

5. 此時就可以在整個 class 中,使用 textArea ,因為它已經是成員變數了

 

如果希望每一個組件都是成員變數,可以由 Window -> Preferences -> WindowBuilder -> Code Generation 中,設定 Field 模式即可
  

這樣產生出來的組件,都會是成員變數了。

分時分工專注

想要一段長時間的專注在單一事件上,有時不是容易的事,比如寫程式就是一例,此時可以採用分時分工專注的方法,也就是,當無法專注在寫程式時,就去作簡單的運動,專注在運動上,然後再回頭寫程式,或許會有進展。此外看其它文章,聽音樂,寫blog等等,都可以分時分工專注。當然重要的眼睛休息時刻也要加進去,這樣應該會比較有效率些。

至於不同的事件花多少時間,這個就看自己掌握了。

2016年6月12日 星期日

減少冗長的樣板程式碼 - Lombok

寫 Java 程式時,常會需要為成員變數建立 getter 及 setter,使用 IDE 工具可以容易自動建立這些樣板程式碼,但當成員變數過多時,整個程式碼就會變得很長,而真正運作的程式碼,就會淹沒在其中。有個 Lombok 的專案,針對這個部分,作了一系列的 annotations。效果顯示如下:

1.未使用前,右方只有一堆成員變數。
 

2.使用 @Data 後,自動產生樣板程式碼,顯示在右方 method 清單上,但左方並沒有產生這些程式碼,都被 @Data 代表了。


3.而底下就是真正執行功能的程式,整個程式碼清爽多了




專案主頁
https://projectlombok.org/
詳細說明
http://jnb.ociweb.com/jnb/jnbJan2010.html

2016年6月5日 星期日

軟體建構之道 (Code Complete, 2/e)

這幾天開始讀這部軟體工程巨作。目前只看到第五章,但其實很多觀念在專案中,不時會使用到。如果說沒有開發程式的經驗,就先看這本書,是不錯。但經過專案及程式開發後再來看,會更有啟發性。