俞心禹的面向对象概念

来源:互联网 发布:免费wifi mac版 编辑:程序博客网 时间:2024/05/21 10:59

         从60 年代的软件危机,到今天传统软件工程方法处处碰壁的处境,都说明一个问题:软件不软(Software is Hard)[Martin, 95]。说实话,软件是一块硬骨头,真正开发过软件的人都会有此感觉。一个应用总是包含无数错综复杂的细节,而软件开发者则要把所有这些细节都组织起来,使之形成一个可以正常运转的程序,这实在不是一件简单的事。
        为什么会这样?
        用户很容易抽象地表达自己的需求,而这种抽象却很难转化为程序代码。软件不软,因为很简单的设想也需要大量的时间去实现;软件不软,因为满足用户的需求和期望实在太困难;软件不软,因为软件太容易让用户产生幻想。
        而另一方面,计算机硬件技术却在飞速发展。从几十年前神秘的庞然大物,到现在随身携带的移动芯片;从每秒数千次运算到每秒上百亿次运算。当软件开发者们还在寻找能让软件开发生产力提高一个数量级的“银弹”[Brooks, 95]时,硬件开发的生产力早已提升了百倍千倍。这是为什么?
        硬件工程师们能够如此高效,是因为他们都很懒惰。他们永远恪守“不要去重新发明轮子”的古训,他们尽量利用别人的成果。你看到有硬件工程师自己设计拨码开关的吗?你看到有硬件工程师自己设计低通滤波电路的吗?你看到有硬件工程师自己设计计时器的吗?他们有一套非常好的封装技术,他们可以把电路封装在一个接插件里面,只露出接口。别人要用的时候,只管按照接口去用,完全不必操心接插件内部的实现。
        而软件工程师们呢?在STL成为C++标准之前(甚至之后),每个C++程序员都写过自己的排序算法和链表,并认为自己比别人写得更好,真是令人伤心。
        OOD可以帮助它稍微“软”一点。OOD为我们提供了封装某一层面上的功能和复杂性的工具。使用OOD,我们可以创建黑箱软件模块,将一大堆复杂的东西藏到一个简单的接口背后。然后,软件工程师们就可以使用标准的软件技术把这些黑箱组合起来,形成他们想要的应用程序。
        现在我们则通常把它们称为“组件(component)”。类属是由被称为类(class)的实体组成的,类与类之间通过关联(relationship)结合在一起。一个类可以把大量的细节隐藏起来,只露出一个简单的接口,这正好符合人们喜欢抽象的心理。所以,这是一个非常伟大的概念,因为它给我们提供了封装和复用的基础,让我们可以从问题的角度来看问题,而不是从机器的角度来看问题。软件的复用最初是从函数库和类库开始的,这两种复用形式实际上都是白箱复用。到90年代,开始有人开发并出售真正的黑箱软件模块:框架(framework)和控件(control)。框架和控件往往还受平台和语言的限制,现在软件技术的新潮流是用SOAP 作为传输介质的Web Service,它可以使软件模块脱离平台和语言的束缚,实现更高程度的复用。但是想一想,其实Web Service 也是面向对象,只不过是把类与类之间的关联用XML来描述而已。在过去的十多年里,面向对象技术对软件行业起到了极大的推动作用。在可以预测的将来,它仍将是软件设计的主要技术——至少我看不到有什么技术可以取代它的。
        什么是OOD?面向对象设计(Object-Oriented Design,OOD)是一种软件设计方法。
        决定你要的类;
        给每个类提供完整的一组操作;
        明确地使用继承来表现共同点;
       OOD 的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD 的方法来设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不应该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。