Upload
peter-tsai
View
1.100
Download
3
Embed Size (px)
Citation preview
指導教授:羅榮華 博士報告學生:蔡旻哲報告日期:
虛擬視窗平台DataObject & Table Class
2009.05.26
112/04/13 Virtual Window Platform 2
摘要更新 DataObject,增加更多種資料型態。更新 DataObjectHandler,使開發者建立資料表的基本 Handler
時,減少部署時間。增加 Table類別,配合 DataObjectHandler的更新,使資料表與資料物件間的關係更緊密。增加 DataObjectCompose類別,能將數個 DataObject合併,與DataObjectHandler進行關聯查詢並傳回資料時,將資料放入DataObject(Composed)以方便後續的處理。增加 TableRelation類別與 DataObjectRelationHandler類別,提供基本的關聯查詢。
112/04/13 Virtual Window Platform 3
DataObject 類別增加多種資料型態在這次的版本中, DataObject加入了多種資料型態,除了基本的資料變數型態的設置,還包含資料傳遞時的過濾與檢查,新增的型態如下:
XHTML – XHTML文件內容UNIXTIME – UNIX的時間戳記DATETIME – 日期 +時間的格式,格式可自訂DATE – 日期格式TIME – 時間格式OPTIONS – 自訂選項
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三種參數型態
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)
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()
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()
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
112/04/13 Virtual Window Platform 9
DataObjectCompose 類別 ( 一 )
使用合成方法的 DataObjectCompose,將一個以上的 DataObjec
t物件合成為一個 DataObject物件。主要用於關聯查詢時,需涉及多個資料表欄位,因此將數個 DataObject合併後,可存放對應的資料,並且仍然提供 DataObject原本具有的函數,以利後續的資料處理,例如 getValues()時,會依據資料型態的不同進行資料轉換,或是 cleanVars()進行資料檢查過濾。
Source Code
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..*
112/04/13 Virtual Window Platform 11
實作自動產生關聯查詢建立 TableRelation與 DataObjectRelationHandler類別來實作自動產生關聯查詢的函數,由於關聯查詢屬於較複雜的 SQL子句,因此會大幅增加程式的複雜度,因此在這次的版本中,尚未加入成為正式的類別。以下將對幾個類別與方法進行介紹:
TableRelation類別TableRelationColumn類別TableRelationColumnCompose類別DataObjectRelationHandler類別getRelationHandler函數
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)
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
並開始使用它進行資料表查詢 (僅限查詢 )。
112/04/13 Virtual Window Platform 14
文獻探討 - 自動產生關聯查詢 ( 一 )
雖然自動產生關聯查詢可以帶來許多開發時的便利,節省許多時間,但由於是自動產生的 SQL子句,在靈活度上勢必比不上親自撰寫 SQL語法。以此依據作為考量的情況下,參考其他 Framework的實作方法與使用者情況:
CakePHP:提供完整的查詢方法,包含 JOIN子句或一般關聯方法等,對於中小型專案開發上,能提供便捷的幫助,但在其相關的社群網站中,可常見使用者分享「資料庫結構較為複雜」或「資料筆數較多」時,自動產生的 SQL子句對於查詢效能上明顯不足,仍建議開發人員自行撰寫 SQL語法。Zend Framework :僅提供基礎的查詢類別,可自動產生簡易的查詢語法,保留較高的彈性由開發人員自行擴充,應用範圍較廣,使開發應用上,較不易與 Framework本身脫離。
112/04/13 Virtual Window Platform 15
文獻探討 - 自動產生關聯查詢 ( 二 )
由上述兩個案例中可得知自動產生關聯查詢雖然方便,但也有可能造成使用者的不適用,因此在這次的版本當中,尚未加入關聯查詢的相關類別,而由開發人員自行定義關聯查詢函數 (繼承 DataObjectHandler),並運用 DataObjectCompo
se類別來對應關聯查詢的結果以進行後續處理。目前關聯查詢的相關類別已接近可運作階段,但仍將暫停自動關聯查詢的分支版本開發,待未來整體進度較為成熟後再回來再繼續發展。