在前面的博客中,已了解了前端控制器,頁面控制器,應用控制器這三種表現層模式,如果說它們精心安排了外部世界與系統內部的通信,那麼業務邏輯層的工作則是處理應用程式的業務部分。業務邏輯層應遠離那些外部的「噪音」。業務邏輯是整個應用程式的根本目的所在,系統的其它部分都是為這部分服務的。
這裡介紹兩種經常使用的領域邏輯模式:事務腳本模式和領域模型模式。
一、事務腳本
1.1 概念
Transaction Script:使用過程來組織業務邏輯,每個過程處理來自表現層的單一請求。貌似有點太抽象了。大多數業務應用程式都可以被視為一系列事務,有時候,事務可能就顯示下資料庫的信息,有時候,也可能涉及許多校驗和計算的步驟。事務腳本則將所有這些邏輯組織成單一過程,而且每個事務都有自己的事務腳本,就是都有自己的執行過程,但注意的是事務間的公共子任務可以被分解成多個子程序。
1.2 為什麼要使用事務腳本
事務腳本模式的好處在於你可以很快就得到想要的結果。每個腳本都能很好地處理輸入的資料並操作資料庫來保證得到想要的結果。因此它是一個快速而有效的機制,且不需要投入大量時間和精力在複雜的設計上,對於小型且工期較緊的專案再適合不過。
1.3 實現事務腳本
具我工作經驗觀察,許多程式設計師都渾然不知地在使用這種模式,包括本人以前。
現在假設有發表博客和刪除博客的業務,那將這兩個業務分別看成兩個事務腳本。
Php代碼
-
//這裡創建一個基類,做資料處理,假設用的是pdo
- function __construct( ) {
//這裡花了到之前- 部落格講的$dsn = woobaseApplication
Registry::getDSN( ); - if
- throw new wooAppException( "No wooApp
Exception- ( "No DSN " ); }
- new PDO( $dsn ); self::$DB-> (PDO::ATTR_ERRMODE, PDO::ERRMODE_
Exception- );
- } function
doStatement() { - /執行sql }
- }
-
static- $add_blog =
"INSERT INTO blog ( name values( ? - ; static
$del_blog- = "DELETE FROM
- //新增部落格事務腳本
- function
- function function addBlog(...) {
- //處理參數,以拼字add_blog格式的sql,呼叫父類doStatement執行,通知好友,一連串的子程式。 。 。 }
- function delBlog(...) {
-
格式的sql,呼叫父類別doStatement執行。
-
} }
- ?> 腳本的優勢之處。如果寫一個較為複雜應用程序,這種方式使專案不太容易擴展,因為事務腳本總是不可避免地互相滲入,從而導致程式碼重複。
二、領域模型-
2.1 概念Domain Model:很難用語言說清楚。簡單的說就是領域模型象徵真實世界裡專案中的各個參與者。 「萬物皆
對象- 」的原則在此體現得淋漓盡致。在其他地方物件總是帶著種種具體的責任,而在領域模式中,它們常常被描述為一組屬性及附加的代理。它們是做某些事的某些事。
- 2.2 為什麼要使用領域模型現實程式碼中,會有很多事務腳本模式的身影,會發現重複程式碼是個普遍問題。當不同的事務要執行相同的任務時,重複看起來像是最快的解決辦法,但這大大增加了程式碼維護的成本。有時也可以透過重構來解決,但慢慢地複製貼上可能成了開發中難以避免的一部分。
2.3 實作領域模型
為實現對比,引用事務模型的例子,並將領域模型類別直接對應到關聯式資料庫的表格(這樣做會讓開發變得簡單)
Php程式碼
🎜🎜Php程式碼 🎜🎜🎜🎜🎜Php程式碼 🎜🎜🎜🎜🎜Php程式碼 🎜🎜🎜
-
//這裡創建一個基類,做資料處理,假設用的是pdo
- function __construct( ) {
//這裡使用前- 部落格講的登錄 baseApplicationRegistry::getDSN( );
-
if ( is_null(
$dsn- ) ) { "No DSN" );
-
} :: $DB = new PDO(
$dsn- ); MODE_Exception); }
-
-
protected- function sql }
-
} extends Base{
-
function- addBlog(...){}
- //創建一個領域模型的基底類別 abstract
- class DomainObject {
- private
-
function- __construct( $id=null ) {
-
$this->id = $id;
-
function getId( ) {
-
>id;
-
}
-
- static function getCollection( $type
) { - /取得要操作的物件
- } DomainObject {
-
private $name;
- $feed;
-
function- =$m5(.
- $this->name = $name ;
-
$this->feed = self::getCollection("\woo ent::__construct( $id
); }-
- function addBlog(...){
- //再叫feed寄通知給好友
- }
- function setFeed( FeedCollection $this
->feed = - $Feed; }
- } ?>
2.4 小結- 領域模型設計簡單還是複雜取決於商業邏輯的複雜度。使用領域模型的好處是:當你設計模型時可以專注於系統要解決的問題,而其他的問題(如持久化和表現等)可以由其他層來解決。
在實作專案中,大多數程式設計師在設計領域模型時還是把一半的注意力放在資料庫上。將領域模型和資料層分開會導致一定的代價,你也可能會將資料庫程式碼直接放入模型中(儘管你可能會使用一個資料入口來處理實際的SQL)。對於相對簡單的模型,特別當類別與資料表一一對應時,這樣方法是完全可行的,可以減少因協調- 物件和資料庫而創建外部系統導致的時候消耗。
以上就介紹了商業邏輯層之事務腳本與領域模型,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 -