資料來源架構模式的活動記錄

來源:互聯網
上載者:User
關鍵字 資料來源架構模式的活動記錄

【活動記錄的意圖】

一個對象,它封裝資料表或視圖中某一行,封裝資料庫訪問,並在這些資料上增加了領域邏輯。

【活動記錄的適用情境】

適用於不太複雜的領域邏輯,如CRUD操作等。

【活動記錄的運行機制】

對象既有資料又有行為。其使用最直接的方法,將資料訪問邏輯置於領域對象中。

活動記錄的本質是一個領域模型,這個領域模型中的類和基資料庫中的記錄結構應該完全符合,類的每個域對應表的每一列。

一般來說,活動記錄包括如下一些方法:

1、由資料行構造一個活動記錄執行個體;

2、為將來對錶的插入構造一個新的執行個體;

3、用靜態尋找方法來封裝常用的SQL查詢和返回活動記錄;

4、更新資料庫並將活動記錄中的資料插入資料庫;

5、擷取或設定域;

6、實現部分商務邏輯。

【活動記錄的優點和缺點】

優點:

1、簡單,容易建立並且容易理解。

2、在使用事務指令碼時,減少代碼複製。

3、可以在改變資料庫結構時不改變領域邏輯。

4、基於單個活動記錄的派生和測實驗證會很有效。

缺點:

1、沒有隱藏關聯式資料庫的存在。

2、僅當活動記錄對象和資料庫中表直接對應時,活動記錄才會有效。

3、要求對象的設計和資料庫的設計緊耦合,這使得項目中的進一步重構很困難

【活動記錄與其它模式】

資料來源架構模式之行資料入口:活動記錄與行資料入口十分類似。二者的主要差別是行資料入口 僅有資料庫訪問而活動記錄既有資料來源邏輯又有領域邏輯。

【活動記錄的PHP樣本】

 
  1. /**
  2. * 公司專屬應用程式架構 資料來源架構模式之活動記錄 2010-10-17 sz
  3. * @author phppan.p#gmail.com http://www.phppan.com
  4. * 哥學社成員(http://www.blog-brother.com/)
  5. * @package architecture
  6. */
  7. /**
  8. * 定單類
  9. */
  10. class Order {
  11.   /**
  12.    * 定單ID
  13.    * @var
  14.    */
  15.   private $_order_id;
  16.   /**
  17.    * 客戶ID
  18.    * @var
  19.    */
  20.   private $_customer_id;
  21.   /**
  22.    * 定單金額
  23.    * @var
  24.    */
  25.   private $_amount;
  26.   public function __construct($order_id, $customer_id, $amount) {
  27.     $this->_order_id = $order_id;
  28.     $this->_customer_id = $customer_id;
  29.     $this->_amount = $amount;
  30.   }
  31.   /**
  32.    * 執行個體的刪除操作
  33.    */
  34.   public function delete() {
  35.     $sql = "DELETE FROM Order SET WHERE order_id = " . $this->_order_id . " AND customer_id = " . $this->_customer_id;
  36.     return DB::query($sql);
  37.   }
  38.   /**
  39.    * 執行個體的更新操作
  40.    */
  41.   public function update() {
  42.   }
  43.   /**
  44.    * 插入操作
  45.    */
  46.   public function insert() {
  47.   }
  48.   public static function load($rs) {
  49.     return new Order($rs['order_id'] ? $rs['order_id'] : NULL, $rs['customer_id'], $rs['amount'] ? $rs['amount'] : 0);
  50.   }
  51. }
  52. class Customer {
  53.   private $_name;
  54.   private $_customer_id;
  55.   public function __construct($customer_id, $name) {
  56.     $this->_customer_id = $customer_id;
  57.     $this->_name = $name;
  58.   }
  59.   /**
  60.    * 使用者刪除定單操作 此執行個體方法包含了商務邏輯
  61.    * 通過調用定單一實例實現
  62.    * 假設此處是對應的刪除操作(實際中可能是一種以某欄位來標記的假刪除操作)
  63.    */
  64.   public function deleteOrder($order_id) {
  65.     $order = Order::load(array('order_id' => $order_id, 'customer_id' => $this->_customer_id));
  66.     return $order->delete();
  67.   }
  68.   /**
  69.    * 執行個體的更新操作
  70.    */
  71.   public function update() {
  72.   }
  73.   /**
  74.    * 入口類自身擁有插入操作
  75.    */
  76.   public function insert() {
  77.   }
  78.   public static function load($rs) {
  79.     /* 此處可加上緩衝 */
  80.     return new Customer($rs['customer_id'] ? $rs['customer_id'] : NULL, $rs['name']);
  81.   }
  82.   /**
  83.    * 根據客戶ID 尋找
  84.    * @param integer $id  客戶ID
  85.    * @return Customer 客戶對象
  86.    */
  87.   public static function find($id) {
  88.     return CustomerFinder::find($id);
  89.   }
  90. }
  91. /**
  92. * 人員尋找類
  93. */
  94. class CustomerFinder {
  95.   public static function find($id) {
  96.     $sql = "SELECT * FROM person WHERE customer_id = " . $id;
  97.     $rs = DB::query($sql);
  98.     return Customer::load($rs);
  99.   }
  100. }
  101. class DB {
  102.   /**
  103.    * 這隻是一個執行SQL的示範方法
  104.    * @param string $sql  需要執行的SQL
  105.    */
  106.   public static function query($sql) {
  107.     echo "執行SQL: ", $sql, "
    ";
  108.      if (strpos($sql, 'SELECT') !== FALSE) { // 樣本,對於select查詢返回查詢結果
  109.       return array('customer_id' => 1, 'name' => 'Martin');
  110.     }
  111.   }
  112. }
  113. /**
  114. * 用戶端調用
  115. */
  116. class Client {
  117.   /**
  118.    * Main program.
  119.    */
  120.   public static function main() {
  121.     header("Content-type:text/html; charset=utf-8");
  122.     /* 載入客戶ID為1的客戶資訊 */
  123.     $customer = Customer::find(1);
  124.     /* 假設使用者擁有的定單id為 9527*/
  125.     $customer->deleteOrder(9527);
  126.   }
  127. }
  128. Client::main();
  129. ?>

同前面的文章一樣,這僅僅是一個活動記錄的樣本,關於活動記錄模式的應用,可以查看Yii架構中的DB類,在其源碼中有一個CActiveRecord抽象類別,從這裡可以看到活動記錄模式的應用

另外,如果從事務指令碼中建立活動記錄,一般是首先將表封裝為入口,接著開始行為遷移,使表深化成為活動記錄。

對於活動記錄中的域的訪問和設定可以如yii架構一樣,使用魔術方法__set方法和__get方法。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.