题记:正在读《浮现式设计:专业软件开发的演进本质》(荣获第19届Jolt生产力大奖)一书,顺手写下了一点自己的感想与浅见,是以为记。
使用与创建分离原则是我以前没有接触的,说起来很易于理解,即分离对象的创建和使用职责,在一个系统中,限制任意实体A与任意实体B之间的关系,A可以创建B,或者A可以使用B,但A不能既创建又使用B。通过这样的分离,使得创建和使用被独立开了,如果创建方式发生变化,那么不会影响到使用方;如果使用方式发生变化,也不会影响到创建过程。
比如有如下的类:
任务管理器通过任务调试器来完成一些事情,二者是独立的,有各自的生命周期,如果如图中所示来编码,则会让任务管理器承担任务调试器的生命周期维护工作,同时也让任务管理器与具体的任务调度器类型增加耦合,没有充分发挥面向对象的多态特性。
如果改成:
Void doSomething(TaskScheduler scheduler){
Scheduler.shcedule();
}
则一方面任务管理器不用增加额外的对调度器的管理职责,另一方面也与具体的调度器类型进行了解耦,从而不关心调度器的创建过程,是一种创建与使用分离原则的体现。
那么创建工作去哪了呢,当然我们有很多的方式可以解决对象创建的问题,工厂模式也好,静态方法也好,创建的职责集中在一起,也可以利于条件创建或从外部属性动态决定创建类型。
不过我想,这个原则不应该到处都用,毕竟一个软件中有太多如上图所示的用法了,如果都这样进行创建与使用分离,会引入非常多的工厂类或工厂方法,反而会把代码结构搞得更复杂。其实根本上来说,是否采用这种方式,还是取决于这样做所能带来的价值。设计人员要对创建的可变性进行一些分析和设计工作,如果创建是不可变的,那就不用舍近求远了,原则是指导,但什么时候要应用,还是取决于应用后能否带来更大的价值。
对于开闭原则,依赖倒置原则以及Gof提出的面向接口设计、优先使用组合而非继承等原则,有太多的书籍在说,就不再重复了。
总之,原则和智慧能带给我们很多帮助,在总体上给予指导,但最终还是要看实践,要在具体的环境中做出取舍和平衡。
——欢迎转载,请注明出处 http://blog.csdn.net/caowenbin ——