15
指指指指 指指指 指指 指指指指 指指指 指指指指虛虛虛虛虛虛 DataObject & Table Clas s 2009.05.2 6

Data Object & Table Class

Embed Size (px)

Citation preview

Page 1: Data Object & Table Class

指導教授:羅榮華 博士報告學生:蔡旻哲報告日期:

虛擬視窗平台DataObject & Table Class

2009.05.26

Page 2: Data Object & Table Class

112/04/13 Virtual Window Platform 2

摘要更新 DataObject,增加更多種資料型態。更新 DataObjectHandler,使開發者建立資料表的基本 Handler

時,減少部署時間。增加 Table類別,配合 DataObjectHandler的更新,使資料表與資料物件間的關係更緊密。增加 DataObjectCompose類別,能將數個 DataObject合併,與DataObjectHandler進行關聯查詢並傳回資料時,將資料放入DataObject(Composed)以方便後續的處理。增加 TableRelation類別與 DataObjectRelationHandler類別,提供基本的關聯查詢。

Page 3: Data Object & Table Class

112/04/13 Virtual Window Platform 3

DataObject 類別增加多種資料型態在這次的版本中, DataObject加入了多種資料型態,除了基本的資料變數型態的設置,還包含資料傳遞時的過濾與檢查,新增的型態如下:

XHTML – XHTML文件內容UNIXTIME – UNIX的時間戳記DATETIME – 日期 +時間的格式,格式可自訂DATE – 日期格式TIME – 時間格式OPTIONS – 自訂選項

Page 4: Data Object & Table Class

112/04/13 Virtual Window Platform 4

DataObjectHandler 類別 ( 一 )

原本為抽象類別,須繼承後覆寫 get, insert, update, delete等抽象函數,現在改為一般類別,結合 Table類別後,提供基本的資料表存取函數:

Get($id) – 依 Primary key取得一筆資料Create($is_new) – 建立對應的 DataObject,存放及管理對應的資料GetObjects($criteria) – 取得數筆資料,可自行指定條件GetCount($criteria) – 依照指定條件,計算符合條件的資料筆數Insert($object) – 新增或修改資料Update($codition, $criteria) – 自行指定欄位及資料並依照自訂條件進行資料更新Delete($mixed) – 主要用於刪除資料,可依據傳入的參數進行各種條件的刪除動作,接受 $int_id, $object, $criteria三種參數型態

Page 5: Data Object & Table Class

112/04/13 Virtual Window Platform 5

DataObjectHandler 類別 ( 二 )

UserHandler

+__construct($db)+getAdminUsers()+more...()

DataObjectHandler

+$db: Database

+__construct($db)+get($id)+create()+insert($object)+getObjects($criteria)+delete($object)

Class Diagram

Old Class

New Class

Class Diagram

UserHandler

+__construct($db)+getAdminUsers()+more...()

DataObjectHandler

+$db: DataBase#$object_name: String#$object_table: Table

+__construct($db, $object_name)+create($is_new = true)+get($id)+getObjects($criteria = null, $getValues = false)+getCount($criteria = null)+insert($object)+update($modifiers, $criteria = null)+delete($condition)

Page 6: Data Object & Table Class

112/04/13 Virtual Window Platform 6

Table 類別針對各個資料表進行相關資料的定義,如資料表名稱、主鍵、索引鍵、唯一鍵等。用於 DataObjectHandler正確產生對應的 SQL子句,以提供基本的 Handler函數 [Get(), Insert()...]。

Class Diagram

Table

-$table_name: String-$primary_key: String-$index_keys: Array()-$unique_keys: Array()-$sort_keys: Array()

+__construct()#setTableName($table_name)+getTableName()#setPrimaryKey($primary_key)+getPrimaryKey()#setIndexKey($index_key = null)+getIndexKey()#setUniqueKey($unique_key = null)+getUniqueKey()#setSortKey($sort_key = null)+getSortKey()

Page 7: Data Object & Table Class

112/04/13 Virtual Window Platform 7

繼承 Table 類別以 User資料表為例,進行設定資料表名稱 (user)、主鍵欄位名稱 (user_id)、唯一鍵欄位名稱 (user_name)以及可排序的欄位名稱 (user_unick),可排序的欄位不限定數量,且自動包含主鍵、索引鍵、唯一鍵。

Source Code

Class Diagram

Table

-$table_name: String-$primary_key: String-$index_keys: Array()-$unique_keys: Array()-$sort_keys: Array()

+__construct()#setTableName($table_name)+getTableName()#setPrimaryKey($primary_key)+getPrimaryKey()#setIndexKey($index_key = null)+getIndexKey()#setUniqueKey($unique_key = null)+getUniqueKey()#setSortKey($sort_key = null)+getSortKey()

UserTable

+__construct()

Page 8: Data Object & Table Class

112/04/13 Virtual Window Platform 8

取得 DataObjectHandler 物件透過 getHandler函數,傳入 Handler名稱可取得對應的 DataObj

ectHandler,以 User資料為例,將會自動引入 UserTable物件,產生專用於 User資料的 DataObjectHandler。若需擴充 DataObje

ctHandler的函數時,可自訂 UserHandler類別並繼承 DataObject

Handler,於 getHandler函數將會自動判斷 UserHandler是否存在來實體化 UserHandler或 DataObjectHandler。

Source Code

Page 9: Data Object & Table Class

112/04/13 Virtual Window Platform 9

DataObjectCompose 類別 ( 一 )

使用合成方法的 DataObjectCompose,將一個以上的 DataObjec

t物件合成為一個 DataObject物件。主要用於關聯查詢時,需涉及多個資料表欄位,因此將數個 DataObject合併後,可存放對應的資料,並且仍然提供 DataObject原本具有的函數,以利後續的資料處理,例如 getValues()時,會依據資料型態的不同進行資料轉換,或是 cleanVars()進行資料檢查過濾。

Source Code

Page 10: Data Object & Table Class

112/04/13 Virtual Window Platform 10

DataObjectCompose 類別 ( 二 )Class Diagram

DataObject

-$vars-$clean_vars-$is_new-$is_dirty-$is_composed

+__construct()+initVar($key, $data_type, $value, $attrs)+assignVar($key, $value)#assignVars($var_array)+setVar($key, $value)#setVars($var_array)+getVar($key, $format)+getVars()+destroyVar()+destroyVars()+getValues()+cleanVars()+setNew()+unsetNew()+isNew()+setDirty()+unsetDirty()+isDirty()+setCompose()+isCompose()

DataObjectCompose

+getInstance()12..*

Page 11: Data Object & Table Class

112/04/13 Virtual Window Platform 11

實作自動產生關聯查詢建立 TableRelation與 DataObjectRelationHandler類別來實作自動產生關聯查詢的函數,由於關聯查詢屬於較複雜的 SQL子句,因此會大幅增加程式的複雜度,因此在這次的版本中,尚未加入成為正式的類別。以下將對幾個類別與方法進行介紹:

TableRelation類別TableRelationColumn類別TableRelationColumnCompose類別DataObjectRelationHandler類別getRelationHandler函數

Page 12: Data Object & Table Class

112/04/13 Virtual Window Platform 12

TableRelation 與 DataObjectRelationHandler 類別

Class Diagram

TableRelation

-$table_objects: Array-$relations: Array

#__construct()#setTableObject($object_name)+getTableObject($object_name)+getTableObjects()#createTableRelation($relation_name)#createTablesRelation($relation_name)+getTableRelation($relation_name)+getTableRelations()

UserTableRelation

+__construct()

12..*

TableRelationColumn

-$table_name-$relation_key

+__construct()+setRelation()+render()

TableRelationColumnCompose

-$columns

+__construct()+setRelation()+render()

DataObjectRelationHandler

+$db: DataBase+$object_table

+__construct($db, $object_table)+create()+get($relation_name, $id)+getObjects($relation_name, $criteria, $getValues)+getCount($relation_name, $criteria = null)

UserRelationHandler

+__construct($db)+getGroupPermission()+more...()

getRelationHandler($handler_name)

Page 13: Data Object & Table Class

112/04/13 Virtual Window Platform 13

實際使用 TableRelation 類別使用 TableRelation類別需建立新的類別並且繼承後才能進行被保護 (protected)函數的調用。以下以範例進行說明:建立 UserRelationTable繼承 RelationTabl

e後,使用 setTableObject函數新增關聯的資料表物件,如 Us

erTable, GroupTable;接著使用 createTable(s)Relation函數建立一組以上的關聯條件及設定關聯名稱以便後續調用, createTa

ble(s)Relation將會回傳 TableRelationColumn物件或 TableRelationCo

lumnCompose物件,並使用該物件函數 setRelation進行關聯欄位的條件設定即可自動產生對應的關聯查詢物件 (DataObject

RelationHandler);呼叫 getRelationHandler函數取得對應的 Handler

並開始使用它進行資料表查詢 (僅限查詢 )。

Page 14: Data Object & Table Class

112/04/13 Virtual Window Platform 14

文獻探討 - 自動產生關聯查詢 ( 一 )

雖然自動產生關聯查詢可以帶來許多開發時的便利,節省許多時間,但由於是自動產生的 SQL子句,在靈活度上勢必比不上親自撰寫 SQL語法。以此依據作為考量的情況下,參考其他 Framework的實作方法與使用者情況:

CakePHP:提供完整的查詢方法,包含 JOIN子句或一般關聯方法等,對於中小型專案開發上,能提供便捷的幫助,但在其相關的社群網站中,可常見使用者分享「資料庫結構較為複雜」或「資料筆數較多」時,自動產生的 SQL子句對於查詢效能上明顯不足,仍建議開發人員自行撰寫 SQL語法。Zend Framework :僅提供基礎的查詢類別,可自動產生簡易的查詢語法,保留較高的彈性由開發人員自行擴充,應用範圍較廣,使開發應用上,較不易與 Framework本身脫離。

Page 15: Data Object & Table Class

112/04/13 Virtual Window Platform 15

文獻探討 - 自動產生關聯查詢 ( 二 )

由上述兩個案例中可得知自動產生關聯查詢雖然方便,但也有可能造成使用者的不適用,因此在這次的版本當中,尚未加入關聯查詢的相關類別,而由開發人員自行定義關聯查詢函數 (繼承 DataObjectHandler),並運用 DataObjectCompo

se類別來對應關聯查詢的結果以進行後續處理。目前關聯查詢的相關類別已接近可運作階段,但仍將暫停自動關聯查詢的分支版本開發,待未來整體進度較為成熟後再回來再繼續發展。