文档章节

面向对象的思维(与结构化思维比较)  

wiitht
 wiitht
发布于 2017/06/19 16:20
字数 2801
阅读 2
收藏 0


2.1 方法背景

结构化思想和面向对象思想虽都产生于20世纪60年代,但它们却存在根本差别。结构化方法承袭了传统的编程思想与编程方法,以计算机的计算功能为前提。编写程序的主要目的是数值计算、问题求解。模块是结构化编程的基本单位,但计算方法(简称为算法)是程序的核心。沃尔森曾提出了一个著名公式:程序=算法+数据结构。结构化方法只是对传统程序结构的改进,用三种基本结构来组织程序,使程序结构更为清晰,程序开发更有序、更容易。

面向对象思想则以计算机信息处理和信息管理的功能为前提,模拟客观世界的事物及事物之间的联系。对象技术的关键概念是对象、消息、类,关键机制包括封装、多态和继承。与结构化方法相比,对象是软件模块化的一种新的单位,它代替了基于功能分解方法中的所谓“模块”等传统的技术。面向对象技术是通过对对象的管理(创建、运行、消亡)以及对象之间的通讯来实现程序功能。结构化方法中模块只是程序一个功能(机械)部件,在程序中完成特定功能或解决特定问题。因此程序中模块通常用函数(function)来实现,完成对输人数据的加工和计算。而面向对象中的对象则是一个活体(生命体),它将数据和过程封装在一起,这同传统的方法中将数据和过程分别对待和处理形成了鲜明的对比。对象代表现实世界中真实对象的结构和交互作用,在程序运行期间有它的生命周期,并通过消息相互通信协同完成程序功能。
2.2 分析问题的方法

软件分析是软件工程的一个重要阶段。在软件分析阶段,主要确定待开发软件的功能、性能和运行环境约束;同时提出解决问题或实现功能的方法和途径,化解一个系统的复杂性,通常有两种解决方法。化解复杂性的最基本技术是将一个大问题分解为一些容易解决的小问题,待小问题解决了大问题也就解决了。结构化分析方法的核心思想是:自顶向下,逐层分解,逐步求精。结构化分析方法体现在数据流图和系统结构图的分解过程中。数据流图的分解从顶层图开始,按照每个加工对应一个子图的分解原则,逐层分解为0层图、1层图等。系统结构图则是从主模块开始,逐层分解为算法更为简单、更加容易管理和实现的子模块。

面向对象分析则是采用了另一种自底向上的化解复杂性的方法:抽象。通过抽象,得到系统的一个简化模型,其中强调系统中某属性细节,而忽略其它的属性。面向对象分析存在三个层次的抽象:第一,识别对象及其属性和方法,这是客观世界事物的抽象;第二,对对象进行层层归类,对客观事物相互关系的抽象,如把相似对象归为一类,或把子类归到父类,或把局部类归整体类;第三,将对象和类进一步抽象归到某个主题,便于对类和对象的定义和管理。结构化分析方法承袭了传统数学问题求解的思想,采用了逐步求精的数学演绎方法,有利于数据的加工、计算等问题的解决。但逐步求精的方法不能提供解决一个具体问题的系统的策略或方法。有时,对于某些问题不存在一个自顶向下的方法。结构化程序分析方法对小规模的程序是一种有效的方法,但将它推广至大规模的系统开发中往往会失效,开发人员无法使用这一方法来很方便地重用以前程序的可重用成份。面向对象方法的抽象机制提供了为复杂的软件系统建模更为自然的方法,特别是能很好地把握对象之间复杂的相互关系,因此面向对象分析技术更加适用于复杂的软件系统的分析。
2.3 程序设计方法

结构化程序设计方法与分析方法思路相反,采用了自底向上的设计思想。首先设计底层模块,确定模块内部算法,设计模块内部程序,并进行单元测试。模块完成之后,再进行模块之间的组装,进行集成测试。待模块集成测试完成之后,进行确认测试和系统测试,完成设计和调试任务。

面向对象程序设计方法采用了自顶向下的设计思想,先设计父类,再设计子类,并继承父类属性和方法。对象是最后在程序运行过程中动态生成。在设计类的同时,另一任务是消息的设计。并将消息与类中的方法有机联系起来,以便对象在运行过程中能相互通信,共同实现软件设定的功能。消息类似于传统程序设计语言中的函数调用,二者的主要区别是函数调用中所执行的函数是一个单一、公共的实现,而对消息的响应可以不同回答,这要根据具体对象的方法来确定。这就是面向对象程序设计思想的多态机制。
2.4 适用场合

结构化方法的实质是问题求解,即结构化程序是由算法决定的,而算法是程序员分析设计的。因此结构化方法中,程序的执行过程主要是由程序员控制,而不是由用户控制。该方法比较适合大型工程计算、实时数据的跟踪处理、各种自动控制系统等等。

面向对象方法中,程序员设计的是对象属性及操作方法,但在什么时间、使用什么方式操作对象则是完全由用户交互控制。在互联网时代,计算机已经由一个生产工具逐步演变成一个生活工具,出现了许多完全由用户控制程序执行过程的应用软件,比如大型游戏软件以及各类管理信息系统软件。这些软件中各种关系比较复杂,适宜使用面向对象的方法来开发。
2.5 举个例子(转)

使用面向对象的思维方法进行设计,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。而一个合理运用面向对象技术进行设计和架构的软件,更是具备了思维的艺术美感。

举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。

如果考虑面向对象方法来做,就不能什么代码都塞到main过程里面,假设我们设计三个类:

一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;

一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;

一个主类负责从命令读参数,处理命令行参数,调用发email的类。

把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。

仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。这样的分析方法其实是不适用于面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java/C++实现起来轻松的多,逻辑上也清楚的多。面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。

那么应用面向对象的方法就逮怎么做呢?

对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计:

类 JunkMail

属性:

head

body

address

方法:

sendMail() // 发送邮件

listAllMail() // 列邮件地址

这就够了。

如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。

在面向对象的软件分析和设计的时候,要提醒自己,不要一上来就去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。

在设计的时候不应过早的考虑具体程序语言的实现,必须用抽象的方法,和具体实现无关的方法来表达业务逻辑。


 

© 著作权归作者所有

wiitht
粉丝 3
博文 158
码字总数 113941
作品 0
深圳
架构师
私信 提问
如何训练结构化思维能力?它是一种工作方法还是思维方式?

结构化思维(Structured Thinking)是指人在面对工作任务或者难题时,能从多个侧面进行思考,深刻分析导致问题出现的原因,系统制定行动方案,并采取恰当的手段使工作得以高效率开展,取得高...

zlw东南风
2017/10/16
0
0
1.1 程序设计思想的发展

面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。简单来说,就是直接编写0和1的序列来代表程序语言。例如:使用0000 代表 加载(...

无寄语
2016/08/13
1
0
掌握高效的思维模式,花费原本20%的时间,解决你的全部难题。

今天推荐的这个工具叫“金字塔结构图” 所谓“金字塔结构图”对应的是一种“结构化思维” 掌握了这项技能,你就拥有了多一种解决难题的思维模式。 我们首先从一个具体的问题着手来感受一下。...

技能工具箱
2018/02/02
0
0
什么是JAVA编程思想?

什么是JAVA编程思想?可能很会复杂,但也可以很简单。要了解JAVA编程思想,首先就要了解什么是编程思想,让我们来看看什么是编程思想,一句话来讲就是,用计算机来解决人们实际问题的思维方式...

5566sdfgh
2015/12/26
40
1
34岁!100天!学会Java编程(Day49-Day52)—OOP设计模式

新书发布会 下午的昊海楼9层阁楼,阳光从分别从西侧落入,从东侧大厦的玻璃幕墙反射回来,将阁楼填满了阳光。在这样的阳光下目睹一本新书的发布,有一种迷幻的味道。 (一)为什么要学设计模...

魏小筠
2017/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Feign输出Info级别日志

背景   spring cloud netfix组件中,feign相关的日志默认是不会输出的,需要自定义配置才能输出,并且Feign只对Debug基本的日志做出响应, 实际业务需要输出Info级别的日志,所以需要做自定...

xiaomin0322
13分钟前
2
0
面向解决问题的java编程,spring boot,mybatis generator和坑-1starter

1、start一个spring boot项目 第一课我们也不能免俗,要从starter开始,spring boot的起始项目脚手架可以从spring boot官方starter生成地址开始:https://start.spring.io/ 这张图列出了一个...

wphmoon
14分钟前
1
0
Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作

Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作 0行云流水00人评论61017人阅读2018-04-11 19:57:20 KVM的安装配置与基本操作 目录 第一部分 实验环境 第二部分 安装图形界面 ...

linjin200
16分钟前
1
0
php获取网站favicon.ico图标 api源码

 通常情况下,做网站的都会给自己的网站添加一个Icon,浏览器上一长排的标签页,用Icon来区分就显得更加醒目。现在想找一个没有Icon的网站并不好找,可见没有Icon的网站是多么的业余啊。"什...

xiaogg
20分钟前
1
0
双亲委派的认识

首先JVM中有三种类加载器 Bootstrap启动类加载器 Extension扩展类加载器(ExtClassLoader) System系统类加载器(AppClassLoader) 某个特定的类接到加载类的请求时候,首先将加载任务委托给...

最胖的瘦子
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部