A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 江南 黑马帝   /  2012-6-11 01:28  /  1481 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

面向对象设计原则——谁拥有数据,谁就对外提供操作这些数据的方法。
    首先,我很认同这一点,彻底让我理解这点的是张老师举的列车司机刹车和人用手关门的例子,
    刹车时,司机并没有具体操作怎么去刹车,而是由列车自己去完成的,人只是踩刹车给列车一个信号,或者说一个功能实现的请求,真正完成刹车的是拥有刹车系统的列车,只是列车是按照我们司机的指示操作刹车的而已;
人用手关门,人自己没法关门的,是门自己通过自身旋转关上的,人只是给了操作信号,门接收到了这个信号,在人外力的协助下转动自己完成关门动作的。
     这两个例子很好让人理解面向对象是的这个设计原则。但老师提到的在黑板上画圆的例子我就要提点不同意见了。
     人在黑板上画圆这个例子却不好分清谁提供了完成画圆的方法,是圆么?个人认为不是,画圆的参数,直径和位置等等信息可是在人脑海中的,不是圆拥有的,完成画圆这个动作可是完完全全是由人完成的,更何况圆只是最后的结果,圆都没有出来呢,怎么提供操作方法啊?
     同样的,售票员统计收获小票的金额这个例子,也是让人老师解释的总有些别扭的。

     我认为,对于人在黑板上画圆这个例子,可以将画圆的工具当作圆心和半径数据的拥有者,让其提供对数据的操作方法,这里当然就是粉笔(如果想精准画圆则可以考虑用圆规)了,而没有粉笔我们也没法画出圆让其显示出来的。另外,我们将一个方法交给一个没有成形的事物--未画出来的圆,也不利于我们程序的更新升级,检查错误呀,圆如果作为模式封装了方法和数据,对外提供操作,我们还不好改变圆心和半径的数据,圆先的自毁旧的自己,再创造新的自己,那样,效率能高么?麻烦能少么?
列车司机刹车的例子,没有将数据方法封装到“刹车”这件事上,而是封装给车;人关门没有将数据方法封装在“关门”这件事上,而是封装给了门;
    所以,我想对这个原则补充一点,“谁拥有数据,谁就对外提供操作这些数据的方法”,但是要尽量回避将数据和方法封装到我们的目标事物上。
    一点粗略看法,希望能和大家讨论讨论。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

2 个回复

正序浏览
嘿嘿,这不是享元设计模式吗??呵呵,楼上说的很对呀,就是谁有数据,谁就提供操作响应数据的方法,这是面向对象的思想呀!就比如说,画圆这个方法吧,肯定是圆最明白自己是怎么被画出来的了,所以画圆这个方法当然是要被风转载圆这个类中了,希望楼上的能多看看java的23中设计模式,个人之见,仅供参考
回复 使用道具 举报
个人觉得吧所谓面向对象本身就是一个抽象的东西,跟现实表现出来的现象还是有些不一样的,张老师在讲课的时候也说到了,我觉得面向对象的最重要的精髓吧,就一句话:确定那个属性是谁的?那么操作这个属性的动作就应该定义给谁。像半径的私有属性,虽然人脑里面有,粉笔照着画,但终归不是真正的拥有,我觉得张老师讲得让人很寻味啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马