面向对象编程:这里我说了算!



  英文原文:I give the orders around here! 

  自从 9 岁那年得到第一台 Commodore 64 家用电脑起,我就开始编程。然而,当面对如何写出好的代码时,我仍然感觉自己还有很多要学的。

  在探索如何提高自己的过程中,我学了很多种语言。大多数是以面向对象为主的(OO)。

  然而,让我惊讶的是,在我读过的大多数书本、杂志和网上文章中,有着大量遭透了的被当作面向对象例子的代码。

  这些代码中,我看到的最多被违反的原则是“命令,不要去询问(Tell, Don’t Ask)”原则。这个原则讲的是,一个对象应该命令其它对象该做什么,而不是去查询其它对象的状态来决定做什么(查询其它对象的状态来决定做什么也被称作‘功能嫉妒(Feature Envy)’)。在面向对象的编程中,一个对象被定义成由对象状态和操作这个状态的方法组成。

  在《Holub on Patterns: Learning Design Patterns By Looking At Code》这本书里,Allen Holub 在第一章里有一节的标题是“为什么 getter 和 setter 方法有害”。他在 JavaWorld 上的一篇文章里也谈论了这个问题。对所有的面向对象的程序员来说,这应该是一篇“必读”文章。

  我有一些程序员同事,他们在一个对象上第一步声明了属性后,第二步就是添加 getter 和 setter 方法。JavaBean 规范对于这种文化的推广负于很大的责任。人们认为这是一种能让你写出可复用的模块化组建的好方法,但这已是很多年前的事了,时过境迁。

  写带有 getter 和 setter 方法的类会导致过程式的代码。通过 getter 和 setter 来获取数据进行操作的逻辑最终会遍布整个应用,进而经常导致应用内的重复(这违反了另外一个原则:DRY——不要自我重复(Don’t Repeat Yourself))。这会致使产生很难维护的代码,当你对一个类做任何修改时,都会在整个应用内造成连锁式的牵连。

  用这种方式来暴露数据还会妨碍你重构你的类,因为对这样的属性的任何修改都意味着会影响到访问了这个属性的其它类。

  违反“命令,不要去询问”原则的另外一个副作用是,你的探询最终变成严重依赖状态信息并带有很多前提条件。这会让人很难理解你究竟询问的是什么。

  你很可能会最终违反的第三个原则是,尽少知道(Least Knowledge)原则,也叫做得墨忒耳定律(Law Of Demeter)。这个定律可以总结为下面一句好:

一个类应该只跟它的直接朋友通话,不要跟陌生人说话。

  在类里面加入 getter 方法,你的代码最终会写成这样:

if (person.getAddress () .getCountry () == "Australia") {

  这违反了得墨忒耳定律,因为这个调用者跟 Person 过于亲密。它知道 Person 里有一个 Address,而 Address 里还有一个 country。它实际上应该写成这样:

if (person.livesIn ("Australia")) {

  这并不违反得墨忒耳定律,因为这个调用者只跟它的直接朋友 Person 通话,而且它不知道内部情况。从“命令,不要询问”的视角来看,这也是更好,因为确定这个 person 是否居住在 Australia 的逻辑被隐藏到了 Person 里,如果我们改变 Person 里存储国家信息的方式,这将不会影响任何依赖这个信息的其它类。

  另外一个这样写代码的好处是,它把我们的意图显示的很清楚。这是我会在以后的时间里讨论的另外一个话题。

  为了避免违反“命令,不要去询问”原则,有几样事情你要记在心里。

  • 在 IDE 里敲击快捷生成键前,询问自己’五个为什么’,问问自己为什么一上来就添加 getter 和 setter 方法。
  • 不要询问对象的状态。要做什么,告诉它们该怎么做。
  • 操作所属的对象拥有这些操作的数据。

  进一步阅读

  我的一个朋友是这个思想的大力倡导者,他用 East Oriented 方式精彩的解释了这个原则。

  《Tell Don’t Ask and the effect on testing》,出自 Steve Freeman 和 Nat Pryce,他们也是 《Growing Object-Oriented Software》,《Guided by Tests》 两本书的作者。


转载自 http://kb.cnblogs.com/page/144474/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值