• 沒有找到結果。

第三章 系統分析與設計

第三節 人力資源管理平台設計

隨著 Internet 的普及和快速的發展,傳統的靜態 Web 內容已不敷使用,使用 Web server 端的 Script 語言結合資料庫建立互動式的 Web service 已經成為主流。

而在開放原始碼〈Open Source〉的資源之中,也有相對應的解決方案:LAMP。

LAMP 是 Linux、Apache、MySQL、PHP/Perl/Python 的合稱,LAMP 系統無論是效 能、穩定性都相當不錯,和 .NET 或 Java 平台並駕齊驅,相當受到歡迎。關於 Web server 端的 Script 語言,不論 PHP、Perl、Python 都有其支持者。而使用 PHP 開發的 Project 數量相當多,也有些知名常見的大型專案,如 WordPress〈Blog 軟 體〉、Joomla!〈Content Management System,Mambo 的分支〉、phpBB〈Bulletin Board〉、 MediaWiki〈Wikipedia 開發並使用的 wiki 軟體〉等等,基於免費開放的前提下,

本研究也將以 LAMP 作為系統發展的骨幹。

在開始設計此一人力資源管理系統之前,先將傳統的系統開發模式與本研究 所將採用的 MVC 系統開發模式做一個完整的比較分析。

一、一個典型的 PHP 程式架構

如下圖所示,典型的 PHP 程式碼全部混合集中在一個實體的程式碼之中,

換言之,當它儲存在硬碟的時候,僅僅就是 Script 一個檔案而已,架構上看起來 好像很簡單,但是在實務上這將使得將來在維護及除錯的時候難度提高了很多,

因為這個檔案是涵蓋了所有的功能,包括:

〈一〉從 URL 或者一個 LINK 接受 Client 端的指令後加以運算。

〈二〉將運算後的結果直接送往資料庫,並向資料庫提出請求〈Request〉。

〈三〉接收資料庫為傳的資料,再度加以運算。

〈四〉再將運算後的結果直接送往使用者的瀏覽器。

圖 3-3-1 典型的 PHP 程式架構運作流程圖

資料來源:Beginning Cakephp From Novice To Professional, David Golding, 2008.

程式設計者為了方便起見,甚至可以用 include()的方式將其他人的檔案包含 在自己所設計的程式碼之中,以省去撰寫程式的辛勞,這樣是的程式出錯的機率 又更高了。在一個最為複雜的 PHP 程式碼之中,其程式碼中的變數 〈variables〉

可以在任何地方被呼叫而來修改它的值與設定,雖然在撰寫程式的時候很自由,

可以隨心所欲的任意修改,可是程式一旦出了錯想要除錯時,就得花費更大的心 力來找出這個錯誤,這在系統的開發上是非常不利的,系統開發者切勿因自由和 犧牲了穩定性。另一個缺點則是,相同的程式碼可能在不同的地方被重複的撰 寫,這也是傳統式寫法的一大隱憂,故本研究不採用此一原始的方式來建構系統。

二、一個 MVC 架構的 PHP 程式碼

圖 3-3-2 MVC 架構的 PHP 程式運作流程圖

資料來源:Beginning Cakephp From Novice To Professional, David Golding, 2008.

一個 MVC 架構的 PHP 程式碼改進了前一節程式的缺點,用一種有效率的技 術使得所有的物件〈objects〉在所有的程式碼中都可以使用,最主要的目的是確 定一件事情,確保所有的功能函式只會被撰寫一次,不會有重覆撰寫相同程式碼 的狀況發生。在 MVC 架構中有著一貫的命名方法、並且將檔案依不同的功能儲 存在固定的資料夾之中,如此便可以有效的將不同的資源整合在一起,甚至於不 用撰寫特別的程式碼一切由 MVC 架構來主導資源的整合,這對於需要團隊開發 的系統特別有用,團隊成員將會很容易的找到自己所需要的資源,因而變得默契 十足,加快開發的進度。

雖然不同的 MVC 架構有著不同的行為模式,但一般來講還是會按照下列幾 項特點來做出表現:

〈一〉、當使用者以 URL 或者一個 LINK 送出 Client 端的網頁後,按照一般 的慣例上一個典型的 URL 會以下列的結構出現,

http://{Domain}.com/{Application}/{Controller}/{Action}/{Parameter 1, etc.}。

〈二〉、就交給 Dispatcher 來解析 URL 的結構,並且決定由哪一個 Controller 來執行相關的功能及參數,當然 Dispatcher 也會將參數傳遞給 Controller。

〈三〉、在 Controller 裡面的功能函式〈Action〉除了接受傳進來的參數以外,

還會請 Model 向資料庫提出存取的要求,以配合參數來做運算。

〈四〉、Model 這是會按照 Controller 的要求項資料庫存取資料,並且將資料 庫中取出的資料按照指令作有系統的安排。

〈五〉、一旦 Model 完成了送資料給資料庫或是從資料庫中取出資料,此時 便會將輸出回傳給 Controller。

〈六〉、Controller 接受資料並作預算之後,再將其輸出送到 View。 代表資料庫中的資料表,在本研究中即為 CourseModel、TeaecherModel、

StudentModel、CommentModel 等四大Model,其Model的名稱必須為英文而 且是單數的形式,這才能符合 Cakephp 之中 Model 命名慣例,如此

圖 3-3-3 Model子系統的設計

最底層的Model反映到系統實務上就是代表一個研習課程、一位研習課 程講師、一名研習課程學員及一個研習課程評論,他們分別一路向上繼承 AppModel、Model、Overloadable等物件,一直到最上層的Object物件。如此 的作法,可以使得自行設計的研習課程等物件擁有MVC開發架構所有已經 準備好的功能與屬性,無須要再度地耗費不必要的精力去重新發明輪胎。

除了這個優點以外,其中Overloadable物件亦允許在既有的基礎之上客製化 原有的功能,而不用去修改到MVC開發架構本身的原始程式碼,就能將原 本的功能修改成較為符合自己系統的需求。當然也可以創造新功能加諸於 其上,讓系統功能更臻完整。

Object

Overloadable

Model

AppModel

StudentModel TeacherModel

CommentModel CourseModel

〈二〉Controller子系統的設計

本研究中四個主要的Controller如下圖 3-3-4:

圖 3-3-4 Controller子系統的設計

Controller必須以英文的複數型態出現,同樣是Cakephp的命名慣例之 一,一旦遵循如此的命名規則,Cakephp便會自動找到相對應的以單數型態 命名的Model及其資料表。遵守Cakephp的命名規則可以享受到許多的好處,

系統開發時應當盡量利用這樣的機制,讓整個資訊系統在開發完成後擁有 一貫的風格,增加程式碼的可讀性,簡化將來維護的工作。除非是特殊情 況,才使用自訂的方式來命名,當然Cakephp也允許這麼做,不過這會增加 程式碼的複雜度,應該要盡力地去避免這樣的情形產生。

在CoursesController中撰寫控制Course Model〈研習課程項細資料〉的程 式碼,原則上本研究採用一個Model物件對應一個相同名稱的Controller,力 求程式碼的單純化與結構化。在TeachersController之中撰寫控制Teacher Model

CommentsController Object

Controller

AppController

StudentsController TeachersController

CoursesController

〈研習課程講師簡易資料表〉的程式碼,以此類推,將得到一個架構清晰而 完整的應用系統,而這也是Cakephp開發團隊所建議的風格。

在一個MVC架構的應用程式之中,所有的動作均由controller一手控制, 的外掛程式也應當擺放在Controller之中。

現在以本研究中的研習課程物件為例,在CoursesController之中設計了幾 項功能用來操作資料庫中研習課程相關的資料,在Cakephp中功能函式又稱為 Action,每一個Action就是用一個funtion( )來表示。當呼叫Action時候可以選擇 不傳入任何參數,也可以傳入一個以上的參數,就如同一般的PHP程式碼完 全由系統開發人員自行決定。

表 3-3-1 Controller子系統的設計 CoursesController中的功能列表 功 能 函 式 用 途

加上一些自己需要的程式邏輯,以符合本研究的系統需求。CoursesController 是針對研習課程的Course物件來設計,同樣的亦會針對講師的Teacher物件、

學員的Student物件及評論的Comment物件分別設計出適當的程式邏輯來操作 這些物件。

〈三〉View子系統的設計

在一個MVC架構的WEB應用程式系統裡面,View是代表著系統最終 的輸出,並且將結果顯示在使用者的瀏覽器上面,而每一個View都對應 到Controller裡有著相同名稱的function。如下表 3-3-2所示:

表 3-3-2 Controller與View之檔案對照表

Controller的功能函式 用 途 專屬的View檔案

function index() 列出所有研習課程項目 index.ctp

function view() 檢視單一研習課程的詳細資料 view.ctp

由上表 3-3-2可看出Controller中的function與View中的*.ctp輸出檔案 具有一對一的關係,如此的設計可使得研習課程明細資料表子系統以相

圖 3-3-5 View子系統的設計

在本研究與使用者互動的檔案〈*.ctp〉之中會使用到 HtmlHelper 來 產生 HTML 標籤語言,協助 HTML 程式碼的撰寫,可以簡化這一個單調 而容易令人感到反鎖的工作,雖然於系統開發時不是使用所見即所得

〈What You Is What You Get, WYSIWYG〉的程式編輯工具,但是透過 HtmlHelper 的協助也大幅提升了系統開發的效率。

再來可以用FormHelper來撰寫表單相關的元件,如radio按鈕、

checkbox按鈕、讓使用者輸入資料的欄位或是讓使用者可以選擇的清單

〈list〉。而TextHelper則用來簡化字串的處理程序,如高亮度顯示、自動 連結及特殊字元的去除單等功能,TextHelper都可以輕易地完成。

NumberHelper則可以為數字設定精確度、貨幣的形式或以百分比的方式 Object

Overloadable

Helper

AppHelper

NumberHelper HtmlHelper

TextHelper FormHelper

來顯示出數字,在系統開發的過程中節省了很多精力,再以下圖 3-3-6

Object

Overloadable

Helper

AppHelper

HtmlHelper FormHelper NumberHelper TextHelper 於 View 子系統

Model Controller

AppModel AppController

CourseModel TeacherModel StudentModel CommentModel 於 Model 子系統

CoursesController TeachersController StudentsControllerl CommentsController 於 Controller 子系統

資料夾,即可讓三個子系統之間彼此互相呼應串連,來形成本研究所設 計的人力資源管理平台。當然還有很多的Helper可以運用,就連時下最 風行的AJAX也有AjaxHelper可以使用來提高系統與使用者之間的互動 性,使WEB的應用程式就像桌面應用程式一般的得心應手,可以隨意的 Drag and Drop讓使用者能以更直覺的方式來使用本系統。

相關文件