最近更新: 2007-04-16

Delphi for PHP is Not on Rails

Tags: php ruby framework webdev 標籤語言

If today, the tool which CodeGear released is "Delphi for Ruby", the title will be an equivoque.

CodeGear (前身 Borland 公司 IDE 部門) 日前發表了 Delphi for PHP 。於是我很快的觀看了一遍操作 Demo 。很遺憾,我必須說它並未發揮 PHP 的特色,程式碼寫作方式充滿了 Java/C# 風格,而不是 PHP 風格。

首先看看其 Demo 中的範例程式碼 (節錄主程式部份)。

unit1.php © CodeGear
<?php
class Unit1 extends Page {
    public $ListBox1 = null;
    public $Button1 = null;
    public $Edit1 = null;

    public function Button1($sender, $params) {
        $this->ListBox1->Items[] = $this->Edit1->Text;
    }
}

global $application;
global $Unit1;
$Unit1 = new Unit1($application);
$Unit1->loadResource(__FILE__);
$Unit1->show();
?>

Delphi for PHP 所展示的框架概念,通常稱為 event-driven and component-based framework。Visual Studio 等視覺化IDE 環境所採用的開發框架也是這一類。如果不是變數名稱前面加了個 $ ,乍看之下會誤以為是 C#/ASP.Net 。一個熟悉 Delphi 或 Visual Studio 等工具的程序員應該會覺得很親切,親切到不覺得有何不妥。

但是,對於我這種不使用 IDE 工具,又在 Web programming 領域打滾許久的程序員而言,一眼可以看出這種設計方式非常不敏捷,與引領目前 Web 開發趨勢的 Ruby on Rails 框架概念相違背。而 Ruby on Rails 的框架概念早已深深影嚮了目前 PHP 框架開發的趨勢,如 CakePHP, Code Igniter, PHP on Trax 等框架皆引入了 Ruby on Rails 的概念 (Framework of PHP5)。

當我看到 Delphi for PHP 展示的程式碼時,我當下反應「為什麼我寫程式時要知道那裡有一個 button?」。一個熟悉 JSP/ASP.Net 等開發工具的程序員也許反應不過來,但了解 MVC 概念並使用過類似 Ruby on Rails 框架的 Agile programmer 應該已經知道我要講什麼了。

在我說明之前,請先觀看一段基於 Code Igniter 框架的 Demo 程式。Code Igniter 是基於 MVC 概念並引入 Ruby on Rails 概念的 PHP 開發框架。

Blog.php © Code Igniter
<?php
class Blog extends Controller {
    function __construct() {
        parent::Controler();
    }
    function index() {
        $data['title'] = 'My Blog Title';
        $data['query'] = $this->db->get('entries');
        $this->load->view('blog_view', $data);
    }
    function comments() {
        $data['title'] = 'My Comment';
        $data['query'] = $this->db->get('comments');
        $this->load->view('comment_view', $data);
    }
    function comment_insert() {
        echo 'testing...';
    }
}
?>

這種框架主要透過 http://your_server/controller_class/method/arguments 這樣的 URL 形式,調用對應的 method of controller class 以及 view 。不妨就稱為 Method-driven framework ,以對應於 Event-driven framework

在 Method-driven framework 中,我們將程式視為一個個等待使用者調用的服務,使用者只需透過基於 WS 或 REST (WS: Web Service; REST: Representational State Transfer) 之 URL 即可調用 。在這類框架中,程序員在撰寫時根本不考慮使用者介面的內容,當然更不必知道那裡有一個 button

Is there a button, or any UI component else? I Don't Need To Know!

我甚至不用修改任何應用程式碼,只需替換一下 loader ,令原本的 URL call ,在命令列下變成 controller_class method arguments ... 之形式,就可以把一個 Web 服務變成一個 Command line tool 。

對程序員 (application programmer) 而言, Event-driven framework 令視覺元件侵入程式碼。修改 UI 之任何動作皆意味著程式碼之修改。於是要加一個 button 就要加一段 public $Button2=null; public function Button2(){} ,加一個 link 就要加一段 public $Link1=null; public function Link(){}。當程序員處於 IDE 環境之下時, IDE 工具在大多數時候會幫程序員處理這些內容。一但程序員脫離 IDE 環境,或是進行某些 IDE 工具未能掌握的編輯行為時,要修改這些程式碼就變成一個重覆性的作業。這自然不夠敏捷。

對網頁設計員 (Page designer; 或者稱之為 Markup language designer ,See also: Markup language 對應用軟體設計工作的影嚮) 而言,Method-driven framework 亦較 Event-driven framework 敏捷。在 Method-driven framework 之下,網頁設計員要添加一個視覺元件時,不必修改任何程式碼、不必知會程序人員、甚至不必使用奇怪的標籤 (如 <asp>, <jsp> 等等,See also: PHP 不需要另一個樣版引擎, part 2)。網頁設計員只需要操作他們熟悉的編輯器,使用著編輯器所能理解的標籤。網頁設計員可以自由添加、移除任何視覺元件。他們所需要做的只是:增加一個 button 標籤、一個 link 標籤或任何視覺元件標籤,叫出標籤屬性編輯頁面,然後將要調用的服務之 WS/REST URL 輕巧地填入 URL 欄位即可。

在 Delphi for PHP (或是 ASP.Net, JSP) 所展示的設計方式之下,網頁設計員和程序員之間的作業隔離性不足,將為了修改一部份的內容而疲於溝通及互相等待。

雖然 CodeGear 將 Delphi for PHP 視為邁向動態語言族群的重要一步,然而我卻未看到它吸納動態語言的敏捷優點。它要吸引 PHP 族群尚且不足,若繼續以此模式推出 Delphi for Ruby ,那麼就真的會出現 "Delphi for Ruby is Not on Rails" 的文章了。

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/3016263.html

樂多舊回應
Kuon@chroot.org(Kuon) (#comment-9555429)
Tue, 24 Apr 2007 02:30:18 +0800
是的, 我同意您從MVC/Method-driven 的觀點, 指出了 Delphi for PHP 既不夠敏捷, 與UI的耦合性也過高.
是故, VCL-based 的 RAD 同時是此 framework優勢也是包袱.
或者該說不是它不好, 而是它不合Rails潮流.
不過現有的VCL族群倒是可以快速入手, 而不用學習新的開發方法. 當然, 會不會失去競爭力那又是另外一回事了.
未留名 (#comment-9601943)
Tue, 24 Apr 2007 14:49:36 +0800
確實,無論怎麼看,Delphi for PHP 都是面向原有 VCL 族群使用者的,對 PHP 族群使用者的吸引力不足。

另一方面,從 TIOBE 對程式語言所做的排名來看(See TIOBE Programming Community Index), PHP 的使用率是 Delphi 的三倍以上。一個小族群想吸收大族群的使用者,卻又未端出具有大族群精髓的菜色。這算盤不知是如何打的?

或許當 Delphi 固守原有框架而未能從 PHP/Ruby 之優點取經時,就已失去競爭力了吧。
未留名 (#comment-14348733)
Thu, 30 Aug 2007 17:46:37 +0800
光看取名就知道 是用來吸引原來Delphi user
未留名 (#comment-14348735)
Thu, 30 Aug 2007 17:46:40 +0800
光看取名就知道 是用來吸引原來Delphi user
未留名 (#comment-14524593)
Fri, 21 Sep 2007 11:03:27 +0800
try smarty in Delphi for php~