第一部分:
1、方法论与方法学
方法:模型+过程
方法论是一种观点,是一个有意义的理论架构,方法论是关于认识世界和改造世界的根本方法,用世界观去指导认识世界和改造世界,就是方法论。《辞海》
方法学实际上是一种解决问题的视角或者观察世界的一种视角,而不再是 一些具体的解决问题的步骤,可以说方法学包含了一系列的方法的集合。
一般的方法学是哲学上的,认识一个一般的事物和所有的对这个事物的认识一些原则、 原理和视角。 而我们的软件方法学主要是在特定的一个场景下,就是在开发软件的时候,认识 软件所包涵的或者软件所涉及的现实世界,以及软件世界本身的一些原则、 视角、 原理等等。
在面向对象中方法学是一种视角, 它由很多的一些原则组成 ,但是面向对象方法学中包含各种流派的方法,每个流派都有各自独特的一套模型和过程。
面向对象方法学是一种特定的软件方法学。 它是一种特殊的软件方法学 ,是一种非常狭义的软件方法学。 只是在面向对象这些原则前提下我们开发软件一些视角、 原理、 原则。
2、软件方法学
-
软件方法学是以方法为研究对象的软件学科。主要涉及指导软件涉及的原理和原则,以及这些原理、原则的方法和技术。 狭义的也指某种特定的软件设计指导原则和方法体系。不论何种含义,其关注的中心问题是如何设计正确的软件和高效率的设计软件。
-
软件方法学的目的是寻求科学方法的指导,是软件开发过程“纪律化”,即引号寻找一些规范的“求解过程”,把软件开发活动置于坚实的理论基础之上。
-
软件工程与软件方法学的方法不同,软件工程是侧重于借鉴传统工程学科,最终的目的是把软件生产变成一门制造工程。
-
两者之间的关系是软件工程需要软件方法学为依据和指导;方法学依赖于软件工程,特别是环境工具来发挥实际效用。
3、语言
什么是语言?
-
语言是人类特有的一种符号系统。
-
乔姆斯基:语言是承载信息的表示符。
语言 = 语法 + 语义 + (语用)
语法(Syntax):是一套将语言元素(字)组织成表达式(词、短语)的规则。
语义(Semantics):是一套将语法的表达式赋予某种意义的规则。
语用(Pragmatics):在一定的语境中对语言表达的理解等活动。
图与程序的区别
-
程序:一张有穷的指令表,即有穷的指令序列。
-
程序也称为代码,因为每一个程序都有一个自然数与之一一对应。
-
即使图与程序的抽象成都完全一样,它们之间仍然存在差异。 如抽象语法树和程序的差异。
抽象语法树
是把源代码的抽象成语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。
简单来讲就是把源代码抽象成树状结构图。
第二部分
1、软件方法学的历史
(1)结构化方法
事物是由这个数据流和加工组成的, 所有的一些业务都可以用数据流和加工来表示。
结构化方法方便处理与流程相关的事物,但对于一些组织结构类用结构化方法就不是很适合。
(2)E-R图(实体关系方法学)
实体关系方法学主要擅长描述一些静态的一些结构,描述各种各样的一些关系。 既描述一个 一个实体它都哪些属性,也可以描述两个以上的实体它们之间存在一些 什么样的关系。
E-R 图这种方法和 结构化方法正好是从一个极端走向另外一个极端。
(3)状态图
状态主要适合在一种特定的一种场合下, 也就是说一种事件驱动的这么一种行为的一种描述。 这个状态图描述行为和那个 刚才我们讲的数据流图(结构化图)描述行为是两种不同模式的描述行为。 那种是一种静态行为,这种属于一种动态行为。
对于事件驱动的一些行为的描述,往往采用这个状态图比较合适,因为这个 事件驱动行为往往意味着是一种并发的行为,或者说是一种 条件判断非常复杂的这么一种行为。 如果用数据流图来描述的话就是非常复杂的,但是用状态图来描述 那就相当简单了。
比如说一个电梯调度的行为,如果用数据流图那是有很多的一些分支描述, 非常麻烦,但是如果我们画状态图的话, 那么就是一些状态,这个简单的一些状态转换就可以了。
状态图有一些比较擅长的方面,特别描述事件驱动的行为。
(4)规则
比如在人机博弈程序,人机对战象棋、 围棋、 五子棋一些游戏的时候, 我们往往是采用基于规则的这种方法学。
所谓基于规则, 这个有几层含义:一方面就是它这里面定义的一种,比如说象棋的各种走法,称之为规则;另外这个规则,除了这种每一步的这个走法的规则之外,还有一些判断输赢的规则;还有一些那个决策的规则。
在这个多个规则的定义好了之后, 还需要一些算法,把这些规则,各种各样的规则给它统一起来。这些算法有博弈树算法 、回溯算法、启发式搜索算法 等。
(5)形式化方法
形式化方法实际上就是一个数学的方法,这个数学的方法是采取形式逻辑的方法将一些代码,或者一些程序转变为一种形式逻辑。
2、软件方法学的现状
现状:现在有
-
面向对象
-
面向方面
-
基于构件
-
面向服务
-
agent
-
。。。
等软件方法学。
(1)面向对象
以面向对象方式认识世界或者开发软件的时候,基本上是以自然思维方式,以现实世界中是有一些对象组成的, 对象和对象之间有关系,在构造模型的时候,这个构造模型也是由一些对象组成的,然后对象和对象之间 也是有联系的,因此从认识论角度来看,它基本上是与这个我们日常这种思维方式是息息相通的。
面向对象方法学开发,一句话来描述面向对象就是从这个现实世界中的这个存在的这个事物出发来构造软件系统,那么对象本身是一个最重要的一个概念就是封装,它是将数据和操作封装在一块,形成了一个对象。对象本身既然数据和操作封装在一块,就有点像一个泛代数结构。
面向对象的优势
-
从认识论的角度看,面向对象方法改变了人们开发软件的方式;
-
面向对象语言使得从客观世界到计算机语言的鸿沟变窄;
-
面向对象方法使从问题域到计算机间的鸿沟变窄;
-
易于维护和复用;
-
有助于提高软件的质量和生产效率。
(2)基于构件的软件开发
在面向构件程序设计中构件就是一组业务功能的规格,面向构件针对的是业务规格,不需要源代码。
也就是面向对象中很多的一些对象可以 成为一个构件,这些构件组成了一组业务功能。 然后开发软件完全可以通过 一系列的构件的组合,组装来实现,这样就 可以在很大程度上避免了开发软件的时候编写源代码,很多情况下就是通过这个查询构件,然后组合构件,这样就形成 一个可执行的一个程序。
面向构件技术还包括了另外一个重要思想就是程序在动态运行时构件的自动装载。
基于构件和开发并不能完全地解决开发软件时候的开发代码的问题,因为构件即使再多,也不能完全满足这个 人的不断变化这个需要,光靠这个组合一些现有的构件这种方式不可能最终解决这个代码生成的问题。 这个解决这个问题还需要更加先进的方法学的支撑。
(3)面向服务
面向服务实际上和面向构件非常相似。这种面向服务是借助于 Internet 或者是互联网的一种构件,然而构件并不在本地进行组装,往往通过网络环境,如果需要某一个构件的时候,用户向远在几千里之外的一个服务器,通过一种规范向它发送服务请求,然后它再给我们返回最后的一些结果,然后用户通过这种远程访问的方式来这个实现服务的组装。
这样可以在很大程度上避免自己开发,然后复用很多软件的一些资源, 这称之为服务。 但是服务实际上和面向构件原理是一样的,只不过它们的存在的位置发生了变化。
(4)面向方面
面向对象开发软件的时候需要同时兼顾很多的方面。 尽管是在写面向对象的编程语句,往往第一句写的是一个业务逻辑, 紧接着下一句是安全的处理,再来一句写日志的功能,再加上数据管理等等。 这样使得开发人员在写开发程序的时候往往分散注意力,不能很好地把注意力集中到业务逻辑上。
为解决这个问题,就采取了面向方面的一种方法,所以面向方面就是把这些程序分为很多的方面, 其中这个最重要的方面就是业务逻辑,除了业务逻辑还有一些前置条件、后置条件、一些处理例外、处理同步、写日志,处理安全等等,这都称之为一些方面。 为了让这个程序员在写程序的时候专注于业务逻辑, 那么可以只让这个程序员写一些业务逻辑的方面,而其他的方面完全可以自动地生成代码,在需要时候给它编织进去。 或者有其他程序员在其它的位置这个编写, 然后最后它们合并到一块儿。这就是面向方面的一个思想。
面向方面的一些概念(AOP概念)
-
方面:关注的模块化
-
连接点:程序执行中插入方面的地点
-
通知:在特定的连接点的动作
-
切入点:定义通知什么时候激发的连接点集合
-
引入:对已经存在的类添加新的方法
-
目标对象:包含连接点的对象
-
织入:装配方面产生新的对象(代理)。
(5)智能Agent
智能Agent是一种抽象的实体,可以把它想象成一个存在于系统中、程序中的机器人,它接受外部环境给它的讯息,同时也对环境做出动作,并影响环境。
特点
自治性:代理可以在没有人或者其他代理直接干预的情况下运作,而且对自己的行为和内部状态有控制能力。
社会性:代理和其它代理可以通过代理语言进行信息交流;
反应性:代理能够理解周围的环境,并对环境的变化做出实时的响应;
能动性:代理不仅简单地对其环境做出反应,也能够通过接受某种启动信息,表现出有目标的行为。
这个方法实际上是一种人工智能领域存在的一种方法。 它是对于面向对象方法的一种进一步地扩展改进,在人工智能领域的一种扩展和改进。