面向对象的逻辑思维方法
- 格式:doc
- 大小:30.00 KB
- 文档页数:3
结构化⽅法与⾯向对象⽅法的介绍与对⽐结构化⽅法与⾯向对象⽅法的介绍与对⽐结构化和⾯向对象,这两个概念在计算机领域的中应⽤⼗分⼴泛。
在软件⼯程中,结构化和⾯向对象的思想也占有重要地位,产⽣了结构化⽅法和⾯向对象⽅法,⽤来指导软件⽣产。
⼀、结构化⽅法结构是指系统内各个组成要素之间的相互联系、相互作⽤的框架。
结构化⽅法强调开发⽅法的结构合理性以及所开发软件的结构合理性。
针对软件⽣存周期各个不同阶段,可以分为结构化分析(SA)、结构化设计(SD)、结构化程序设计(SP)等⽅法。
1.1结构化分析⽅法结构化分析⽅法是⾯向数据流的分析⽅法,是70年代由Yourdon、Constaintine及DeMarco 等⼈提出和发展,并得到⼴泛的应⽤,其基本思想为分解和抽象。
结构化分析⽅法的设计原则有:(1)使每个模块尽量只执⾏⼀个功能(坚持功能性内聚);(2)每个模块⽤过程语句(或函数⽅式等)调⽤其他模块;(3)模块间传送的参数作数据⽤;(4)模块间共⽤的信息(如参数等)尽量少。
在结构化分析⽅法中,常⽤的⼯具有:数据流图数据流图(Data Flow Diagram,简称DFD)是描述系统中数据流程的图形⼯具,它标识了⼀个系统的逻辑输⼊和逻辑输出,以及把逻辑输⼊转换逻辑输出所需的加⼯处理。
通常,⼀个系统的DFD图会进⾏分层设计,使数据处理过程更加有层次,逻辑更加清晰。
DFD图的设计原则为:数据守恒与数据封闭原则、加⼯分解的原则、⼦图与⽗图的平衡、合理使⽤⽂件。
数据字典分层数据流图只是表达了系统的“分解”,为了完整地描述这个系统,还需借助“数据词典”(data dictionary)对图中的每个数据和加⼯给出解释。
对数据流图中包含的所有元素的定义的集合构成了数据词典。
它有四类条⽬:数据流、数据项、⽂件及基本加⼯。
在定义数据流或⽂件时,使⽤下表给出的符号,将这些条⽬按照⼀定的规则组织起来,构成数据词典。
在以上⼯具的辅助下,我们可以进⾏完整的结构化分析,⼀个典型的结构化分析过程为:①分析当前的情况,做出反映当前物理模型的DFD;②推导出等价的逻辑模型的DFD;③设计新的逻辑系统,⽣成数据字典和基元描述;④建⽴⼈机接⼝,提出可供选择的⽬标系统物理模型的DFD;⑤确定各种⽅案的成本和风险等级,据此对各种⽅案进⾏分析;⑥选择⼀种⽅案;⑦建⽴完整的需求规约。
编程思维知识点总结引言编程思维是指一种通过分析问题,设计解决方案,并将其转化为计算机程序的思考方式。
它涉及到逻辑推理、问题分解、模式识别、算法设计等各个方面的能力。
编程思维不仅仅是程序员的专属领域,现如今,它已经成为一种普及的能力和意识,适用于各个领域。
本文将对编程思维的相关知识点进行总结和分析。
一、逻辑思维逻辑思维是编程思维的核心能力之一。
编程语言是由计算机一步步执行的指令组成的,而逻辑思维就是指我们要通过编程语言来告诉计算机一步步要做什么。
逻辑思维包括了自上而下的分析、抽象和推理能力,在编写程序时非常重要。
这里主要包括以下三个方面的知识点:逻辑结构、流程控制和算法设计。
1. 逻辑结构逻辑结构是程序的基本组成部分,主要包括顺序结构、选择结构和循环结构。
顺序结构是指程序按照编写的顺序一步一步执行,而选择结构和循环结构则是根据条件来决定程序的执行路径。
逻辑结构的设计需要考虑程序执行的先后顺序、条件判断以及循环执行等方面。
2. 流程控制流程控制主要包括条件判断和循环执行两个部分。
在编程中,我们需要使用 if 语句来进行条件判断,使用 while、for 循环来进行循环执行。
掌握好流程控制的知识可以提高程序的执行效率,并且可以在一些复杂的情况下更加灵活地控制程序的执行。
3. 算法设计算法设计是指通过一系列的操作来解决特定问题的方法。
算法设计的好坏直接影响了程序的执行效率和结果质量。
在实际编程中,我们需要根据具体问题选择合适的算法,并对算法进行优化。
常见的算法设计包括递归算法、动态规划、分治算法等。
二、问题分解问题分解是编程思维的另一个核心能力。
它指的是通过将一个大问题分解成若干个小问题,并逐个解决这些小问题,最终得到整个问题的解决方案。
问题分解的过程需要考虑问题的复杂度、模块化设计以及函数的封装等方面。
1. 模块化设计模块化设计是指将问题分解成多个相互独立且可复用的模块。
每个模块都有明确的功能和输入输出,它们可以组合成一个完整的程序。
知识表⽰的⽅法——逻辑表⽰法、产⽣式表⽰法、框架表⽰法、语义⽹络表⽰法、⾯向对象表⽰知识表⽰的⽅法知识表⽰⽅法种类繁多,通常有直接表⽰、逻辑表⽰、产⽣式规则表⽰法、语义⽹络表⽰法、框架表⽰法、脚本表⽰⽅法、过程表⽰、混合型知识表⽰⽅法、⾯向对象的表⽰⽅法等。
在本⽂中,着重介绍⽬前使⽤较多的知识表⽰⽅法。
⽬前使⽤较多的知识表⽰⽅法主要有:逻辑表⽰法、产⽣式表⽰法、框架表⽰法、语义⽹络表⽰法、⾯向对象表⽰等等。
2.3.2.1 ⼀阶谓词逻辑表⽰法[45]通过引⼊谓词、函数来对知识加以形式化描述,获得有关的逻辑公式,进⽽以机器内部代码表⽰的⼀种⽅法。
谓词逻辑是⼀种形式语⾔,它与⼈类的⾃然语⾔⽐较接近,是⽬前能够表达⼈类思维活动的⼀种最精确的语⾔,它具有丰富的表达能⼒,因⽽可以表⽰⼤量常识知识。
它具有简单、⾃然、精确、灵活、容易实现等特点。
⼀阶谓词的⼀般形式为 P(x1, x2 (x)n)。
其中,P 是谓词,x1, x2 (x)n是常量、变元或函数。
谓词逻辑适⽤于表⽰事物的状态、属性、概念等事实性的知识,也可以⽤来表⽰事物间关系的知识,即规则。
例如:物体 A 在物体 B 的上⾯,可以表⽰为:On(A,B);物体 A 是书,可以表⽰为:book(A);书 A 在书 B 上,可以表⽰为:On(book(A),book(B))。
⼀阶谓词逻辑表⽰法的局限性在于它难以表达不确定性知识和启发性知识,推理⽅法在事实较多时易于出现组合爆炸,且推理过程繁杂、效率低。
2.3.2.2 产⽣式表⽰法多数较为简单的专家系统(Expert System)都是以产⽣式表⽰知识,相应的系统被称作产⽣式系统。
产⽣式系统,由知识库和推理机组成。
其中知识库由事实库和规则库组成。
事实库是已知事实的集合,规则库是产⽣式规则的集合。
规则则是产⽣式规则。
规则库蕴涵着将问题从初始状态转换到解状态的那些变换规则,规则库是专家系统的核⼼部分。
规则可以表⽰成与或树的形式,基于事实库中的事实通过与或树求值的过程就是推理。
结构化⽅法与⾯向对象⽅法之应⽤⽐较结构化⽅法与⾯向对象⽅法是最具代表性的,也是⽬前应⽤最为⼴泛的软件开发⽅法。
本⽂将分别对两者进⾏介绍和⽐较。
⼀、结构化⽅法 结构化⽅法(Structured Methodology)是计算机学科的⼀种典型的系统开发⽅法。
它采⽤系统科学的思想⽅法,从层次的⾓度,⾃顶向下地分析和设计系统。
基本思想是基于功能的分解和抽象,形成系统的模块结构,从⽽针对每个模块进⾏结构化设计及结构化编程来完成系统的开发。
结构化⽅法由结构化分析(SA)、结构化设计(SD)和结构化程序设计(SP)三者组成。
(⼀)结构化分析 结构化分析是⾯向数据流进⾏需求分析的⽅法。
采取的⼯具主要有数据流图、数据字典、实体关系图等。
数据流图(Data Flow Diagram,DFD)是⼀种分层的建⽴系统逻辑模型的⽅法,模拟系统的⼀个⼤致边界,并展⽰系统和外部的接⼝、数据的输⼊输出以及数据的存储。
它有四个基本要素:数据流、实体、数据加⼯和数据存储。
数据流图分层的思想体现为,⾸先确定系统和系统涉及到的外部实体之间的数据流,画出第0层数据流图(顶层图);其次在顶层图的基础上对系统的主要功能进⾏分析,抽象出功能作为系统的加⼯,确定实体和加⼯之间的数据流,将顶层图细化为第1层数据流图;依此类推,之后不断细化得到第2、3乃⾄更多层的数据流图,直到不能再细化为⽌。
数据字典(Data Dictionary)是⼀个包含所有系统数据元素定义的仓库。
数据元素的定义必须是精确的、严格的和明确的。
⼀个实体⼀般应包含以下⼏个部分的内容:名字、别名、⽤途、内容描述、备注信息。
实体关系图(E-R图)是数据库设计的基础,是指以实体、关系、属性三个基本概念概括数据的基本结构,从⽽描述静态数据结构的概念模式。
(⼆)结构化设计 结构化设计是指在结构化分析的基础上,映射分析模型到设计模型,得到系统的模块结构、数据库结构等。
如在数据流图的基础上,进⾏相应的变换分析和事务分析得到系统的模块结构,在ER模型的的基础上,进⾏数据库设计得到数据库结构。
面向对象的理解并举例面向对象(Object-oriented)是程序设计方法论的一种流派,从抽象的角度考虑处理和解决问题,让程序可以表示真实世界和模拟真实世界的分析和模拟操作,它被认为是程序开发方面的一种思想。
一、定义:面向对象是程序设计方法论的一种流派,它从抽象的角度考虑处理和解决问题,使程序可以实现对真实世界和模拟真实世界的分析和模拟操作,是程序开发方面的一种思想。
它强调的是开发者的思维由概念对象转变为对对象类的抽象,在创建任何软件时,在任何情况下都要先从物理过程和具体事物出发,将它们抽象为可封装、可复用的对象,而不是从易操作的、可运行的程序出发。
二、特点:1、面向对象就是以“对象”为中心,将程序中每一个部分都要以“对象”的形式表示。
2、面向对象有自己的一套编程思想,重在“对象”和“类”的概念,以及对象和类之间的联系,也就是“继承”的概念。
3、面向对象把程序分为两个部分:逻辑部分和数据部分,它能让程序拥有更强的可维护性和可扩展性。
4、面向对象的思想是以属性和行为来描述对象,对象之间存在着关系,关系由多态(polymorphism)实现。
三、优点:1、易扩展性:由于面向对象程序设计得到了实现,比传统的程序设计模式更容易扩展及共享,减少代码的重复,可以把基本功能编写在一个类中,然后在不同的子类上添加不同的行为,对对象和对象之间的关系可以以多种方式实现,比如继承和关联等。
2、重用性:面向对象程序设计可以利用现有的类,通过继承获得类的信息,这样可以节省时间和提高可重用性。
3、可维护性:面向对象程序设计能够使程序员及早地探测和解决程序可能出现的重大问题,降低模块之间的耦合,减少非利期间的变更,以便在修改部分代码时能够尽量减少影响的范围,从而增加程序的可维护性。
四、应用:1、面向对象的主要应用就是软件开发,比如游戏、系统程序和应用软件等等,此外,面向对象程序设计也广泛应用于数据库开发。
2、计算机可视化图形,如OpenGL、DirectX、RenderWare等,用于图形缓冲以及对象渲染,也都是建立在面向对象技术之上的,从而实现视觉效果。
面向对象思想面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。
这些程序设计语言可以归纳为以下几类:系统中一切皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。
从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。
这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。
从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。
因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。
这样建立起来的系统才能符合现实世界的本来面目。
从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。
它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。
面向对象面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。
面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。
如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
起初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。
可是,这个定义显然不能再适合现在情况。
面向对象的思想已经涉及到软件开发的各个方面。
面向对象的逻辑思维方法
什么是面向对象的设计思想?也许有不少初学者对这个概念还有许多不明白的地方,特别是这个处于新旧思想交替的时代,许多人刚刚学完现在看来是快要淘汰的只是面向过程的语言。
他们的脑子还没有脱离面向过程思想的束缚,抬头却发现,“面向对象”早已经流行开来,这个陌生的词漫天飞舞。
随便拿起一本流行计算机技术书籍,那里会没有“面向对象”的字眼!于是心中便惶惑了:什么叫“面向对象”?不感兴趣者,一带而过;有志于在这方面发展的,匆忙找到一本有关书籍来啃究竟什么是“面向对象”。
然而,要突破思想的束缚,说难也不难,说到要深刻认识却也不容易。
笔者在做了一些轻量级的工作后,颇以为有点心得,不怕贻笑大方,写出已供广大同行批评指正。
“对象(Object)”一词,早在十九世纪就有现象学大师胡塞尔提出并定义。
对象是世界中的物体在人脑中的映象,是人的意识之所以为意识的反映,是做为一种概念而存在的先念的东西,它还包括了人的意愿。
举例说明吧。
当我们认识到一种新的物体,它叫树,于是在我们的意识当中就形成了树的概念。
这个概念会一直存在于我们的思维当中,并不会因为这棵树被砍掉而消失。
这个概念就是现实世界当中的物体在我们意识当中的映象。
我们对它还可以有我们自己的意愿,虽然我们并不需要付诸实现——只要在你的脑中想着把这棵树砍掉做成桌子、凳子等——我们就把它叫做意向。
于是,对象就是客观世界中物体在人脑中的映象及人的意向。
只要这个对象存在我们的思维意识当中,我们就可以籍此判断同类的东西。
譬如,当我们看到另外一棵树是,并不会因为所见的第一棵树不在了失去了供参照的模板而不认识这棵树了。
当我们接触某些新事物时,我们的意识就会为这些事物确立一个对象。
当然这个过程是怎么形成的,那就不是我们所能讨论的问题了。
上面所说的对象研究的是一般意义上的问题,因而它可以外推到一切事物。
我们经常所说的“对象”,一班指的是解决信息领域内所遇到问题的方法。
特别是应用软件技术来决问题的方法。
如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对象的分析(Object-Oriented Analysis)、面向对象的设计
(Object-Oriented Design)等。
应用前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。
在面对较复杂的系统,我们可以将它作为一个对象来进行分析。
一个系统(解决某个问题的全套解决方案)作为一个对象,可以由多个部分组成。
同样,这个对象也可以由多个对象组成。
对于同类的事物,可以由一个对象来表示。
这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员的工作量,简化实际的模型。
举一个例子。
在关系型数据库的设计当中,我们可以把一个元组当作对象,给它定义一组操作方法。
这些方法将适用于所有元组,从而我们不必在更大的范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向本身的方法,它们“自己”可以“解决”自己的问题。
更上一层的对象可以是一个表、视图等。
表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。
从这个层面上讲,它也只需要做“自己”的事情,
因为有元组对象的支持,它无须去考虑像元素是否合法这类的事情。
甚至,有时为了满足我们还可以将元素或表群当作时对象并定义它们自己的方法。
这样,更能显示面向对象的优势。
上面所讨论的可以说是面向对象的分析方法。
在具体的设计过程当中,还应该采用适当的方式。
因为面向对象的思想固然很先进,如果做得不好的话,同样不能达到预期的效果。
这主要表现在处理对象与对象的关系上没有做好,对象与对象的层次不分明。
如上面所举得关系型数据库得例子,如果在元组层面上得对象过多得考虑一个表对象得因素,或一个表层面上对象过多地考虑一个元组对象的因素,甚至去考虑元素层面上的因素,这些都不是好的面向对象的设计方法。
这一点,在语言实现方面,Java比C++更有优势,因为它不允许多重继承,从而使对象之间的关系更明确。
谁也不会否认C++的功能更强大,但是它也要由次付出巨大代价——当现在代码库发展到一定程度、一定规模时,个对象之间的层次关系将变得异常复杂,给后继使用者得学习、理解带来很大的困难,应用上很难把握。
另外,虽然C++具备面向对象的处理能力,但它还是保留了很多面向过程的东西。
用C++完全可以不用面向对象的思想来进行程序设计,当然人们不会这样去做——除了那些只是把C++看成是C扩充的初学者,这就为以后的发展埋下了隐患。
在者一方面,Java的限制更多一点。
就者一点还远远不够。
搞开发的是人,开发方法是由人决定的。
要应用面向对象的方法开发出优秀的软件,必须要求开发人员具有良好的面向对象的思想。
好的工程师可以利用适当的工具开发出优秀的软件——而不在乎他所使用的语言工具——Java、C++、Object Pascal、Ada等
要能应用面向对象的思想熟练得做好系统分析、设计、实现(编程),首先要求开发人员知道什么是对象,什么是面向对象得概念,否则是谈不上应用面向对象得思想搞软件开了。
希望读者能在看到我在前面的不太严密、详细的论述之后可以对“对象”这个概念由一个初步的了解,同时也希望有不同看法的同行提出批评。
其次,还要求开发人员有比较丰富的开发经验。
否则,光谈理论,那是不能真正体会“面向对象”的含义的。
尽管如此,我们还是可以定出一般的规则的。
抛开生命周期的其它阶段,对一个确立的系统一般可以进行以下几个过程:
一、首先应用面向对象的思想进行系统分析。
仔细的划分系统的各个部分,明确它们之间的层次关系,然后将各个部分作为一个对象进行功能上的分析。
例如,要设计一个用户界面,它可能由几个主要的窗体组成:主窗体MainFrame、功能性子窗体FunctionFrame以及对话对话框Dialog。
其中,MainFrame中可能还包括菜单、工具条、文本框、状态条等Windows组件。
对于要完成一些重要功能的组件,我们可以单独将它作为一个对象看待,在具体的实现中,用单独一个类来表示。
而一些并不是很重要的、只是在过程中需要用到的组件,就可以将它们集成到其他对象中去。
要明确每个对象自己的任务——不要让它有缺陷,也不能越殂代庖。
各个对象之间的关系通过过程、内容、
功能等耦合来实现。
实际上,如果你是用Java进行开发,你会发现swing组件本身就非常好用,因为它们之间的关系是很分明的——你无须去理解分清象C++中的组件那样复杂的关系。
在开发你自己的组件时,也需要力求达到这样的效果。
二、其次时应用面向对象的思想进行系统设计。
其实在真正做好了系统分析的工作之后,进行设计就比较轻松了。
这段时间只要进一步确定各个对象的功能以及各个对象之间的关系。
为了能够更好地帮助实现人员明白各个对象之间的关系,可以利用一些工具将这些组件的关系表示出来,统一建模语言(Uniformed Module Language,UML)就是这样的一种好东西。
它不仅可以现在帮助开发人员了解整个系统,也为以后的维护工作提供一个档案文件,给以后的工作提供巨大的方便。
三、实现(编码)。
这一点就不用多说了。
在我的下一篇文章中,将会给出一个比较简单的实例,希望会给读者一个启发。
在搞软件开发时,编码不是最重要的。
分析、设计才是最重要的。
也许当我们接受了一些更先进的思想之后,会更加理解这一点了。
希望我们中国的软件开发人员能应用面向对象的思想开发出具有国际竞争力的优秀软件。