2009年2月19日星期四

建模 --- 对称性及传递性

场景:
当用户点击启动后,一个线程T1开始运行某个Job队列中的各个job对象的代码。当用户点击stop按钮时,就需要让线程停止驱动job对象的代码。
T1就叫做JobExecutor, 被执行的工作队列叫做JobSuilt, JobSuilt中的对象就是Job。
现有的系统中,JobExecutor有start(), stop()方法。系统目前不能很好的控制job的停止。

问题:
当时肯定还没有把很多事情想清楚就开始编码了。根本没有很好的建模。当按下停止按钮时。目前的代码只是在想简单的让JobExecutor线程停止下来。而如何通知正在运行的job没有很好的设计。

解决:
start(), stop()是对称性的两个方法。一个很好的思路是:被启动(started)的对象也要有对应的start()方法来响应executor的start操作。被停止的对象也要有stop()方法。
这样这种操作就具有了一致的传递性。

扩展:
当Job遇到问题(Exception, Error之类)需要通知exector时,需要通知executor进行对应处理时,可以把executor传递给Job。但是这样executor和Job就有了较强的耦合。
一个办法就是声明一个接口比如叫JobListener,这个接口不妨定义void processException(Exception e), void processError(), void finished()...,而executor可以实现JobListener接口。
这样就有了从executor到JobListner的双向通讯机制。


《实现模式》这本书中提到了对称性,并把其发在了“原则”性的地位。在建模过程中,你越是能够抽象出真正的Mode(拥有确实是属于自己的属性、方法),发现mode之间真正的关系(Mode之间的关联),你未来的麻烦就越少。