下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

如何让面向对象设计产生优秀的设计?

作者:课课家教育the     来源: http://www.kokojia.com点击数:775发布时间: 2017-06-04 08:00:39

标签: 面向对象设计软件工程软件开发

软考,您想通过吗?一次通过才是硬道理

  设计其实是跟设计者主观意愿紧密联系的,而对小编这种没有多少艺术细胞的人来说,只会说好不好看,并不懂设计者的方法理念,但是呢,不可否认的是设计者使用面向对象的设计方法,可以产生很棒的设计,但也很容易搞出很糟糕的设计.这是为什么呢?接下来大家就跟着小编来看一看吧!

  面向对象特征概述

  面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。对象是由数据和操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。面向对象程序设计具有抽象性、封装性、继承性和多态性等特征。

  抽象:指从事物中舍弃个别的、非本质的特征,而抽取共同的、本质特征的思维方式。

  封装:将数据和代码捆绑到一起,避免了外界的干扰和不确定性。对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。

  继承:让某个类型的对象获得另一个类型的对象的特征。通过继承可以实现代码的重用:从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性。

  多态:指一般类和特殊类可以有相同格式的属性或操作,但这些属性或操作具有不同的含义,即具有不同的数据类型或表现出不同的行为。

如何让面向对象设计产生优秀的设计?_面向对象设计_软件工程_软件开发_课课家教育

  StephenCJohnson:面向对象的模型使得我们可以用聚少成多的方法来写程序。这通常是说,它提供了一种用结构化的方法写出烂面条般程序的方法。

  一般观点认为,面向对象设计方法比传统的结构化设计方法要好。对象是“更好的模块”,他把属性和方法放在了一起,使用少量的接口对内部信息进行封装。但对象确实是“更难把握的模块”。面向对象有时候为坏的设计提供了一个好的理由。当前有些反对面向对象的声音,就是因为此。面向对象的设计方法优点和缺点都十分突出的,也许是因为越强大的东西越难以掌握吧。要更好地使用面向对象必须了解面向对象的缺点。

  面向对象为全局变量辩护

  大家都知道使用全局变量是糟糕的设计,因为全局变量带来了过分地耦合,应该尽量的避免。许多初学者,在使用面向对象的语言之后,喜欢把设计出的全局变量,封装在一个对象里面,在定义几个接口函数对这些全局变量访问,这时全局变量好像消失了。甚至,一些对见多识广的程序员,这时会使用单件模式,把一个或多个全局变量放到一个全局唯一的对象中。没有了全局变量,程序员心安理得,甚至为自己使用了设计模式而骄傲。可是全局变量其实没用消失,而是使用一个“单件对象”的面目把自己隐藏起来,他所带来的过分耦合没用消失,甚至是加重了:如果你把几个无关的全局变量封装到了一起,原来共享一个全局变量的模块,现在要和更多的模块共享这个全局对象。

  过度使用胶水层封装别人的代码

  在代码中我发现,有许多helper形式的类。在多个人开发的项目中,许多程序员不喜欢直接使用别人提供的接口。而是按照自己的调用习惯进行封装。甚至常常创建一套新的逻辑来封装旧的逻辑,甚至创造更复杂的逻辑来隐藏一个简单的逻辑。结果这个厚厚的胶水层,增加了整个系统的复杂度,特别是增加了debuging的难度。程序员很可能是担心别人的东西发生变化,而使用这个胶水层把自己保护起来,希望:万一别人发生变化,自己只修改这个胶水层就可以了。往往实际的效果是:因为这个胶水层要调和双方的逻辑,当发生变化时,不太容易修改它。在传统的面向过程的语言中,这种情况就相对较少,传统的语言更鼓励对别人的函数进行简单和直接地调用。

  所有的基类都定义成虚类(或接口)

  “接口与实现分离”,程序员一但掌握便开始坚信的哲学。“要为未来变化准备好”,将来我可以在不改变接口的情况下,添加一个子类实现,而对其他模块不产生影响。其实,基类还是是实现子类公共行为的地方。把子类的公共逻辑放到基类里面,子类就不需要重复实现这些逻辑。这样对未来准备得更好,当添加一个新的子类实现时,你不需要重复实现已经有的功能。

StephenCJohnson:面向对象的模型使得我们可以用聚少成多的方法来写程序。这通常是说,它提供了一种用结构化的方法写出烂面条般程序的方法。    一般观点认为,面向对象设计方法比传统的结构化设计方法要好。对象是“更好的模块”,他把属性和方法放在了一起,使用少量的接口对内部信息进行封装。但对象确实是“更难把握的模块”。面向对象有时候为坏的设计提供了一个好的理由。当前有些反对面向对象的声音,就是因为此。面向对象的设计方法优点和缺点都十分突出的,也许是因为越强大的东西越难以掌握吧。要更好地使用面向对象必须了解面向对象的缺点。    面向对象为全局变量辩护    大家都知道使用全局变量是糟糕的设计,因为全局变量带来了过分地耦合,应该尽量的避免。许多初学者,在使用面向对象的语言之后,喜欢把设计出的全局变量,封装在一个对象里面,在定义几个接口函数对这些全局变量访问,这时全局变量好像消失了。甚至,一些对见多识广的程序员,这时会使用单件模式,把一个或多个全局变量放到一个全局唯一的对象中。没有了全局变量,程序员心安理得,甚至为自己使用了设计模式而骄傲。可是全局变量其实没用消失,而是使用一个“单件对象”的面目把自己隐藏起来,他所带来的过分耦合没用消失,甚至是加重了:如果你把几个无关的全局变量封装到了一起,原来共享一个全局变量的模块,现在要和更多的模块共享这个全局对象。    过度使用胶水层封装别人的代码    在代码中我发现,有许多helper形式的类。在多个人开发的项目中,许多程序员不喜欢直接使用别人提供的接口。而是按照自己的调用习惯进行封装。甚至常常创建一套新的逻辑来封装旧的逻辑,甚至创造更复杂的逻辑来隐藏一个简单的逻辑。结果这个厚厚的胶水层,增加了整个系统的复杂度,特别是增加了debuging的难度。程序员很可能是担心别人的东西发生变化,而使用这个胶水层把自己保护起来,希望:万一别人发生变化,自己只修改这个胶水层就可以了。往往实际的效果是:因为这个胶水层要调和双方的逻辑,当发生变化时,不太容易修改它。在传统的面向过程的语言中,这种情况就相对较少,传统的语言更鼓励对别人的函数进行简单和直接地调用。    所有的基类都定义成虚类(或接口)    “接口与实现分离”,程序员一但掌握便开始坚信的哲学。“要为未来变化准备好”,将来我可以在不改变接口的情况下,添加一个子类实现,而对其他模块不产生影响。其实,基类还是是实现子类公共行为的地方。把子类的公共逻辑放到基类里面,子类就不需要重复实现这些逻辑。这样对未来准备得更好,当添加一个新的子类实现时,你不需要重复实现已经有的功能。

  举个例子:

  设计一个类ConfigInfo,其对象保存程序需要的配置信息。设计合适的数据结构,对象aConfigInfo把配置信息从外部的存储介质加载到内存中。

  其他模块就可以通过aConfigInfo提供的接口访问这些配置信息。

  当接受到配置信息更新信号时,发“重新加载”的消息给aConfigTable。

  存储配置信息的存储介质可能是文本文件,也可能来自数据库中。分别使用两个子类实现:ConfigDbImp和ConfigFileImp。

  如果把ConfigInfo定义成接口,ConfigDbImp和ConfigFileImp会重复实现存储配置信息的数据结构,重复实现内存中配置信息的访问接口,两个子类会有许多相似的代码。如果这些行为都交给父类实现,每个子类就可以只重写一个load()操作:把配置信息从外部的存储介质加载到内存。另外,如果这个东东用在多线程环境,线程同步的所有逻辑也可以交给基类ConfigInfo实现。如果将来出现了一个新的配置文件格式,只需要定义一个新子类并重写load操作。

  其实,在面向对象设计中,是有一些原则需要我们熟知的,然后才能更好的运用它,让设计不那么糟糕!

  1.开放封闭原则

  2.里氏转换原则

  3.依赖倒转原则

  4.组合/聚合原则

  5.接口隔离原则

  6.“迪米特”法则

  7.单一职责原则

其实,在面向对象设计中,是有一些原则需要我们熟知的,然后才能更好的运用它,让设计不那么糟糕!    1.开放封闭原则    2.里氏转换原则    3.依赖倒转原则    4.组合/聚合原则    5.接口隔离原则    6.“迪米特”法则    7.单一职责原则

  小编结语:

  一个好的设计需要靠理念支持,凭技艺来凸显,这个在面向对象设计中也不例外。当前,面向对象方法几乎覆盖了计算机软件领域的所有分支。例如,已经出现了面向对象的编程语言、面向对象的分析、面向对象的设计、面向对象的测试、面向对象的维护、面向对象的图形用户界面、面向对象的数据库、面向对象的数据结构、面向对象的智能程序设计、面向对象的软件开发环境和面向对象的体系结构等。此外,许多新领域都以面向对象理论为基础或作为主要技术,如面向对象的软件体系结构、领域工程、智能代理、基于构件的软件工程和面向服务的软件开发等。

  更多内容请登录课课家教育官网进行咨询!

赞(24)
踩(0)
分享到:
推荐查看
华为认证网络工程师 HCIE直播课视频教程