4.2.1 面向对象
传统的软件开发方法出现在20世纪70年代,在80年代被广泛采用,其中最据代表性的就是结构化的分析和设计方法。这种开发方法在一些大型的系统中,特别是政府相关的大型应用领域中取得了一定的成功,在这些项目中强调开发过程的有组织性和开发设计文档的完备和充分。但是事情的发展往往不像人们想象的那样,由于软件的规模、复杂性等方面远远超过人们的预料,大型软件开发中的许多问题,比如开发效率低、产品质量差、产品难以维护、软件可移植性差、开放费用难以估计、开发时间严重超期等都得不到解决。软件自身的特点也说明了软件开发的复杂性与困难性。首先,软件的开发是人们的一种智慧活动,它不是自然规律,无法像一些规律一样表示为公式或者定律,很难找到一种好的方法和工具来刻画软件系统的内在特征和规律。其次,软件系统中的各个组成元素之间存在难以确定的相互作用关系,任何两个元素都可以存在交互,而且不受外界的限制,当元素数目不断增加,元素之间可能的交互关系数量是难以想象的。第三,软件边界的不确定性,人们总是希望软件帮助他们完成更多的事情,随着这种想法,人们总是要求软件的功能不断地强大,这就使得软件不断地变化才能满足人们的需要,这无形中使软件变得愈来愈复杂。最后,大型的软件通常具有较长的生命周期,尤其在当今硬件的更新速度越来越快,这就使得一个软件面对硬件变化的机会越来越多,一个软件面对硬件的更换如何能够保持自身稳定,减小自身调整,使得软件的设计更加复杂。
针对软件的这些复杂性,面向对象技术被人们提出了。面向对象的技术充分体现了对复杂问题进行分解、抽象、模块化、信息隐蔽等思想,从而有效地提高了软件的开发效率,缩短了软件开放的时间、提高了软件的质量、有效地控制了软件的复杂性。在面向对象的技术中有很多传统软件开发方法中没有的概念。
1.抽象
从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫做抽象。抽象是形成概念的必须手段。抽象强调实体的本质和内在的属性。使用抽象可以尽可能避免过早考虑一些细节。类实现了对象的数据(即状态)和行为的抽象。
2.对象
对象是人们要进行研究的事物,一般对象都具有属性和对属性进行操作的方法,从最简单的整数到复杂的飞机等均可看做对象,对象不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
3.类
类是说明一系列拥有相同属性、操作、方法、关系、行为的对象的集合。类的概念可以是现实世界的东西,也可以是含有算法和计算机实现的概念。对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。类的属性,是对象的状态的抽象,用数据结构来描述类的属性。类的操作是对象的行为的抽象,用操作名和实现该操作的方法来描述。类的语义和相互关系在程序执行前就已经被定义好了,而对象是在程序执行时被创建和删除的。
4.封装
封装就是把对象的属性和方法放在一起,形成一个相对独立的系统单位,它使系统内部细节得到掩盖,使用户只能看到这一封装系统留下的与外部沟通的接口。封装对用户和系统内部细节都提供了保护,用户不会受到系统内部变化的影响,使用户在使用中得到保护;而通过封装,用户也无法直接修改系统内部的细节,对系统无形中也提供了保护。对象是封装的最基本单位,封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰、更为有力。
5.继承
继承性是子类自动享有父类的数据结构和方法的机制,它是类之间的一种关系。在定义一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
继承性是面向对象程序设计语言不同于其他语言的最重要的特点,是面向对象技术和非面向对象技术的一个重要区别,在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,它简化了对象、类的创建工作量,使公共的特性能够共享,增加了代码的可重用性。
子类若只继承一个父类的数据结构和方法,则称为单重继承。
子类若继承了多个父类的数据结构和方法,则称为多重继承。
在子类中可以增加或者重新定义父类中的属性和方法,重新定义被称为覆盖,即子类中重新定义的属性或方法覆盖了父类中的属性或方法。
6.多态
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应相同的消息,它增强了软件的灵活性和重用性。
面向对象技术把一个复杂的问题分解成一系列相对简单的问题,通过抽象,忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面,从而简化问题。面向对象还通过封装把模块内部的实现细节与外界隔离,将系统中不稳定的部分封装起来,把相对稳定的接口呈现在用户的面前,使得系统不可避免地变化隐蔽起来,减小了对系统整体结构的威胁。面向对象还尽可能地在各个模块之间做到高内聚、低耦合。高内聚强调功能实现多在模块内部完成,低耦合则是尽量降低模块之间的联系,防止出现犬牙交错的调用关系。系统的各个模块尽可能具有较大的独立性。换句话说,希望这样设计软件结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单,可方便地把不同场合下写成的程序模块组合成软件系统。这样一个复杂的问题被面向对象方法变得更加简单,更加容易被人们所理解和控制。
与传统的结构化软件开发方法相比,面向对象软件开发方法在描述和理解问题时采用的方法截然不同。它的基本思想是对问题进行自然分割,以便更加接近人类思维的方式建立问题的模型,从而使设计出的软件尽可能直接地描述现实世界,具有更好的可维护性,能适应用户需求的变化。UML模型能很好地对应面向对象程序语言的源程序,因此是对面向对象程序语言建模最好的选择。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。