嘗試使用 Java 的 reflection 重構指派資料欄位值的程式碼
如果你熟悉動態語言,你大概會嘗試使用 Java 的反射(reflection)來重構程式碼。我個人提供一個重構經驗,告訴你使用 Java 的反射時,你可能會感到失望。
這是一段透過 Hibernate 進行的資料更新動作。我從使用者端取得要更新的資料項,接著先向 Hibernate 查詢要更新的資料項目是否存在,存在的話再把新的資料內容更新進去。
如果你熟悉動態語言,你大概會嘗試使用 Java 的反射(reflection)來重構程式碼。我個人提供一個重構經驗,告訴你使用 Java 的反射時,你可能會感到失望。
這是一段透過 Hibernate 進行的資料更新動作。我從使用者端取得要更新的資料項,接著先向 Hibernate 查詢要更新的資料項目是否存在,存在的話再把新的資料內容更新進去。
PHP 5.3 新增特性列表與本部落格的系列文章:
關於 Closures (匿名函數), Const, Nowdoc 等新功能,將於本文中說明。
Namespace 是 PHP5.3 面向大型專案開發所新增的一項重要功能。並不是說有了 Namespace 就萬事大吉,但至少在結合來自各路好漢的函數庫與功能框架時,不必太擔心名稱衝突的問題了。
PHP 以 namespace 關鍵字指示名稱空間,此指令兼具定義與切換空間的意義。名稱空間的命令方式與一般符號相同,並以 \
(斜線) 作為名稱空間(namespace)的分節符號。它借用檔案系統的目錄樹觀念劃分常數(const)、函數(function)與類別(class)等定義的存在空間 (注意,名稱空間並不支援變數。所有的變數都存在於同一個空間)。
There are two new magic methods, __callStatic and __invoke.
PHP5.3 起新增了魔術方法 __invoke()。
簡單說,就是 C++/C# 中的 operator()
運算子重載。
還新增了魔術方法 __callStatic(),專門負責調用靜態方法。
PHP5.3/6.0 新增延後靜態繫結(late static bindings)功能。 此功能由關鍵字 static 實現,係對照 self 之功能而出現。
self 關鍵字採用儘早靜態繫結策略,PHP 在解譯語法時,就直接將 self
繫結到它所在的類別。static 關鍵字採用延後靜態繫結(late static bindings)策略,要等到執行到那一段敘述時, PHP 才會根據調用者所屬類別來設定 static
所代表的類別。
公司這個月開始一件專案,我分配到用 Java 開發 web service 那一塊。 於是我親身體驗到一本書說的故事。
找一個很聰明,但是沒有 Java 經驗的開發者,讓他去學學 Java web 企業應用的那一堆技術,然後再問問他的想法。問題是兩方面的,首先,它很難;再者,失敗的後果很悲慘。
對我來說,或許這意味者程式碼應該在較高等級的抽象中,而我們無法在 Java 中做到這一點。
《超越 Java》(Beyond Java),Bruce Tate,O'Reilly出版
我不算聰明的開發者,但十幾年基本功練下來,功底還算紥實。OOP, ORM, Design pattern 這些概念都懂。Web 架構更是熟悉。儘管如此,當我試圖使用 Spring, Hibernate 等框架時,我完全無法理解為什麼 Java 語言可以把一件簡單的事搞成這麼複雜。這件事促成我寫出《不同程式語言的中介編程與反射能力系列文章》。
在系列文章的前幾篇,我已經說明了 JavaScript 與 PHP 中介編程與反射能力的方式。 本文則就同樣的需求功能,示範 Ruby 的實作方式。
本文所示範的輸出結果,與 JavaScript的中介編程與反射能力示範 、 PHP的中介編程與反射能力示範 相同。 該做什麼,前文都提過了,此處不再重談。
我來說個關於函數指標(在 C 語言中,function 就是一個 function pointer)與函數個體(function object)的小故事。這個故事還有一個 Java 版的,在本文的最後一節。只對 Java 語言有興趣的,可以先看後面的 Java 版,再回頭看前面。
有一天,"偉大的"架構設計師交代甲和乙兩位程序員共同負責撰寫一個小程式。這個程式配置了兩個陣列,一個是傳統的整數陣列,一個是整數vector
。這個程式要將這兩個陣列的內容傾印出來。
工商服務時間。PHP程序員學了Ruby語言後,如果想開始動手寫程式,很快就會發現許多在PHP用慣了的函數,在 Ruby 中並沒有同名的函數。然後初學Ruby的滿腔熱血,就在翻找 Ruby 手冊的過程中降溫。這實在是令人遺憾的事。如何避免這種事情發生呢?
就讓我來介紹一個很好的參考網站,那就是「Rails for PHP Developers」。幾乎八成常用的PHP函數,都可以在那找到對應的Ruby API。你只要在該網站的搜尋欄中輸入你想查的 PHP 函數名稱,若該網站有整理,它就會告訴你這個 PHP 函數對應的 Ruby API 是什麼,還附帶程式範例。如下圖所示。
我前陣子將我以前寫的一些PHP工具程式用Ruby改寫時,靠這個網站省下許多翻手冊的時間。我相信有了它之後,PHP程序員開始寫Ruby程式時,會感到相當愉快。
PS. 我仍然很喜歡PHP。只是身為一個程序員,擁抱三四種程式語言是很正常也很合理的。
我在試探不同程式語言的中介編程與反射能力系列文章的第三篇PHP的中介編程與反射能力示範中提到 JavaScript 也可以透過 prototype 的操作實現直接擴充類別定義的能力,這種能力在 Ruby 中稱為 open class。本文是為了示範 JavaScript 此能力所做的補充。
本文是我試探不同程式語言的中介編程與反射能力系列文章中的第二部份,關於 PHP 的內容。 基本上,我指的是 PHP5 。
PHP 雖然被認為是動態語言,但語法上卻又具有許多靜態語言的性質,這使得它被認為「不那麼動態」。 尤其它在引入 OOP 能力時,學了不少 Java 語言的方式,因此限制了 PHP 的表達能力。 例如 PHP 也將型別分成原始型別(primitive types)與個體型別,套用 Java 的 class 與 interface 語法, 功能相似的反射類別等等。儘管如此,PHP 還是具有一些 Java 語言沒有的能力,故能達到比 Java 語言更高的靈活度。所以在實作本文所需範例時,仍比 Java 語言簡單。
網友 WanCW 在 JavaScript的中介編程與反射能力示範 一文中回應 文章中的 foreach() 並未產生新的程式或是修改現有的程式,好像不太能算是 metaprogramming?
並非如此,其實 foreach 在中介編程(metaprogramming)的領域是經典樣式。只是我上文的例子太精簡,以至於看不出它的威力。嗯,如果不來個複雜點的程式碼,確實不容易看出 foreach 到底可以幫我們省下多少程式碼。我就來個複雜點的示範吧。
基於某些原因,我這幾天嘗試分別以 JavaScript, PHP, Ruby (排名按字母順序) 實現同一個簡單的功能,這個功能用了簡單的反射與中介編程技巧。 主要目的是看這些語言在動態型別、中介編程、迭代與反射語法方面的表現。 最後,我會用 Java 語言來實現這個需求,「展現Java語言的特點」。
這篇構想中的文章,愈寫愈長。我想了想,還是按程式語言拆成幾篇,先把要示範的源碼與說明發佈上來。 這是第一篇發佈的,內容是 JavaScript 的實作,示範了兩個基本的中介編程技巧: foreach 和 accessor。
大家好,我又來談 REST 了。雖然我早已在過去的實務工作中採用 RESTful 概念,但似乎在國內大多數人眼中, RESTful 還是個陌生的內容。因為我新任職的公司,才剛在專案中採用 RESTful 工作,還要大家去 survey 一下。也就在這過程中,我才發覺大伙兒對 RESTful 的認知還有不少偏差。最主要的一點還是把過去的 REST 作法混進來了。忽略了 RESTful 字尾的 -ful 所代表的意義。
雖然我一年多前在 REST and RESTful web service 就提過 RESTful 的內容了,不過當時主要放在 REST 和 RESTful 的差異上,假設讀者已經很熟悉 Web 架構與設計模式了。在當時的文章最後,附上的範例程式也僅僅是示範如何把舊的 REST 程式重構支援 RESTful 。沒有示範 RESTful 到底如何與客戶端互動。這篇文章就是在填這個坑。
我用 VirtualBox 安裝 Ubuntu 作為 Guest OS 時,使用客端額外功能 (Guest Additionals) 碰到了一些狀況,留個解決方法的筆記。
軟體版本:
另外,我透過 VirtualBox 使用介面的 [裝置] => [安裝額外功能] 下載客端額外功能的 ISO 檔時總是失敗。 我建議用支援續傳的下載軟體,例如 wget 或 flashget ,直接到 VirtualBox 官方網站下載。 下載網址是: http://download.virtualbox.org/virtualbox/ 。 按 VirtualBox 的版本,到符合的目錄下找 VBoxGuestAdditions_?.?.?.iso ,例如我用的是 2.14 版,那就找 VBoxGuestAdditions_2.1.4.iso。 目錄下也有使用手冊(UserManual.pdf),有興趣多了解的可順便下載。
OpenID 是一種去中心化的身份認證系統,建置簡便,甚至不需要一個帳號管理中心伺服器。 在 OpenID 中的使用案例中,參與者分成三種,即:
關於 Google MapReduce, Apache Hadoop 分散式文件系統的簡述。
MapReduce 的概念源自於並行運算的領域中很普遍的資料處理策略。 Map 在 MapReduce 中的詞性是一個動詞,取其 “劃分地圖“之義。 它的內涵是將一整塊資料儘可能按照不相關聯的地方劃分成好幾片。就好像是在一張大地圖中劃分區域分界線般,故稱此動作為 Map。
被 Map 成好幾片的資料,分別被儲存在不同的 host 中。當使用者需要處理該份資料時, 再將運算程序再複製到那些 host 上,開始處理那些資料。最後將散佈在不同 host 上 的程序所運算的結果化簡歸納成使用者要的最終結果,就是 Reduce。
將 MapReduce 結合分散式文件系統後,就是 Google 得以高效率處理網頁文件搜尋的核心系統。
全文基於雲端運算的服務內容,常以 Web Service 的方式供應。Single Sign-on 則是為了 節省使用者在不同的 Web 服務之間重複進行帳號登入動作的時間。