结构化设计历来备受责备的就是需求和设计之间的鸿沟,以前不是很理解这个鸿沟的原因。现在再看,在结构化设计中模块和模块之间的关系,被紧紧局限于信息流,这限制了对模块之间众多关系的表达,也无法体现模块和模块之间其他的众多关系,包含各种各样的结构、行为、依赖、包含(在结构化设计中这种关系隐含在分层中)、继承、关联关系等等。它仅仅解决了模块在封装和信息隐藏方面的问题。再看面向对象设计方法,充分挖掘了“关系”的表达方式,可以尽可能的将事物之间复杂的关系予以体现,而这些关系是实现设计的关键。可以这样比喻目前为什么面向对象方法如此流行,记得小时候经常在各种杂志上看到许多这样的图画“一个钢球,从高处落下,击中某个翘起的装置,装置受到钢球的冲击,另一端抬起后,原来被截断的水流开始流通,并引发另一个设备开始工作……,最终在另一端的某个蜡烛被点燃”。这就是在工业时代,众多人被机械设计的灵巧和创意所深深吸引的其中一份图画。姑且不论这样的装置是否有实用价值,但它肯定带给构思者无限的快乐和想象力,以至于当时经常可以看到各种各样这样的图画。而面向对象的方法正是因使用对象的概念让设计更接近于上面的各种设备,而让机械设计时代的疯狂和无尽的创造力进入了软件工程师的视野。由于能够充分表达事物之间各种各样的关系(更接近于结构和行为方面),面对对象设计方法在今天创造了一个奇迹,各式各样巧妙的设计实现、设计模式的流行,几乎在永无止境的激发着爱好设计的人们的想象力和创造力。再看最流行的类比:建筑和软件。建筑最主要的特征是什么——结构。这也是为什么建筑能够和软件设计(最终设计都要体现在模块上)进行类比的潜在原因。相比之下,我更倾向于拿机械设计来和软件设计进行类比。
回到结构设计化方法上来,虽然很多人都说结构化设计和面向对象设计没有本质上的区别,那是因为某些关系依然可以通过转换映射到信息流上,但这毕竟绕了一个大弯,而且由于缺乏足够的表达各种关系的能力,极大的限制了软件设计者的想象力和创造力。结构化设计方法使用自顶向下的手段,通过Process的逐层分解来理解和构建系统,然后把Process分配给模块,这里的“分配”这几乎让每一个初次接触结构化设计方法的人大惑不解,似乎模块是Process分解的结果,甚至在如果已知了某些模块时又直接将模块映射成一个黑盒的Process,Process和模块究竟是什么关系?沿着这个思路,很容易陷进“鸡生蛋,蛋生鸡”的困境。而事实是,模块和Process的诞生,两者之间根本没有任何关联,都是独自根据经验所产生的。为什么会产生这样的问题?究其原因,结构化设计方法和我们自出生以来认识事物的方式有着很大的不同。因为打我们一出生,眼里落入的就是各式各样的实体,而我们区分它们主要依靠就是事物各式各样的特征,包括事物不同的结构和特定的行为,而结构化设计方法试图通过信息流及其转换来认识系统,这天生造成了某种障碍。相比之下,面向对象方法则和我们所熟悉的认识世界的方式相吻合,更加的自然。那么结构化设计的优点到底是什么呢?考虑警察破案时,需要根据证人不断的描述犯罪嫌疑人特征对犯罪嫌疑人进行画像的场景,就可以理解结构化设计方法优点在于:当我们面对一个只知道存在各式各样需求,而对系统其它方面一无所知的时候,它可以通过“功能”帮助我们逐步理清需求之间复杂的关系,它天生就有对需求之间重复功能进行汇聚的能力,通过对系统的需求的整体理解,让我们知道系统到底需要做些什么,从而对系统有更清楚的认识,对“需求”的理解和澄清是结构化方法的核心。这样也可以理解为什么结构化设计方法比面向对象设计方法更早的诞生。因为在软件工业的早期,软件系统彼此独立,数量稀少,可以利用的经验非常缺乏,而结构化设计方法则在这种一开始就缺乏经验的时候有着极大的帮助,帮助人们从需求、功能的角度分析和理解系统。
那么,在我们理解结构化设计和面向对象设计的背后,到底隐藏了什么样的秘密,又如何理解其他各式各样的设计方法呢?其实,这个秘密躲藏在我们经常谈起的“差异性”的背后。我们经常谈起差异性,但却很容易忽视和差异性相伴相生的另一面——“共同性”。共同性促使我们对事物进行分类和总结,而差异性则让世界充满了变化,并让这个世界变得更加的复杂而朴素迷离。每一种“共同性”凝聚成一个轴,构成了我们观察世界的“维度”。各种“维度”交织在一起,让整个世界系统变成了一个复杂的“立方体”,这个立方体既不是平面的,也不是三维的,而是一个多维交织的复杂事物。结构化设计方法,抓住了“信息流”和“信息流转换”两个维度,并试图沿着这两个维度理解和认识系统;而面向对象设计方法则采用了“结构、行为”这两个主要的维度(还有其他),引领我们看清世界。每一种方法都试图通过某一个维度或者某几个维度的组合,去帮助我们认识和理解世界,比如面向方面的设计方法、面向服务的设计方法等等。这样再去理解表达方式,当某种表达方式能够表达的维度越多,它所能适应的范围就越广,这样也可以理解为什么目前很多的设计方法,都依靠的是UML,导致大家看不清其和面向对象方法存在的本质区别,也解释了为什么结构化设计方法的表达方式其实限制了我们的想象力和创造力。其实面向对象方法也有其局限性,简单的举例,比如模板编程就抓住了算法结构的纬度。
沿着维度的概念,我们也可以看清楚Java和C#以及C++本身的区别,也可以想象如果Java始终局限于纯面向对象语言的偏执中,很有可能在通用语言的竞赛中落后。再看动态语言Python,抛弃“类型”的维度,只抓住“名字”的维度,带来的极大灵活性,它不需要判断对象的其他维度的特征,只需要有一个相同的名字,程序就可以执行,当然也带来了隐患,但如果认识不到这个维度的差别,很可能将会将这种语言特性,和面向对象语言中的“接口”(专注结构和行为)概念相混淆。其实,“共同性”所构成的“维度”的概念就像一个重磅,可以激发我们对世界包括软件设计许许多多方面的思考火花,剩下的则更多的想象力的竞赛。
分享到:
相关推荐
在实际编程中,面向对象编程广泛应用于软件设计,比如创建复杂的数据结构(如树、图)、设计模式(如工厂模式、单例模式)、构建大型应用程序框架等。了解并熟练掌握面向对象编程,对于提升代码质量和开发效率至关...
此外,软件开发中采用面向对象编程或模块化编程,有利于代码的组织和维护。 在实际工程中,设计者还需要考虑环境因素,如高温、高冲击、振动等,确保硬件和软件的可靠性。同时,符合航空航天领域的标准和规定,如DO...
课程结构上遵循企业开发“流程化”,项目“兴趣化”、教学“项目实战化”、模式“前瞻化”、教材“权威化”、授课“案例化”等国内领先的 1T 工程师培养模式,并且结合科学的考核评价模式。通过全方位课程设计,全面...
由于C语言具有通用性高、结构化程序设计等特点,它为后来的面向对象程序设计语言如C++和Java打下了基础。因此,提高C语言教学的效果,帮助学生掌握C语言的基本语法规则、编译流程和程序设计方法,对于计算机专业学生...
1. **数据库结构**:化探异常数据库分为三个部分——综合异常图形库、异常数据库和异常查证数据库,分别存储图形信息、异常详情和查证结果。 2. **数据源及录入**:综合异常图形库源自甘肃省1:20万地球化学图的矢量...
面向对象编程通过将数据和行为封装在一起,实现了更加灵活和模块化的代码设计。 封装是面向对象的三大特性之一,它隐藏了对象内部的细节,只对外提供公共接口进行交互。在Java中,通过访问修饰符(如private、...
软件开发工厂应用了面向对象程序设计软件工程方法,增强了类库的使用效率,便于开发人员操作。 CAS.CADE的主要功能包括几何造型和可视化操作。在几何造型方面,它提供了基本的二维和三维几何造型功能,对于二维对象...
以上23种设计模式涵盖了面向对象设计的基本原则,它们在不同的场景下发挥着各自独特的作用。通过学习这些模式,开发者可以更好地组织代码结构,提高程序的可读性和可维护性。每种模式都有其适用的场景,理解它们的...
C#的语法结构与C++相似,但更加简洁,同时它还支持面向对象编程(OOP),并带有丰富的类库和工具箱。在实际开发过程中,C#.NET广泛应用于构建企业级应用、系统集成、数据库操作等领域。 MATLAB是MathWorks公司开发...
首先,类的继承是面向对象设计的关键特性之一。在Java中,每个类只能有一个直接父类,这被称为单继承。这种设计保证了类的层次结构清晰,减少了代码重复。继承可以使得子类继承父类的所有成员变量和成员方法,但不...
对于更复杂的游戏设计,可以考虑使用C++的面向对象特性,定义一个`Treasure`结构体或类来封装宝藏的信息,包括位置、价值等属性,以及查找、收集等行为。 8. **游戏循环** 游戏的核心通常是一个主循环,不断地...
在深入设计模式之前,我们需要理解一些基本概念,如封装、继承和多态,这些都是面向对象编程的基础。JavaScript作为一门动态类型的语言,虽然没有类的概念,但通过原型和构造函数也能实现类似的功能。此外,理解作用...
在不同的开发方法论(如敏捷开发、面向方面的需求、面向对象的分析与设计、结构化分析与设计)中,尽管实施方式不同,但都遵循相同的需求工程流程,包括需求收集、需求分析和需求规范。 2. 需求收集(需求诱探) ...
在设计图书管理系统时,通常会采用软件工程中的结构化或面向对象的方法进行开发。系统可能包括以下几个关键模块: 1. **图书信息管理**:存储图书的基本信息,如书名、作者、出版社、ISBN号、类别等。这一部分可能...
11.2 再探结构成员 414 11.2.1 将一个结构作为另一个结构的成员 414 11.2.2 声明结构中的结构 415 11.2.3 将结构指针用作结构成员 416 11.2.4 双向链表 420 11.2.5 结构中的位字段 423 11.3 结构与函数 424 ...
2 类与结构的比较结构适用于"轻量型"的对象8-3 数据封装8-4 数据与方法的存取控制8-4-1 使用成员访问修饰符8-4-2 良好的数据隐藏方式设计8-4-3 数据封装的目的8-5 使用静态成员8-5-1 声明及初始化静态数据8-...
2 类与结构的比较结构适用于"轻量型"的对象8-3 数据封装8-4 数据与方法的存取控制8-4-1 使用成员访问修饰符8-4-2 良好的数据隐藏方式设计8-4-3 数据封装的目的8-5 使用静态成员8-5-1 声明及初始化静态数据8-...
C#是一种现代化、类型安全的面向对象的编程语言,由微软公司推出,广泛应用于Windows平台的开发,尤其适合构建复杂的桌面应用和网络服务。 酒店管理系统的核心功能包括预订管理、入住登记、房间状态更新、账单计算...
第15章 面向对象程序设计 525 15.1 OOP:概述 526 15.2 定义基类和派生类 527 15.2.1 定义基类 528 15.2.2 定义派生类 529 15.2.3 类型转换与继承 534 15.3 虚函数 536 15.4 抽象基类 540 15.5 ...
第15章 面向对象程序设计 525 15.1 OOP:概述 526 15.2 定义基类和派生类 527 15.2.1 定义基类 528 15.2.2 定义派生类 529 15.2.3 类型转换与继承 534 15.3 虚函数 536 15.4 抽象基类 540 15.5 ...