Chapter說到糾纏不清的工程管理器的問題。
很多模塊都需要在工程打開之時(shí),獲取一定的信息,比如工程是新建的還是打開的,臨時(shí)目錄在哪里,工程目錄又在哪里。
工程管理模塊就像個(gè)奶媽,把一系列的信息從XML文件或者從用戶剛剛輸入的信息都進(jìn)來,然后再一個(gè)個(gè)的去NotifyProjectOpen。工程關(guān)閉之時(shí)在挨個(gè)通知他們要關(guān)燈了,NotifyProjectClose。怪不得耦合度高啊,全是被動(dòng)式初始化,能不高嗎?
修改方案:
干脆,奶媽下崗吧,最好自己的事,別人的事少管。有了狀況通知專門的部門專門的人去管。ProjectMgr負(fù)責(zé)解析工程文件,并把自己的指針注冊(cè)到InterfaceMgr,有MagicString的都可獲取。需要一個(gè)通信協(xié)議,讓各位斷奶的模塊來獲取自己需要的東西。有兩種打算,一個(gè)就是通過一個(gè)結(jié)構(gòu)體,把工程的消息全部裝到里面,誰要誰就調(diào)ProjectMgr的接口要,拿回去自己挑,需要什么就讀出什么來,自個(gè)初始化自個(gè)。各個(gè)數(shù)據(jù)結(jié)構(gòu)對(duì)象弄成static的,工程打開或參數(shù)改變的時(shí)候ProjectMgr更新它,然后ProjectMgr通知相關(guān)部門讓娃娃們都來取最新的工程信息。第二個(gè)打算就是,ProjectManager只提供工程文件的路徑,誰要給誰,誰需要誰自己解析去,這樣把耦合徹底解開了。
娃娃們還需要長(zhǎng)點(diǎn)本事才能做到主動(dòng)初始化,怎么辦呢?找個(gè)好師傅吧。CPlugIn,中間的方法NotifyProjectOpen, NotifyProjectClose都做了是實(shí)現(xiàn),全部直接return。誰需要初始化自己,找InterfaceMgr要PrjMgr指針,找PrjMgr要信息,自個(gè)初始化自個(gè)去。
誰是相關(guān)部門呢?
InterfaceMgr人人向他注冊(cè)指針,可以兼職。娃娃注冊(cè)自己時(shí),同時(shí)把自己的父類指針CPlugIn也注冊(cè)進(jìn)去。PrjMgr一來通知,InterfaceMgr根據(jù)指針列表全部觸發(fā)。這不是很多態(tài),很命令模式,很OO嗎?
----------------------------------------------------------
剩下的部門是最復(fù)雜的,所有的邏輯都在界面里,實(shí)現(xiàn)類只有一個(gè)Show。有的部分一個(gè)連貫的動(dòng)作,分解到兩個(gè)類中。數(shù)據(jù)庫(kù)的接口,層次不清,也很頭痛啊。