面向对象设计原则——谁拥有数据,谁就对外提供操作这些数据的方法。
首先,我很认同这一点,彻底让我理解这点的是张老师举的列车司机刹车和人用手关门的例子,
刹车时,司机并没有具体操作怎么去刹车,而是由列车自己去完成的,人只是踩刹车给列车一个信号,或者说一个功能实现的请求,真正完成刹车的是拥有刹车系统的列车,只是列车是按照我们司机的指示操作刹车的而已;
人用手关门,人自己没法关门的,是门自己通过自身旋转关上的,人只是给了操作信号,门接收到了这个信号,在人外力的协助下转动自己完成关门动作的。
这两个例子很好让人理解面向对象是的这个设计原则。但老师提到的在黑板上画圆的例子我就要提点不同意见了。
人在黑板上画圆这个例子却不好分清谁提供了完成画圆的方法,是圆么?个人认为不是,画圆的参数,直径和位置等等信息可是在人脑海中的,不是圆拥有的,完成画圆这个动作可是完完全全是由人完成的,更何况圆只是最后的结果,圆都没有出来呢,怎么提供操作方法啊?
同样的,售票员统计收获小票的金额这个例子,也是让人老师解释的总有些别扭的。
我认为,对于人在黑板上画圆这个例子,可以将画圆的工具当作圆心和半径数据的拥有者,让其提供对数据的操作方法,这里当然就是粉笔(如果想精准画圆则可以考虑用圆规)了,而没有粉笔我们也没法画出圆让其显示出来的。另外,我们将一个方法交给一个没有成形的事物--未画出来的圆,也不利于我们程序的更新升级,检查错误呀,圆如果作为模式封装了方法和数据,对外提供操作,我们还不好改变圆心和半径的数据,圆先的自毁旧的自己,再创造新的自己,那样,效率能高么?麻烦能少么?
列车司机刹车的例子,没有将数据方法封装到“刹车”这件事上,而是封装给车;人关门没有将数据方法封装在“关门”这件事上,而是封装给了门;
所以,我想对这个原则补充一点,“谁拥有数据,谁就对外提供操作这些数据的方法”,但是要尽量回避将数据和方法封装到我们的目标事物上。
一点粗略看法,希望能和大家讨论讨论。
|