今天再次Review了代碼,但思路卻因此而開(kāi)始混亂。
從名字上解這兩個(gè)對(duì)象:
XmlPullParser當(dāng)然是以“拉”的方式從流中獲取信息。
SocketReader單從字面上理解,功能自然是從Socket上獲取字節(jié)流。
“單一職責(zé)原則”,在幾年前就在我腦子里打下了烙印。The Simpler The Easier,既是我做人的原則,也是我做程序的原則。常理上講,我應(yīng)該盡力維護(hù)這個(gè)原則,讓上述兩個(gè)對(duì)象都盡可能的簡(jiǎn)單。 在wildfire中,也有SocketReader,然而它的SocketReader卻不是那么簡(jiǎn)單,功能遠(yuǎn)遠(yuǎn)超出了字面意義。大部分業(yè)務(wù)都要靠這個(gè)來(lái)控制,分配。
受它影響(之前我通讀了wildfire的所有源碼),在tim中也給SocketReader的子類(lèi)ClientSocketReader等加上了重?fù)?dān)。因?yàn)樗莆樟颂嗟男畔ⅲ瑧?yīng)該說(shuō)大多數(shù)信息都暴露在這個(gè)地方,Session,Socket,SocketConnection,我實(shí)在找不出理由不讓它參與進(jìn)業(yè)務(wù)。也許,這是OO的一種失敗,但我一時(shí)也找不到新對(duì)象來(lái)管理這一系列的相關(guān)信息。
XmlPullParser則和SocketReader息息相關(guān),因?yàn)镾ocket中Read出來(lái)的東西首先就要經(jīng)過(guò)Parser,才能從字符流形成有用的東西。
在原先的設(shè)計(jì)中,XmlPullParser被SocketReader所包含,并提供了get方法暴露給外界。在很多事件分配的地方,都要XmlPullParser提供信息,之前,都是通過(guò)SocketReader間接獲取xpp,高層真的需要直接使用xpp嗎?我覺(jué)得不然,高層需要的信息完全可以通過(guò)SocketReader來(lái)提供。
那么該怎么設(shè)計(jì)兩者的關(guān)系呢?是包含,還是父子?我傾向于包含,但懶惰促使我選擇了父子。目前看起來(lái),父子關(guān)系并沒(méi)有帶來(lái)什么壞的影響,如果有必要,今后再重構(gòu)吧。
現(xiàn)在結(jié)構(gòu)似乎更為清晰了,SocketReader的子類(lèi)(ClientSocketReader。。。)會(huì)負(fù)責(zé)解析流,并根據(jù)解析出的內(nèi)容進(jìn)行第一層處理,如選擇下級(jí)處理器或者是直接計(jì)算業(yè)務(wù),或者是進(jìn)行轉(zhuǎn)發(fā)。。。根據(jù)不同的子類(lèi),表現(xiàn)不同的業(yè)務(wù)族(Client,Server,Agent。。。)