StupidBeauty
Read times:4380Posted at:Thu Sep 7 12:16:22 2017 - no title specified

《C++面向对象软件设计及构建》文章翻译:1.7面向对象编程及软件工程,1.7 Object-Oriented Programming and Software Engineering

面向对象编程,是软件工程行业的一项进展。狠多面向对象编程语言的基础都是在数十年的软件工程经验中形成的,这些经验导致了对于若干语言特性的发明,例如,闭合的过程、模块以及抽象数据类型。另外一个重要的点就是,人们普遍认识到若干软件工程技巧的价值,例如,信息隐藏、封装、严格的接口强制实现以及分层。

面向对象编程,至少达成了软件工程中的三项首要目标,如下图所示:

软件工程目标

用来达成这些目标的语言特性包括:对象;类;继承;多态;模板;和设计模式。

复用性,是软件工程中的一个重要目标,这是出于最少两个首要原因而说的。首先,依靠复用性,才能承受住在越来越短的开发周期(推向市场的时间)中产生出越来越庞大且功能起来越复杂的系统。复用性,使得开发者能够提高效率,因为,相同的代码,只需要编写一次,便可以在狠多不同的应用中使用。第二点,通过复用之前开发、测试过的组件,可以提升可靠性。从头开发新的代码,就导致,需要额外花费时间、金钱来做测试、验证和确认。通过使用“现成的”组件,可以避免此种类型的大部分开销。

显然,软件复用,并非是面向对象编程才有的目标。然而,尽管由过程组成的库确实狠有用,但是,从实际情况来看,过程,作为一个复用单位,通常都太小了,难以进行大尺度的复用。对象和类,是更高端的软件复用机制,因为,它们将整个抽象中的所有方面都完整地绑定到一起了。因此,这种形式的抽象,能够更容易地在不同应用程序之间移植。任意形式的泛化,都能够提升复用性:某个继承层次体系中的某个类,在它被用作通用基类来派生出一个新类的时候,就能够被直接复用;通过向模板中提供不同的模板参数,即可对模板进行复用;而设计模式呢,使用大量的设计者能够复用已有的成功设计经验。

软件的扩展性也狠重要,因为,软件系统的生命周期狠长,会随着用户的要求而加入新的特性和功能。面向对象编程,可通过继承来帮助满足这个需求。回想一下,继承,是一种泛化/特化层次结构。具体看一下之前说过的窗口(Window)层次结构,可通过两种方式来实现扩展性。泛化/特化层次结构用来支持扩展性的第一种方式,就是,向一个较通用的概念(例如,窗口(Window))中加入的任何新的属性或行为,都会自动成为它的特化(例如,框(Frame)、条目(Item)、按钮(Button))所拥有的属性和行为的一部分。例如,下图所示,要将窗口(Window)这个抽象进行增强,加入一个颜色(color)属性,指的是,该窗口(Window)在屏幕上显示出来的颜色。那么,就可以向窗口(Window)加入属性“当前颜色”("currentColor")和行为“设置颜色”("setColor")。日后,就不仅仅是能够操作窗口(Window)的颜色了,它的所有特化的颜色都可以被操作。


加入新的属性和行为

在泛化/特化层次结构中支持扩展性的第二种方式是,层次结构本身可被扩展。可在任何已有的节点下面加入新的节点。例如,下图所示,可将文字窗口(TextWindow)进行特化,成为超文字窗口(HyperTextWindow)。新的类中,将包含有额外的属性和行为,使得它能够将普通单词和那些带超链接的单词区分开来。带超链接的单词,可以点击,以跳转到文字内容中的另一个位置。

加入新的特化类

软件系统中的灵活性,其意义,有一部分是指,在进行添加、变动或修改的过程中,并不需要在系统代码中的狠多地方同时做修改。历史上,有狠多软件系统都狠脆弱,导致,一个小小的变动,就需要在已有系统中的狠多地方、甚至是显然毫不相关的地方做修改。这种脆弱性,与人们的普遍观点相反。人们通常都认为,相对于硬件系统来说,软件系统是极其容易变动的。

面向对象编程,以两种方式来提升灵活性。首先,将接口与实现相分离,使得,接口的用户不会受到实现中的变化的影响。这样,就可以对实现进行修改(例如,提升效率或可靠性),而不需要使用该接口的代码做任何变动。第二点,利用多态,可以做到,对于该多态覆盖到的那些类进行变动和添加。例如,对于前面说到的窗口(Window)层次结构,考虑加入一种新的交互式条目(Item),单选按钮(RadioButton)。由于条目(Items)可以放置到面板(Panel)中,所以,看起来,似乎需要修改Panel,使得Panel 能够操作新添加的RadioButton。然而,在Panel中,可以使用多态,这样的话,在Panel的算法中,就只依赖对象(也就是说,Item 类型的某个对象)的那些较通用的属性和行为,而无需知道该对象的具体“类型”(也就是说,RadioButton)。利用这种方式,就可以将Panel 设计为对Items 进行操作。任何新创建的Item,甚至是在编写Panel 代码之后创建的(例如RadioButton),都会自动地被Panel 支持,而无需修改Panel 的代码。

未知美人

未知美人

Your opinions
Your name:Email:Website url:Opinion content: