智慧領域物件設計(例項講解)-2/2

cuwkuhaihong發表於2010-08-09
上一篇:智慧領域物件設計(演繹革命)-1

如果你沒有讀過關於智慧領域物件設計的文章,又對此有點興趣,那麼BaseService和ThinObject一定能滿足你的需要。
BaseService原始碼:

// 在此輸入java程式碼
public class BaseService {

	public BeanTable getBeanTable(Class clz) throws SQLException {
		return ThinContext.ctx.getBeanTable(clz);
	}
	public void add(Object bean) {
		try {
			getBeanTable(bean.getClass()).add(KVUtils.toKeyValue(bean));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	protected List getObject(Class clz, Criterion... criterion)
			throws Exception {
		List<Map<String, Object>> kvs = getBeanTable(clz).get(criterion);
		return KVUtils.toBeans(kvs, clz);
	}
	public void updateObject(Object obj) throws  Exception {
		getBeanTable(obj.getClass()).update(KVUtils.toKeyValue(obj));
	}
	public void deleteObject(Object obj) throws  Exception {
		getBeanTable(obj.getClass()).delete(KVUtils.toKeyValue(obj));
	}
}
<p class="indent">

ThinObject以及相關程式碼可以從我的demo中找到,這個demo是完成就醫預約功能,填寫“就醫預約單”,單據儲存後,釋出預約醫生的事件,然後點選“查詢預約”查詢預約情況。

智慧領域物件設計(例項講解)-2/2

智慧領域物件設計(例項講解)-2/2
把工程匯入eclipse:

智慧領域物件設計(例項講解)-2/2

這是用maven構建的專案包含兩個模組,idemo-webapp包含顯示和業務邏輯等,thin是持久層框架。展開後:

智慧領域物件設計(例項講解)-2/2

org.idemo.common下的功能,無論增加多少程式碼這裡都不用變;
org.idemo.model是包含兩個領域物件;
org.idemo.view是用於顯示的頁面,本程式碼使用wicket框架。

我們以後增加其他的業務程式碼就在model和view下編寫即可,使業務邏輯程式碼比例最大化,將有限的精力專注在業務邏輯和UI程式碼。當然並不是說service類就絕對不需要了,當一個任務需要多個物件配合才能完成,就需要建立一個service類讓多個物件合作完成任務。如模擬戰爭場面中常見的炸碉堡,就需要守方機槍手,攻方機槍手掩護和爆破手三個物件參與,沒有service類是不易完成。

src/main/resources下有兩個配置檔案,分別對應Doctor和Reservation。
*Doctor_sql.properties是用來為Doctor物件提供個性化的、Thin無法提供的SQL,為了讓程式和SQL分離,更換資料庫,便於調整SQL。沒有個性SQL可以不要此檔案。
*Reservation_lstnr.properties這裡是用來配置監聽器的,在這裡配置的類都必須‘implements Observer’這裡配置的類可以讓物件發生關係,不需要影響其他的類,可以不要此檔案。

在一個系統中很多物件都不是孤立存在的,他們之間存在相互影響的因果關係,在通常情況下,一個“因”可能會有多個“果”,這種因果關係在不同的業務環境下,是易變,所以這裡必須提供可配置,做到易擴充套件和業務弱隔離。如此現實中的因果鏈,就很容易實現。如飛機上有一個人突發心臟病,(1)乘務員在著陸前透過無線電報告給機場;(2)機場收到訊息後通知120急救中心;(3.1)120急救中心通知心臟科的主治醫生馬上趕到醫院;(3.2)120急救中心派救護車趕往機場;......。乘務員從第2個因果關係開始就不知道接下來還發生什麼事情了,也不用關心了,因為他的職務已經完成,第2個原因產生了兩個果(3.1)、(3.2),在不同的應用系統環境中,可能還會有(3.3)、(3.4)等等。

再來看看測試,通常難以測試的開發模式,就難以使用。

智慧領域物件設計(例項講解)-2/2
分層的一個好處是測試的時候不用啟動Servlet容器,智慧領域物件設計同樣不許要啟動容器,除了需要thin,junit(習慣)外,其他都不需要了,從上圖可以簡單看到!你可以在不寫任何頁面程式碼的情況下,完成所有的和必要的業務邏輯開發和測試,使分工更加方便細緻。

[囉嗦的附錄-附上最新的IObject原始碼]

// 在此輸入java程式碼
/**
 * 這是智慧領域物件設計的核心類,所謂智慧主要體現在獨立性上,可不借助外援 完成份內工作。即便子類所描述的物件在現實中不具備此能力。
 * 
 * @author Haihong.Wang
 * @since 2010-8-4
 */
public abstract class IObject extends Observable implements Serializable {
	/**
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 把物件自身持久到資料庫。子類可以根據類的情況,重寫該方法。 如該類是複合物件,想關聯儲存,則需要重寫該方法
	 * 
	 */
	public abstract void remember();

	/**
	 * 刪除此物件對應的資料庫記錄。 恰如我們忘記一件事物
	 */
	public abstract void forget();

	/**
	 * 用於更新資料庫記錄,需要更新物件的某一個屬性時,用到此方法。 恰如我們需要更新對事物的記憶。
	 * 我們每隔三天去看一個正在建設的高樓,那麼大腦每次都要更新高樓的高度。
	 * 
	 * @param updateFields
	 *            屬性的名稱,如果你更改username的值,那麼這個引數就應該是username, 注意不是username的值
	 */
	public abstract void updateMemory(String... updateFields);

	/**
	 * 這是一個最自由的,最難以理解的,最惹爭議的方法。所以在這裡解釋以下,該類方法名稱可意為
	 * “聯想”或者“匹配”,英語associate包含這兩種解釋,有一定哲學含義, 即:要素與一系列物件屬性的匹配過程就叫聯想。
	 * 預設實現是查詢相關物件。如:我們透過寶馬聯想到賓士和奧迪。
	 * 
	 * 如果這是一個事件物件,那麼你可以讓他想到與這個事件相關的任何東西。 在子類中可以自己新增相關的‘associateXXX()’方法。
	 * 
	 * @param params
	 *            任何物件要素
	 * @return
	 */
	public abstract List associate(Object... params);

	/**
	 * 根據主鍵資料庫中獲取自身全部資訊
	 * 
	 * @param id
	 * @return
	 */
	public abstract void obtainMe();

}
<p class="indent">



[該貼被cuwkuhaihong於2010-08-09 13:24修改過]

相關文章