程式碼產生器(code generator)顧名思義,便是一種用來產生程式碼的程式。在很多場合中,我們花了大量的時間,在撰寫一些形式重複的程式碼,不僅浪費時間、也浪費力氣。但是,如果仔細觀察,你會發現這些程式碼的撰寫其實都有共通的規則,而這些規則是可以歸納出來的──對我們來說,這正是好消息。

無法表達出規則的事物,難以用程式處理,但只要有規則可循.就有辦法運用程式來自動化完成。也就是說,只要找出或者定義出這類程式碼共通的規則,我們就可以撰寫專門的程式,並依照這些規則,來產生有著共通規則的程式碼。

找出重複程式撰寫程序之間的共通規則
舉個例來說,有一陣子,在我們的應用中會需要使用到DTO(Data Transfer Object),而這些DTO和資料庫中的表格是有對應的關係,也就是說,每一個資料庫表格,我們都希望透過一個DTO來表示,而且,這DTO必須像是一個JavaBean,所以,它會有一些getter/setter函式,將所對應的表格的資料欄(column),轉成JavaBean的屬性(property)。例如,我們可能有一個叫做User的資料表格,它有firstName、lastName、telephoneNo、address、birthday等資料欄位,欄位有些是字串型別、有些則是日期的型別。最初的時候,我們可能是用人工的方式來撰寫對應的DTO,所以這麼寫:


接著,針對每一個資料表,我們都會需要撰寫對應的DTO類別,然後再逐一針對其每個資料欄,也撰寫對應的getter/setter函式(像getFirstName()及setFirstName())。

其實,從上述來看,你會發現其中的規則十分簡單,撰寫起來當然沒有什麼難度。但是,如果一個系統需要動用到數十個,甚至上百個資料庫表格,那麼,就得利用人工,逐一查看資料表格的schema,看看每個表格究竟有那些資料欄,然後其型別又該對應到程式語言中的那些型別(例如上例中的birthday欄位在Java中是對應到java.util.Date型別),然後寫下每個DTO類別中的getter/setter函式。

這整個過程,因為都透過人工作業的方式進行,不僅繁瑣、耗費時間,甚至容易出錯。而且這一類的程式碼,因為沒有什麼獨特之處,程式設計者撰寫起來也覺得乏味,單純只是勞力罷了。

像上述的情境,就十分適合使用程式碼產生器來產生這一類的程式。我們可以怎麼解決這個問題呢?若使用Java,首先,我們可以撰寫程式(例如,利用JDBC的API)來取得資料庫中的表格、每個表格中有什麼資料欄、每個資料欄是什麼資料庫型別。在讀取到這些資料後,將資料庫型別自動的查表對應到Java中的型別後,便可以仿照上述程式碼中的形式,自動的輸出.java原始檔。

這只是一個很簡單的程式碼產生器,卻可以節省掉人工作業的繁瑣、花費的大量時間,也可以提高正確性,同時也不致於讓程式設計人員必須面對無聊的工作。這正是程式碼產生器的主要作用所在。

資料庫操作與UI對應免人工
其實在我們的開發生活中,也時常看到程式碼產生器的蹤影。很多報表程式,因為都具有共通的若干規則,所以也很容易利用程式碼產生器,允許透過設定的方式,直接將報表程式碼產生出來。而所謂資料庫操作的CRUD(Create、Read、Update、Delete)程式碼,以及對應的使用者操作介面(UI),因為具有單純的共通規則,但撰寫起來相當累,因此也是程式碼產生器主要的應用範圍。

此外,現在Web前端的應用程式開發已經成了重要的領域,而這些應用程式也大量使用JavaScript來撰寫。而其中,也有不少類型的程式碼,例如操作的選單,撰寫的規則都相似,但是寫起來又累,因此,使用程式碼產生器,透過設定一些參數(例如總共需要那些選項,字體的大小、顏色等等),便可以產生對應的JavaScript程式碼。

由此可見,只要程式碼撰寫規則明確,又需要大量人工介入的,就適合用程式碼產生器來自動產生。

為何開發工具可以做到所見即所得?
一些提供所見即所得的使用者介面設計工具,允許程式設計者透過所見即所得(what you see is what you get,WYSIWYG)的方式,利用拖拉元件的操作方式,便可以設計應用程式的UI。

這種設計方式可以說是軟體開發的革命性概念。有些支援上述概念的開發環境,在實作上,是將程式設計者在所見即所得的操作環境下所製作完成的使用者介面,產生某個中介的檔案(例如,可以利用XML格式的檔案來記錄),來記錄程式設計者所設計出來的使用者介面,包括使用了那些視覺元件,每個元件的尺寸大小、元件擺放的位置,以及元件所擺放的容器、事件處理函式、屬性值設定……等等。有了這中介的檔案之後,整合開發環境便可以基於這個中介檔的內容,產生出相對應的程式碼。

例如,中介檔內記錄了需要動用到的使用者介面元件,那麼便能以此,分別產生出建立這些元件的程式碼,然後再依據所記錄的尺寸、擺放位置,一一設定各個元件的尺寸及擺放的位置。當然,像事件處理函式的設定,也能依這中介檔來產生。

在上述例子中說明了,程式碼產生器除了協助程式設計者,處理一些枯燥乏味的煩人的重複性工作之外,也可以提供另一種更直覺產生程式碼的途徑。就像這個例子,透過所見即所得的視覺化操作環境,來設計應用程式的使用者介面,最終將設計出來的產生轉化產生出對應的程式碼。雖然,使用者也可以透過人工手寫的方式來寫下使用者介面的程式碼,但是,和所見即所得的視覺化操作方向相較起來,終究不那麼直覺。這也是程式碼產生器的另一個優點──用不同、但更直覺的方式來表現應用程式應具備的功能,接著再將其轉化成為對應的程式碼,大幅的簡化產生程式碼的過程。

在我們的日常開發生活中,時常都可以觀察到可以應用程式碼產生器的地方。俗語有云,程式設計者「要吃自己的狗食(dog food)」。倘若能查覺可以運用程式碼產生器來簡化日常開發工作、提升開發生產力的地方,程式設計者可以考慮自己開發專屬的程式碼產生器,來自動產生對應的程式碼。

作者簡介


Advertisement

更多 iThome相關內容