2009年11月30日

嘗試使用 Java 的 reflection 重構指派資料欄位值的程式碼

如果你熟悉動態語言,你大概會嘗試使用 Java 的反射(reflection)來重構程式碼。我個人提供一個重構經驗,告訴你使用 Java 的反射時,你可能會感到失望。

這是一段透過 Hibernate 進行的資料更新動作。我從使用者端取得要更新的資料項,接著先向 Hibernate 查詢要更新的資料項目是否存在,存在的話再把新的資料內容更新進去。

...繼續閱讀

Posted by shirock at 樂多Roodo!00:33回應(10)引用(0)C/C++
標籤:reflection,反射,refactor,DRY,重構

2009年11月26日

PHP 5.3/6 新增功能 - Closures, const, and others

PHP 5.3 新增特性列表與本部落格的系列文章:

  • 名稱空間 (Namespace)
  • 延遲靜態繫結 (Late Static Bindings)
  • 新的魔術方法, __callStatic and __invoke.
  • 標記跳躍, Support for jump labels (limited goto) has been added.
    就是 goto ,忘了它吧。
  • HTTP 串流轉接器(HTTP stream wrapper) 現在將狀態碼 200 到 399 視為成功執行。我不曉得為什麼這會列在新功能中。這看來是為了改善 RESTful service 的支援。
  • 支援巢狀的例外處理。
  • 加入一個垃圾收集器,預設開啟。嗯... PHP 沒有垃圾收集功能嗎?Ok, 原本的垃圾回收機制清潔力不夠。 目前大多數 PHP 程式架構是處於一次性消耗的無狀態環境下,基本上我們都假設程式跑完後行程就自動結束,而行程中配置的資源也會被作業系統回收。 在這種情形下設計出來的 PHP 程式碼,直接搬到 application container 架構執行時,會出現資源佔用不放的問題。 所以這功能應該是為了將來發展 PHP 的 application container 而強化的機制。
  • 閉包、匿名函數(native Closures)(Lambda/Anonymous functions)。
  • 新的即席文件語法(Nowdoc syntax)。
  • 關鍵字 const 現在可用於類別定義之外。
  • 三元運算子(?:)有縮寫形式。

關於 Closures (匿名函數), Const, Nowdoc 等新功能,將於本文中說明。

...繼續閱讀

2009年11月24日

PHP 5.3/6 新增功能 - Namespace

Namespace 是 PHP5.3 面向大型專案開發所新增的一項重要功能。並不是說有了 Namespace 就萬事大吉,但至少在結合來自各路好漢的函數庫與功能框架時,不必太擔心名稱衝突的問題了。

PHP 以 namespace 關鍵字指示名稱空間,此指令兼具定義與切換空間的意義。名稱空間的命令方式與一般符號相同,並以 \ (斜線) 作為名稱空間(namespace)的分節符號。它借用檔案系統的目錄樹觀念劃分常數(const)、函數(function)與類別(class)等定義的存在空間 (注意,名稱空間並不支援變數。所有的變數都存在於同一個空間)。

...繼續閱讀

Posted by shirock at 樂多Roodo!00:20回應(0)引用(1)PHP
標籤:PHP5.3,namespace

2009年11月22日

PHP 5.3/6 新增功能 - New magic methods

There are two new magic methods, __callStatic and __invoke.

PHP5.3 起新增了魔術方法 __invoke()。 簡單說,就是 C++/C# 中的 operator() 運算子重載。 還新增了魔術方法 __callStatic(),專門負責調用靜態方法。

...繼續閱讀

Posted by shirock at 樂多Roodo!23:42回應(0)引用(1)PHP
標籤:magic method,function object,PHP5.3

PHP 5.3/6 新增功能 - Late Static Bindings

PHP5.3/6.0 新增延後靜態繫結(late static bindings)功能。 此功能由關鍵字 static 實現,係對照 self 之功能而出現。

self 關鍵字採用儘早靜態繫結策略,PHP 在解譯語法時,就直接將 self 繫結到它所在的類別。static 關鍵字採用延後靜態繫結(late static bindings)策略,要等到執行到那一段敘述時, PHP 才會根據調用者所屬類別來設定 static 所代表的類別。

...繼續閱讀

Posted by shirock at 樂多Roodo!23:31回應(0)引用(1)PHP
標籤:late static bindings,PHP5.3

2009年11月15日

從中介編程與反射能力來談 Java 語言

公司這個月開始一件專案,我分配到用 Java 開發 web service 那一塊。 於是我親身體驗到一本書說的故事。

找一個很聰明,但是沒有 Java 經驗的開發者,讓他去學學 Java web 企業應用的那一堆技術,然後再問問他的想法。問題是兩方面的,首先,它很難;再者,失敗的後果很悲慘。

對我來說,或許這意味者程式碼應該在較高等級的抽象中,而我們無法在 Java 中做到這一點。

《超越 Java》(Beyond Java),Bruce Tate,O'Reilly出版

我不算聰明的開發者,但十幾年基本功練下來,功底還算紥實。OOP, ORM, Design pattern 這些概念都懂。Web 架構更是熟悉。儘管如此,當我試圖使用 Spring, Hibernate 等框架時,我完全無法理解為什麼 Java 語言可以把一件簡單的事搞成這麼複雜。這件事促成我寫出《不同程式語言的中介編程與反射能力系列文章》。

...繼續閱讀

Ruby的中介編程與反射能力示範

在系列文章的前幾篇,我已經說明了 JavaScript 與 PHP 中介編程與反射能力的方式。 本文則就同樣的需求功能,示範 Ruby 的實作方式。

本文所示範的輸出結果,與 JavaScript的中介編程與反射能力示範 PHP的中介編程與反射能力示範 相同。 該做什麼,前文都提過了,此處不再重談。

...繼續閱讀