Chapter说到纠缠不清的工程管理器的问题。
很多模块都需要在工程打开之时,获取一定的信息,比如工程是新建的还是打开的,临时目录在哪里,工程目录又在哪里。
工程管理模块就像个奶妈,把一系列的信息从XML文件或者从用户刚刚输入的信息都进来,然后再一个个的去NotifyProjectOpen。工程关闭之时在挨个通知他们要关灯了,NotifyProjectClose。怪不得耦合度高啊,全是被动式初始化,能不高吗?
修改方案:
干脆,奶妈下岗吧,最好自己的事,别人的事少管。有了状况通知专门的部门专门的人去管。ProjectMgr负责解析工程文件,并把自己的指针注册到InterfaceMgr,有MagicString的都可获取。需要一个通信协议,让各位断奶的模块来获取自己需要的东西。有两种打算,一个就是通过一个结构体,把工程的消息全部装到里面,谁要谁就调ProjectMgr的接口要,拿回去自己挑,需要什么就读出什么来,自个初始化自个。各个数据结构对象弄成static的,工程打开或参数改变的时候ProjectMgr更新它,然后ProjectMgr通知相关部门让娃娃们都来取最新的工程信息。第二个打算就是,ProjectManager只提供工程文件的路径,谁要给谁,谁需要谁自己解析去,这样把耦合彻底解开了。
娃娃们还需要长点本事才能做到主动初始化,怎么办呢?找个好师傅吧。CPlugIn,中间的方法NotifyProjectOpen, NotifyProjectClose都做了是实现,全部直接return。谁需要初始化自己,找InterfaceMgr要PrjMgr指针,找PrjMgr要信息,自个初始化自个去。
谁是相关部门呢?
InterfaceMgr人人向他注册指针,可以兼职。娃娃注册自己时,同时把自己的父类指针CPlugIn也注册进去。PrjMgr一来通知,InterfaceMgr根据指针列表全部触发。这不是很多态,很命令模式,很OO吗?
----------------------------------------------------------
剩下的部门是最复杂的,所有的逻辑都在界面里,实现类只有一个Show。有的部分一个连贯的动作,分解到两个类中。数据库的接口,层次不清,也很头痛啊。
posted on 2008-08-14 17:47
创建更好的解决方案 阅读(1145)
评论(0) 编辑 收藏 引用 所属分类:
C++专栏 、
软件设计