面向对象基本概念总体设计部石宏峰2004.02面向对象概述开篇语复杂性是软件系统本质的一部分。没有什么抽象处理能够消除软件系统的复杂性,然而,能够生成一种机制来管理这些复杂性。并且,有些困难不是“偶然的”,是软件建造的方法所引起的。改变建造软件的方式将改善这些所谓“偶然的”困难。造成软件复杂性的主因•软件开发工作的现状:–软件越来越庞大,各软件组件之间的互联很复杂–软件开发由个人的创造性活动转变为有组织的团队活动,交流协调工作加剧传统的结构化分析设计和模块化编程导致系统低内聚、高耦合,使系统不灵活也不易维护•造成软件的复杂性的真正原因:–软件的大小不能决定软件复杂程度–高度耦合、低内聚才是造成软件复杂性的主要原因面向对象(Object-Orientation)•面向对象的概念最初是在上个世纪60年代后期由使用SIMULA语言的研究人员提出•真正的面向对象程序设计是在Smalltalk语言中实现的,“面向对象”这个词也是Smalltalk首先提出的•面向对象方法学认为:–客观世界由各种“对象”所组成,任何事物都是对象–每一个对象都有自己的运动规律和内部状态–不同对象的组合及相互作用就构成了我们要研究、分析和构造的客观系统OO方法与结构化方法差异(1)•结构化方法:将一个系统化分为两部分:数据(使用数据模型建模)和功能(使用过程模型建模)。导致数据与设计模型和系统实现(即程序)中的行为分离。•OO方法:将系统定义为一组正在交互的对象。对象可以完成一些事情(功能),也知道一些事情(数据)。OO方法与结构化方法差异(2)举例:学校管理信息系统学生教师教室课程学生选课教师分派课程课程安排教室结构化方法学生对象名字、住址、生日、电话...登记课程、取消课程教师对象名字、住址、生日、电话...教授课程教室对象名称、位置...是否空闲、预定时间段课程对象名称、描述...选课资格、通知选课(取消选课)OO方法面向对象的软件系统构造HouseTreePersonCarHousePersonCarTreeLivesinDrivesRealityModel面向对象方法•很多程序员将面向对象编程(OOP)技术和面向对象(OO)技术混淆•面向对象不仅是一种技术,面向对象技术是一门博大精深的学问,它是一种方法论或者说是一种世界观•人们对面向对象方法的研究与运用,不再局限于编程阶段,而是从系统分析和系统设计阶段就开始采用面向对象方法•面向对象方法已经发展成一种完整的方法论和系统化的思想体系•面向对象不仅适用于软件设计开发,也适用于解决硬件、组织结构、商业模型等多种领域的问题“练器”与“练气”•会使用面向对象的编程工具并不等于就掌握了面向对象的思想和方法•程序设计语言仅仅提供一个方法学的表示,而真正的方法是从生活、工作、学习等中提升而来的,这个也真是程序设计语言所做不到的•有人即使选择了面向对象的利器,也无法成为真正的高手。因为他看重的是“器”的好坏,忽略的是“气”的修炼•掌握面向对象的思想如同获得练气的真谛,它的重要性往往胜过了对编程语言的选择•练器虽易,但难成高手。练气虽好,但见效缓慢。内外兼修,终成正果面向对象基本概念总述•对象•类•实例•类的基本关系(继承、关联、聚合)•接口•封装•多态性对象(Object)•对象指的是一个独立的、异步的、并发的实体,它能“理解一些事情”(即存储数据)、“做一些工作”(即提供服务),并“与其它对象协同”(通过交换消息)•对象是对问题域中某个实体(任何有明确边界和意义的东西包括具体的物理实体和人为的概念)的抽象•软件系统中的对象–对象是一个接收和发送消息的黑盒子–对象包含编码(CODE)和数据(DATA)–CODE是一段有序的计算机指令,决定对象的行为–DATA是指令要操作的信息,即对象的内容–CODE与DATA在对象内部是分离的•对象是数据结构及其上的操作的封装体类(Class)•相似对象(具有相同属性和行为)的一种分类•是一张制造对象的蓝图,对象通过类来定义。类名属性方法•属性(Attribute):类知道的事情;一些数据或信息(内容)•方法(Method):类完成的事情;一个操作或成员函数(行为),有参数和返回值实例(Instance)•实例:按照类“样板”建立的具体对象,就是实例。实例是一个具体的对象(“对象”这个术语有泛指的含义)•实例化:创建对象的过程类、实例与对象的联系与区别•类是一个模板、蓝图•实例和对象都是根据类模板创造出来的•实例指的是一个具体的实例•对象是泛指实例,并不指出是哪个具体的实例类关系——继承(1)(inheritance)•继承:表示两个类之间是“isa”、“islike”或“iskindof”的关系–子类(subclass):如果类B继承自类A,B就是A的子类–父类(superclass):如果类B继承自类A,A就是B的父类类A类B属性继承、方法继承类关系——继承(2)•单继承(singleinheritance):一个类仅从另外一个类中继承•多重继承(multipleinheritance):一个类从另外的一个以上的类中继承•覆盖(override):在子类中重新定义属性和方法•抽象类(abstractclass):不能实例化的类类关系——关联(1)(association)类A类B基数A基数B标签•关联:一个类知道(knows)另一个类:表示两端连接的类存在关联关系:表示关联的方向基数:表示两端关联的对象数(0..1,1,0..*,1..*,n,0..n,1..n)标签:对关联的描述,一般说明关联发生的前提。(可选)类关系——关联(2)•双向关联:两个类互相知道类A基数A基数B标签类B•递归关联:一个类中的对象之间存在关联关系类A基数A基数B标签•多关联:两个类之间存在关多种联关系类A基数A基数B标签1类B基数a基数b标签2类关系——聚合(aggregation)•聚合:是一种特殊的关联。表示两个类之间是ispartof的关联。类A类B基数•组合(composition):是一种强聚合。表示“整体”与各“组成部分”共存。类A类B基数接口(1)(interface)•接口好比一种模板,这种模板定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化•一个对象仅能通过其接口才会被其它对象所了解•类可以实现多个接口并且通过这些实现的接口被索引•接口是一个对象在对其它的对象进行调用时所知道的方法集合•对象的接口描绘了对象能够完成的工作•接口是实现插件化(pluggability)的关键接口(2)Method1M2M3M4…Method1M2M3M4…DataLogicInterfaceClass•接口是对类的轮廓的抽象•接口不变类被使用方式不变•将实现抛开(在没有具体实现的情况下,就确定如何使用类),留下扩展空间封装和信息隐藏(encapsulation&informationhiding)•封装–将操作和数据变量同放于一个类(或对象)中,并使对数据的访问只可通过该类(或对象)本身的操作来进行,外部不能直接作用于该类(或对象)的数据,类(或对象)的通讯只能通过明确的消息来进行–封装是把类或对象的边框涂黑的做法。目的是为了做信息隐藏•信息隐藏:将对象私有信息隐藏,使之不能被外部类直接引用。–隐藏对象知道什么和能做什么的实现方法,即隐藏对象是如何工作的–目的就是限制外部对属性和内部方法的访问。面向对象编程的一条基本原则对象的使用者永远不需要去看对象(黑盒子)的内部多态性(polymorphism)•一个对象能够有多种形式,其他的对象能够与这个对象相互作用而不必知道它具有的确切形式Figruedraw()CricleSquareRectangledraw()draw()draw()Figrue:抽象类“图形”draw():画图方法Circle、Square、Retangle继承Figrue,并重置(或实现)draw()方法。Figure.draw()的输出?面向对象方法总结•区别于传统的结构化方法。传统的软件观点:主动的应用程序操作被动的数据结构;OO的软件观点:相互影响的对象集合•将现实世界中的实体看成是一个个对象,分析对象之间存在着的联系;把这些映射到系统模型中,建立一个基于相互作用的对象的系统模型•使用面向对象技术开发出来的软件结构是建立在现实世界的实体或对象的基础上的,它把软件的功能分散到各个对象中间•建立在客观系统的事物和抽象概念基础上的对象实现了从问题域到解题域直接映射。使得分析设计过程更加直观自然•分布式处理:每个对象将功能和状态封装于自身的内部结构中,同时对象的工作也是自治的,不受时间、地点影响,因而使系统在运算处理上具有分布性•高度的重用性:对象、方法等可重复利用•功能的共享性:通过对象的继承机制使系统的处理能力得到充分发挥面向对象方法的意义•面向对象的方法在技术和管理两个层面均提供了决定软件质量的诸多要素,包括可复用性、可靠性、健壮性、可扩展性、分布性和可存储性等•面向对象直接导致软件系统的强内聚和松耦合,使软件系统易于维护、最大程度避免软件修改时所面临的重重困难•OO软件开发将变得很像机械工程。对象,螺丝、螺母,电子元件、芯片•例行公事般交付一个大型的面向对象软件系统,并节约开发成本•OO就是实现从分析到实现的更加自然的过渡,OO设计更容易理解,推导过程合理严密,减少了人为因素对于个人:OO是一种全新的思考方式对于机构:OO将彻底改变机构内的系统开发文化谢谢!Q&A