狠狠撸

狠狠撸Share a Scribd company logo
山頂洞人日記 -  回歸到最純樸的開發 王建興 qing@cs.nthu.edu.tw (Email/MSN) twitter://qing_wang http://blog.qing.tw 2008/5/16
審視你的需求 慾望總是超過真實需求 威力強大的東西難免複雜 选择开发工具要在复杂度与威力之间选择一个适合你的平衡点
山頂洞人過的日子 WinCVS EditPlus Ant MySQL Tomcat JavaDoc of API
簡易級 Java Web 應用程式開發 不用 IDE 用 Editplus 來編輯原始碼 用 WinCVS 來做 project browsing 用 Ant 來做自動化建構 用 JSP 來寫 action 不用 Struts 不用 Spring 利用 LWDBA 來存取資料庫 不用 Hibernate 不用 EJB
關於 Ant 為各種類型的專案建立不同 build.xml 的 template Library Web applications Standalone application 每次建立新的專案時,依照 template  建立固定的目錄結構
瀏览专案
問題在設計 問題不在你使用什麼 framework 问题在於你的设计对不对
劃分出系統架構中的各層 Presentation JSP 實作 Action JSP/Servlet 實作 使用 JSP 的優點在於 script language 的動態優勢 Fa?ade 封裝事務邏輯 一般人最欠缺的 Data Access Layer LWDBA
何謂 Facade Fa?ade 就是建築物正面的入口 The Fa?ade pattern simplifies access to a related sets of objects by providing one object that all objects outside the set use to communicate with the set.
你需要的只是 Code Gen 嗎? 許多 framework 會強調 CRUD 應用程式的快速建立 可是… 許多應用程式的本質並不在 CRUD CRUD 程式碼的快速產生,似乎只對開發 ERP 之類的系統比較有幫助
有些 Web Application 的問題在於 問題在於設計 缺乏了 Fa?ade layer 使用 Struts 之類的 framework 來實作 MVC 使用諸如 Hibernate 的 framework 存取資料 事務邏輯未封裝 於 Action 類別中直接操作 DAO 問題所在
LWDBA 輕量級的資料庫存取( Light-Weight Database Access ) 目標:簡化存取關聯性資料庫的動作,提供最普遍的資料存取需求 No ORM, No Code Gen
對資料庫存取的需求 容易設定 支援 Connection Pooling 簡化 SQL 操作 簡易的 DAO 支援 Query Caching
資料庫的設定 記錄於 CLASSPATH 中的 system.properties lwdb.pool.default.type=mysql lwdb.pool.default.driverClassName=org.gjt.mm.mysql.Driver lwdb.pool.default.driverURL=jdbc:mysql://localhost:3306/lwdba lwdb.pool.default.userName=root lwdb.pool.default.password=root lwdb.pool.default.maxConnectionCount=32 lwdb.pool.default.encoding=UTF-8 lwdb.pool.default.sqlFile=sql
LWDBA 對 SQL 的態度 一般人不在程式中使用 SQL 的原因? 資料庫相依性 schema change 帶來的影響 LWDBA 對 SQL statement 的觀點 在程式中使用 SQL statement 但在程式中看不到 SQL statement 做法 SQL statement composer SQL 抽離至外部的設定檔
SQL 操作 - DBRow (1/3) tw.qing.lwdba.DBRow public DBRow(String _tableName, String _pkName) public DBRow(String _tableName, String _pkName[]) public void setColumn(String columnName, Object value) public Object getColumn(String columnName) public void removeColumn(String columnName) public HashMap getRow() public void setRow(HashMap hm)
SQL 操作 - DBRow (2/3) public String toInsertString() public String toDeleteString() public String toUpdateString() public String toQueryString()
SQL 操作 - DBRow (3/3) DBRow dr = new DBRow("Customer", "seqNo"); dr.setColumn("name", name); dr.setColumn("phone", phone); dr.setColumn("address", address); System.out.println(dr.toInsertString());
SQL 操作 - SQLManager (1/4) SQLManager 是 lwdba 為了避免將 SQL 敘述 hardcode 在程式中的類別 SQLManager 會依據 system.properties 中所設定的 sqlFile 來決定實際使用的 SQL 敘述設定檔 例如: sql.properties 針對不同的資料庫組態,都提供一份外掛的 SQL 敘述設定檔 程式中若想使用 SQL 敘述,則務必透過 SQLManager 來取得 SQL 敘述 當系統欲切換所使用的資料庫類型時,便毋需徹底修改程式中漫於四處的 SQL 敘述
SQL 操作 - SQLManager (2/4) SQL 設定檔中的每一行文字行皆代表一組 SQL 敘述,並且皆為 name=value 的對應 例如: user.getUserPassword=select password from UserAccount where id={0}
SQL 操作 - SQLManager (3/4) SQL 敘述的命名,除了 SQL 敘述本身的意義之外,在前頭冠上子系統(對應至 Facade )的名稱 SQL 敘述中如果有參數的部份,是程式執行過程中動態傳入的,以 {0} 、 {1} 、…、 {n} 來依序代表傳入的第 0 個、第 1 個、以及第 n 個參數 在撰寫 SQL 敘述時,大小寫有別
SQL 操作 - SQLManager (4/4) SQLManager 提供 getSQL() 族系的方法來取得 SQL 設定檔的內容 String getSQL(String key) String getSQL(String key, Object arg) String getSQL(String key, Object arg1, Object arg2) String getSQL(String key, Object arg1, Object arg2, Object arg3) String getSQL(String key, Object arg1, Object arg2, Object arg3, Object arg4) String getSQL(String key, Object[] arg)
存取 Database  -  DBFacade tw.qing.lwdba.DBFacade DBFacade() DBFacade(String poolName) public QueryResult sqlQuery(String query) public int sqlUpdate(String update) public QueryResult sqlQuery(String query, int idxRow, int count, boolean fReturnTotal) public ArrayList sqlQueryRows(String query) public ArrayList sqlQueryRows(String query, int idxRow, int count)
查詢結果 -  QueryResult tw.qing.lwdba.QueryResult public ArrayList getRows() public int getTotalRowCount()
取得查詢結果 LWDBA 將查詢結果置於 ArrayList 中 ArrayList 中的每個元素都是 HashMap 用 HashMap 表示 ResultSet 中的一筆結果 HashMap 即為通用性質的 DAO 可直接將 ArrayList 及 HashMap 整合快取系統
取得查詢結果 - 範例 StatisticsFacade facade = StatisticsFacade.getInstance(); ArrayList al = PPTVStatisticsFacade.listStatistics(n); <% for(int i=0;i<al.size();i++) { HashMap hm = (HashMap) al.get(i); %> <tr> <td><%=hm.get(&quot;seqNo&quot;)%></td> <td><%=hm.get(&quot;uid&quot;)%></td> <td><%=hm.get(&quot;remoteHost&quot;)%></td> <td><%=hm.get(&quot;type&quot;)%></td> <td><%=hm.get(&quot;createTime&quot;)%></td> </tr> <% } %>
基於 LWDBA 的設計 依據資料的處理特性,劃分你的子系統 AdFacade AnnouncementFacade HotelFacade MemberFacade OrderFacade ZipCodeFacade …
撰寫 Facade 繼承自 DBFacade 參考 PPTVStatisticsFacade
使用 Fa?ade 的優點 將事務邏輯封裝於特定的層次 Action class 不再充斥著事務邏輯 降低相依性 提昇因為變動所造成的影響 Action class 所面對的是 business service ,而非直接操作資料
Thanks! Q&A
Ad

Recommended

PPT
My sql管理基础 李春_v2
Pickup Li
?
PPTX
Elastic stack day-1
YI-CHING WU
?
PPT
翱谤补肠濒别数据库体系结构介绍.辫辫迟
james tong
?
PPTX
Ch07 使用 JSTL
Justin Lin
?
PPTX
第一次贰濒补蝉迟颈肠蝉别补谤肠丑就上手
Aaron King
?
PPTX
Java_08:SQL
Brad Chao
?
PPTX
Elasticsearch 簡介
Pei-Hsun Kao
?
PDF
颁贬16:整合资料库
Justin Lin
?
PDF
Elasticsearch 簡介
Jui An Huang (黃瑞安)
?
PPTX
Elasticsearch search engine_development_tips
YI-CHING WU
?
PPT
Elasticsearch
光明 赵
?
PPTX
使用 Liquibase 發展資料庫結構
Steven Wang
?
PPT
滨产补迟颈蝉技术讲座
xujie
?
PDF
整合资料库
Justin Lin
?
PDF
Chapter 4 models
Ekman Hsieh
?
PDF
Servlet & JSP 教學手冊第二版 - 第 9 章:整合资料库
Justin Lin
?
PDF
颁贬04:认识物件
Justin Lin
?
PPT
Thinking in React by Deot
荣德 周
?
PPTX
Ch09 整合资料库
Justin Lin
?
PDF
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Justin Lin
?
PDF
Ch08 自訂標籤
Justin Lin
?
PPT
Oracle sql developer支持第三方数据库
shadowfalao
?
PPTX
Elastic stack day-2
YI-CHING WU
?
PDF
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Justin Lin
?
PPTX
Ch08 自訂標籤
Justin Lin
?
PPTX
Ch13 整合 Spring MVC/Security
Justin Lin
?
PPT
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
?
DOC
无数据库日志文件恢复数据库方法两则
wensheng wei
?
PDF
Programming with Threads in Java
koji lin
?
PDF
Threads concept in java
Muthukumaran Subramanian
?

More Related Content

What's hot (20)

PDF
Elasticsearch 簡介
Jui An Huang (黃瑞安)
?
PPTX
Elasticsearch search engine_development_tips
YI-CHING WU
?
PPT
Elasticsearch
光明 赵
?
PPTX
使用 Liquibase 發展資料庫結構
Steven Wang
?
PPT
滨产补迟颈蝉技术讲座
xujie
?
PDF
整合资料库
Justin Lin
?
PDF
Chapter 4 models
Ekman Hsieh
?
PDF
Servlet & JSP 教學手冊第二版 - 第 9 章:整合资料库
Justin Lin
?
PDF
颁贬04:认识物件
Justin Lin
?
PPT
Thinking in React by Deot
荣德 周
?
PPTX
Ch09 整合资料库
Justin Lin
?
PDF
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Justin Lin
?
PDF
Ch08 自訂標籤
Justin Lin
?
PPT
Oracle sql developer支持第三方数据库
shadowfalao
?
PPTX
Elastic stack day-2
YI-CHING WU
?
PDF
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Justin Lin
?
PPTX
Ch08 自訂標籤
Justin Lin
?
PPTX
Ch13 整合 Spring MVC/Security
Justin Lin
?
PPT
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
?
DOC
无数据库日志文件恢复数据库方法两则
wensheng wei
?
Elasticsearch 簡介
Jui An Huang (黃瑞安)
?
Elasticsearch search engine_development_tips
YI-CHING WU
?
Elasticsearch
光明 赵
?
使用 Liquibase 發展資料庫結構
Steven Wang
?
滨产补迟颈蝉技术讲座
xujie
?
整合资料库
Justin Lin
?
Chapter 4 models
Ekman Hsieh
?
Servlet & JSP 教學手冊第二版 - 第 9 章:整合资料库
Justin Lin
?
颁贬04:认识物件
Justin Lin
?
Thinking in React by Deot
荣德 周
?
Ch09 整合资料库
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Justin Lin
?
Ch08 自訂標籤
Justin Lin
?
Oracle sql developer支持第三方数据库
shadowfalao
?
Elastic stack day-2
YI-CHING WU
?
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Justin Lin
?
Ch08 自訂標籤
Justin Lin
?
Ch13 整合 Spring MVC/Security
Justin Lin
?
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
?
无数据库日志文件恢复数据库方法两则
wensheng wei
?

Viewers also liked (10)

PDF
Programming with Threads in Java
koji lin
?
PDF
Threads concept in java
Muthukumaran Subramanian
?
PDF
Java Course 10: Threads and Concurrency
Anton Keks
?
PDF
Services you can use to monitor and analyze mobile app
koji lin
?
PPT
Java And Multithreading
Shraddha
?
PPTX
Threads in JAVA
Haldia Institute of Technology
?
PPTX
Multithreading in java
Raghu nath
?
PPTX
Multithread Programing in Java
M. Raihan
?
ODP
Multithreading In Java
parag
?
PPT
Java multi threading
Raja Sekhar
?
Programming with Threads in Java
koji lin
?
Threads concept in java
Muthukumaran Subramanian
?
Java Course 10: Threads and Concurrency
Anton Keks
?
Services you can use to monitor and analyze mobile app
koji lin
?
Java And Multithreading
Shraddha
?
Multithreading in java
Raghu nath
?
Multithread Programing in Java
M. Raihan
?
Multithreading In Java
parag
?
Java multi threading
Raja Sekhar
?
Ad

Similar to 山頂洞人日記 - 回歸到最純樸的開發 (20)

PPT
lwdba – 開放原始碼的輕量級資料庫存取程式庫
建興 王
?
PDF
Kid171 chap03 traditional Chinese Version
Frank S.C. Tseng
?
PDF
闯2别别经典学习笔记
yiditushe
?
PDF
Postgre sql intro 0
March Liu
?
PPT
深入学习Mongo db
Lucien Li
?
PDF
闯诲产肠中驱动加载的过程分析(下)
yiditushe
?
PPT
翱谤补肠濒别北大青鸟完全教程
yiditushe
?
DOC
闯2别别面试知识
yiditushe
?
PPT
数据库性能诊断的七种武器
Leyi (Kamus) Zhang
?
PDF
Mysql proxy cluster
Yiwei Ma
?
PPTX
IoTDB Quick Start
JialinQiao
?
PDF
Azure Data Lake 簡介
Herman Wu
?
PPT
网站设计100步
evercislide
?
PDF
Why use MySQL
Zhaoyang Wang
?
PDF
Asp.net mvc網站的從無到有
Wade Huang
?
PDF
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
?
PDF
用JAX-RS和Jersey完成RESTful Web Services
javatwo2011
?
PDF
Big Java, Big Data
Kuo-Chun Su
?
PPTX
大型互联网应用架构设计
thinkinlamp
?
PPT
beidakejian
hanxuebing
?
lwdba – 開放原始碼的輕量級資料庫存取程式庫
建興 王
?
Kid171 chap03 traditional Chinese Version
Frank S.C. Tseng
?
闯2别别经典学习笔记
yiditushe
?
Postgre sql intro 0
March Liu
?
深入学习Mongo db
Lucien Li
?
闯诲产肠中驱动加载的过程分析(下)
yiditushe
?
翱谤补肠濒别北大青鸟完全教程
yiditushe
?
闯2别别面试知识
yiditushe
?
数据库性能诊断的七种武器
Leyi (Kamus) Zhang
?
Mysql proxy cluster
Yiwei Ma
?
IoTDB Quick Start
JialinQiao
?
Azure Data Lake 簡介
Herman Wu
?
网站设计100步
evercislide
?
Why use MySQL
Zhaoyang Wang
?
Asp.net mvc網站的從無到有
Wade Huang
?
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
?
用JAX-RS和Jersey完成RESTful Web Services
javatwo2011
?
Big Java, Big Data
Kuo-Chun Su
?
大型互联网应用架构设计
thinkinlamp
?
beidakejian
hanxuebing
?
Ad

More from koji lin (16)

PDF
サーバーサイドでの非同期処理で色々やったよ
koji lin
?
PPTX
G1GC
koji lin
?
PDF
Using armeria to write your RPC
koji lin
?
PDF
使用 Java 上的 future/promise API
koji lin
?
PDF
Annotation processing and code gen
koji lin
?
PDF
Jcconf
koji lin
?
PDF
Use Lambdas in Android
koji lin
?
PDF
docker intro
koji lin
?
PDF
Java8 time
koji lin
?
PDF
Java8 stream
koji lin
?
PDF
Java8 lambda
koji lin
?
PDF
Idea13
koji lin
?
ODP
CompletableFuture
koji lin
?
ODP
Raspberry Pi with Java
koji lin
?
PDF
JQuery
koji lin
?
ODP
Android Location-based應用開發分享
koji lin
?
サーバーサイドでの非同期処理で色々やったよ
koji lin
?
Using armeria to write your RPC
koji lin
?
使用 Java 上的 future/promise API
koji lin
?
Annotation processing and code gen
koji lin
?
Jcconf
koji lin
?
Use Lambdas in Android
koji lin
?
docker intro
koji lin
?
Java8 time
koji lin
?
Java8 stream
koji lin
?
Java8 lambda
koji lin
?
Idea13
koji lin
?
CompletableFuture
koji lin
?
Raspberry Pi with Java
koji lin
?
JQuery
koji lin
?
Android Location-based應用開發分享
koji lin
?

山頂洞人日記 - 回歸到最純樸的開發

  • 1. 山頂洞人日記 - 回歸到最純樸的開發 王建興 qing@cs.nthu.edu.tw (Email/MSN) twitter://qing_wang http://blog.qing.tw 2008/5/16
  • 2. 審視你的需求 慾望總是超過真實需求 威力強大的東西難免複雜 选择开发工具要在复杂度与威力之间选择一个适合你的平衡点
  • 3. 山頂洞人過的日子 WinCVS EditPlus Ant MySQL Tomcat JavaDoc of API
  • 4. 簡易級 Java Web 應用程式開發 不用 IDE 用 Editplus 來編輯原始碼 用 WinCVS 來做 project browsing 用 Ant 來做自動化建構 用 JSP 來寫 action 不用 Struts 不用 Spring 利用 LWDBA 來存取資料庫 不用 Hibernate 不用 EJB
  • 5. 關於 Ant 為各種類型的專案建立不同 build.xml 的 template Library Web applications Standalone application 每次建立新的專案時,依照 template 建立固定的目錄結構
  • 7. 問題在設計 問題不在你使用什麼 framework 问题在於你的设计对不对
  • 8. 劃分出系統架構中的各層 Presentation JSP 實作 Action JSP/Servlet 實作 使用 JSP 的優點在於 script language 的動態優勢 Fa?ade 封裝事務邏輯 一般人最欠缺的 Data Access Layer LWDBA
  • 9. 何謂 Facade Fa?ade 就是建築物正面的入口 The Fa?ade pattern simplifies access to a related sets of objects by providing one object that all objects outside the set use to communicate with the set.
  • 10. 你需要的只是 Code Gen 嗎? 許多 framework 會強調 CRUD 應用程式的快速建立 可是… 許多應用程式的本質並不在 CRUD CRUD 程式碼的快速產生,似乎只對開發 ERP 之類的系統比較有幫助
  • 11. 有些 Web Application 的問題在於 問題在於設計 缺乏了 Fa?ade layer 使用 Struts 之類的 framework 來實作 MVC 使用諸如 Hibernate 的 framework 存取資料 事務邏輯未封裝 於 Action 類別中直接操作 DAO 問題所在
  • 12. LWDBA 輕量級的資料庫存取( Light-Weight Database Access ) 目標:簡化存取關聯性資料庫的動作,提供最普遍的資料存取需求 No ORM, No Code Gen
  • 13. 對資料庫存取的需求 容易設定 支援 Connection Pooling 簡化 SQL 操作 簡易的 DAO 支援 Query Caching
  • 14. 資料庫的設定 記錄於 CLASSPATH 中的 system.properties lwdb.pool.default.type=mysql lwdb.pool.default.driverClassName=org.gjt.mm.mysql.Driver lwdb.pool.default.driverURL=jdbc:mysql://localhost:3306/lwdba lwdb.pool.default.userName=root lwdb.pool.default.password=root lwdb.pool.default.maxConnectionCount=32 lwdb.pool.default.encoding=UTF-8 lwdb.pool.default.sqlFile=sql
  • 15. LWDBA 對 SQL 的態度 一般人不在程式中使用 SQL 的原因? 資料庫相依性 schema change 帶來的影響 LWDBA 對 SQL statement 的觀點 在程式中使用 SQL statement 但在程式中看不到 SQL statement 做法 SQL statement composer SQL 抽離至外部的設定檔
  • 16. SQL 操作 - DBRow (1/3) tw.qing.lwdba.DBRow public DBRow(String _tableName, String _pkName) public DBRow(String _tableName, String _pkName[]) public void setColumn(String columnName, Object value) public Object getColumn(String columnName) public void removeColumn(String columnName) public HashMap getRow() public void setRow(HashMap hm)
  • 17. SQL 操作 - DBRow (2/3) public String toInsertString() public String toDeleteString() public String toUpdateString() public String toQueryString()
  • 18. SQL 操作 - DBRow (3/3) DBRow dr = new DBRow(&quot;Customer&quot;, &quot;seqNo&quot;); dr.setColumn(&quot;name&quot;, name); dr.setColumn(&quot;phone&quot;, phone); dr.setColumn(&quot;address&quot;, address); System.out.println(dr.toInsertString());
  • 19. SQL 操作 - SQLManager (1/4) SQLManager 是 lwdba 為了避免將 SQL 敘述 hardcode 在程式中的類別 SQLManager 會依據 system.properties 中所設定的 sqlFile 來決定實際使用的 SQL 敘述設定檔 例如: sql.properties 針對不同的資料庫組態,都提供一份外掛的 SQL 敘述設定檔 程式中若想使用 SQL 敘述,則務必透過 SQLManager 來取得 SQL 敘述 當系統欲切換所使用的資料庫類型時,便毋需徹底修改程式中漫於四處的 SQL 敘述
  • 20. SQL 操作 - SQLManager (2/4) SQL 設定檔中的每一行文字行皆代表一組 SQL 敘述,並且皆為 name=value 的對應 例如: user.getUserPassword=select password from UserAccount where id={0}
  • 21. SQL 操作 - SQLManager (3/4) SQL 敘述的命名,除了 SQL 敘述本身的意義之外,在前頭冠上子系統(對應至 Facade )的名稱 SQL 敘述中如果有參數的部份,是程式執行過程中動態傳入的,以 {0} 、 {1} 、…、 {n} 來依序代表傳入的第 0 個、第 1 個、以及第 n 個參數 在撰寫 SQL 敘述時,大小寫有別
  • 22. SQL 操作 - SQLManager (4/4) SQLManager 提供 getSQL() 族系的方法來取得 SQL 設定檔的內容 String getSQL(String key) String getSQL(String key, Object arg) String getSQL(String key, Object arg1, Object arg2) String getSQL(String key, Object arg1, Object arg2, Object arg3) String getSQL(String key, Object arg1, Object arg2, Object arg3, Object arg4) String getSQL(String key, Object[] arg)
  • 23. 存取 Database - DBFacade tw.qing.lwdba.DBFacade DBFacade() DBFacade(String poolName) public QueryResult sqlQuery(String query) public int sqlUpdate(String update) public QueryResult sqlQuery(String query, int idxRow, int count, boolean fReturnTotal) public ArrayList sqlQueryRows(String query) public ArrayList sqlQueryRows(String query, int idxRow, int count)
  • 24. 查詢結果 - QueryResult tw.qing.lwdba.QueryResult public ArrayList getRows() public int getTotalRowCount()
  • 25. 取得查詢結果 LWDBA 將查詢結果置於 ArrayList 中 ArrayList 中的每個元素都是 HashMap 用 HashMap 表示 ResultSet 中的一筆結果 HashMap 即為通用性質的 DAO 可直接將 ArrayList 及 HashMap 整合快取系統
  • 26. 取得查詢結果 - 範例 StatisticsFacade facade = StatisticsFacade.getInstance(); ArrayList al = PPTVStatisticsFacade.listStatistics(n); <% for(int i=0;i<al.size();i++) { HashMap hm = (HashMap) al.get(i); %> <tr> <td><%=hm.get(&quot;seqNo&quot;)%></td> <td><%=hm.get(&quot;uid&quot;)%></td> <td><%=hm.get(&quot;remoteHost&quot;)%></td> <td><%=hm.get(&quot;type&quot;)%></td> <td><%=hm.get(&quot;createTime&quot;)%></td> </tr> <% } %>
  • 27. 基於 LWDBA 的設計 依據資料的處理特性,劃分你的子系統 AdFacade AnnouncementFacade HotelFacade MemberFacade OrderFacade ZipCodeFacade …
  • 28. 撰寫 Facade 繼承自 DBFacade 參考 PPTVStatisticsFacade
  • 29. 使用 Fa?ade 的優點 將事務邏輯封裝於特定的層次 Action class 不再充斥著事務邏輯 降低相依性 提昇因為變動所造成的影響 Action class 所面對的是 business service ,而非直接操作資料