遞迴與Smalltalk式介詞應用

前陣子用 Ruby 寫一個文件區塊的格式化工具,它會先載入整個文件區塊到陣列,然後依序將每個段落交給不同的方法處理。 被調用的方法,會從陣列中取出它要處理的段落,直到段落結束。 因為處理過的段落內容已經從陣列中取出,所以下一個方法總是從陣列的開頭繼續處理。

我先用 Ruby 寫幾個小程式來演練概念,寫著寫著就玩起來了。 一共寫了三種作法,分別應用了不同的 Ruby 語法。

  1. 平行指派,後綴式迴圈、無遞迴
  2. 遞迴式
  3. 遞迴式,Smalltalk 式介詞應用,加上迭代器

Java Enum 範例 - enum HttpStatusCode

HTTP 協定規範了 HTTP Status Code,這個狀態碼本身就包含了兩種表達形式,即三位數字的狀態碼,與文字訊息的狀態訊息。

加上 Enum 的定義後,在 Java 語言內就可以用三種表達形式,例如: 200, "Ok", HttpStatusCode.Ok。這實在是用來展示 Enum 用法的絕佳範例。

Java Enum and Generic

Enum(列舉) 在 C 語言時代就是賦予常數值可讀意義的簡便方法。 C# 也是一開始就提供 Enum 型別。 Java 則遲到 5.0 才提供。不過遲來總比不來好。

本文是 Java 語言的 Enum (列舉)型別與 Generic (泛型) 能力共同運作的筆記。 Java 的列舉型別是一種特殊型別,當我們要在列舉型別的場合中加上泛型能力時,需要運用一些不同的處理手段。我們也需要用到 Reflection (反射)。

與 metavige 和 alexchen 對話 Java 語言

所以當然這個 Java 老語言來說,自然沒得比了~

目前的開發方式或者是環境變遷,強調的是快速開發,以往那種慢工出細活的方式已經有點不合時宜了

metavige

有趣的是,Java一點都不老。我在 從中介編程與反射能力來談 Java 語言 列出十年世代的程式語言列表,Java 名列其中。它比Python 年輕3歲,跟Ruby, PHP, JavaScript 同年發佈。單純看語言的特性,Smalltalk這個40歲的程式語言都比 Java 靈活,這才是 Java 令我們老輩程序員驚奇的事。

從 C++ Template 到 Java Generic,一步一步來

Java 實作了泛型(generic)機制以實現 C++ 樣板(template) 的一部份能力,兩者的語法乍看之下也有些相似。 雖然我覺得 C++ 樣板很難搞,而且兩者的語法有點像,但是相較於完全陌生的 Java 泛型,我用起 C++ 樣板來還是比較熟練的。很自然的,當我試圖要用 Java 的泛型重構程式碼時,我會先從 C++ 樣板的觀點來思考。

我將日前工作中碰到的一段我想用泛型重構的程式碼,取其大綱出來練習。本文紀錄了大致的改寫過程。

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

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

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

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 等新功能,將於本文中說明。

PHP 5.3/6 新增功能 - Namespace

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

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

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 所代表的類別。

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

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

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

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

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

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

擁抱變化,從函數指標到函數個體

我來說個關於函數指標(在 C 語言中,function 就是一個 function pointer)與函數個體(function object)的小故事。這個故事還有一個 Java 版的,在本文的最後一節。只對 Java 語言有興趣的,可以先看後面的 Java 版,再回頭看前面。

有一天,"偉大的"架構設計師交代甲和乙兩位程序員共同負責撰寫一個小程式。這個程式配置了兩個陣列,一個是傳統的整數陣列,一個是整數vector。這個程式要將這兩個陣列的內容傾印出來。

PHP程序員開始寫Ruby程式的函數參考網站

工商服務時間。PHP程序員學了Ruby語言後,如果想開始動手寫程式,很快就會發現許多在PHP用慣了的函數,在 Ruby 中並沒有同名的函數。然後初學Ruby的滿腔熱血,就在翻找 Ruby 手冊的過程中降溫。這實在是令人遺憾的事。如何避免這種事情發生呢?

就讓我來介紹一個很好的參考網站,那就是「Rails for PHP Developers」。幾乎八成常用的PHP函數,都可以在那找到對應的Ruby API。你只要在該網站的搜尋欄中輸入你想查的 PHP 函數名稱,若該網站有整理,它就會告訴你這個 PHP 函數對應的 Ruby API 是什麼,還附帶程式範例。如下圖所示。

rails for php developers sample

我前陣子將我以前寫的一些PHP工具程式用Ruby改寫時,靠這個網站省下許多翻手冊的時間。我相信有了它之後,PHP程序員開始寫Ruby程式時,會感到相當愉快。

PS. 我仍然很喜歡PHP。只是身為一個程序員,擁抱三四種程式語言是很正常也很合理的。

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

本文是我試探不同程式語言的中介編程與反射能力系列文章中的第二部份,關於 PHP 的內容。 基本上,我指的是 PHP5 。

PHP 雖然被認為是動態語言,但語法上卻又具有許多靜態語言的性質,這使得它被認為「不那麼動態」。 尤其它在引入 OOP 能力時,學了不少 Java 語言的方式,因此限制了 PHP 的表達能力。 例如 PHP 也將型別分成原始型別(primitive types)與個體型別,套用 Java 的 class 與 interface 語法, 功能相似的反射類別等等。儘管如此,PHP 還是具有一些 Java 語言沒有的能力,故能達到比 Java 語言更高的靈活度。所以在實作本文所需範例時,仍比 Java 語言簡單。