随笔-11  评论-3  文章-53  trackbacks-0

软件工程中的数学思想—软件模型(1 

作者:error.cao(来源:不详)  http://www.csai.cn  200477

作者声明

  error.cao将本系列文章授权于软件工程专家网(http://51cmm.csai.cn.com),其他任何网站不得转载,更不得拷贝等作商业用途!

一. 软件外的感想

  我记得小的时候和伙伴们一起玩泥巴团,有一种想当建筑师的想法,当时思想幼稚,总是把自己和建筑师们排在一起。

  对于游戏的本身,我是建筑师是没有错的,但是,我的功用仅仅在游戏的本身中才有"建筑师"的身份。若对于文学者来说,在书中描述的就是游戏,但读本书的人,并不拿本书当一本描述游戏的书。

  年龄让我的思想日趋成熟,一种一种的感悟在生活的过程中产生。直到我从事软件行业,才发现自己好象又回到了孩提时代?quot;玩泥巴团"游戏,在糅合着一些泥巴(软件上可能是代码),做一些看上去象"建筑"的东西。

  西方的软件工程化的思想常常以建筑的体系来描述软件开发的过程(UML的三大鼻祖如是用法:从狗窝到大厦),我并不同意如此的比喻,为什么?一个大厦建好后,其框架是不能更换的,在软件开发的迭代的过程中,其构架是变的,一个是活动的(软件过程),一个是不活动的(建造过程),但也的确没有更好的例子来说明软件工程化及其实施的过程。喜欢经济学的朋友一定喜欢张五常先生的散文式的经济学论文,中国人说他是中国的"科斯"。我就是认为该说法钻进一个套子里,何谓中国的"科斯"?在思想上我们在糅泥巴,即希望张五常先生是"科斯",但不可能,就加上"中国"吧。

  一个问题(软件以建筑描述或定义)就暴露了,软件工程在描述上并没有建立一个合理的定义机制,我们依然存在着糅泥巴的作风----"不完全的构架"代替"完全的构架"。但如何区分真正的建筑和软件的"建筑"artifacts该词是用来描述软件的,从此在定义上我们可以分开软件(是指软件制品)和建筑物,一个是"",一个是"",从汉语的角度就很容易理解了。

  软件的一个新事物,从一个抽象化的高度来描述它,自然是和用例(using case)的共性,目前用例(used case)最多的就是建筑及其建筑学。为什么可以从一个抽象的角度描述它(一个新事物:软件的构造)?

  孩提时代的玩泥巴团是对建筑框架的模拟,在模拟一个建筑的构架,建立一个物理模型。而我当时是一个"构架师"(不完全构架师,因为构架师还要制作图纸)有了建筑师的的想法。软件建模也对一个真实世界上的事物建立一个物理模型,这个物理模型是软件制品(artifacts)的系统构架或是一个软件制品。

  如上的说法何以存在疑义?

  这个问题就是出在语义(semantics)上。

  首先抛开我认?quot;我就是建筑师"的想法。

  构造一个建筑物和玩泥巴团的相似之处是它们有共同的目标:建一个建筑(模型也是一种建筑)。采用的方法不同,材料不同,可使用性也不同。但更深一步说明,按照一个建筑物的图纸来建一个模型的话,在视图上创造了一个真实的物件,这个物件就是我们将要描述的真实的事物。

  物件和事物的概念就是以上""""的概念。在软件建模上我喜欢两个词artifacts(制品)和system(系统)可以从中抽象出其的意义。

也许需要思考,软件模型或模型的模型被描述时,需要什么样的描述符号?

  首先从模型的概念来回答如是的问题。

二. 模型(model)

  模型这个词是相对于system的,是一个从system抽象的简单实体,以便描述该system。在广义上,模型还可以做动词解,做动词时,模型表明、指出某事物是什么东西,有何功用。为了研究其共性,列出模型三个特征:

  (1)它是现实系统的抽象和模仿。

  (2)它由那些与分析现实系统有关的元素组成。

  (3)它表明这些元素之间的相互关系。

  系统模型(system model)可以由多种方法求解,主要的是数学法。数学法不能说是一个方法,应该是一种行为,它可能包含操作、属性和状态。数学法分析问题一般是分析、归纳、提取、计算、证明和总结,其中最为重要的是描述一个合理化化的过程。

  单词"model"在中文中有两个含义:一是模型,名词;二是建模,动词。但在使用上常用"modeling"来表示建模。

如何合理解释"model"还是从孩提时代的游戏开始说。

  现在建筑上的"七宗罪"说法,我颇同意。关于国内的建筑(主要是城市化建设)问题主要出在规划上,城市建设规划有问题吗?

  在上面刚提过关于用建筑来定义、描述软件工程的,其实有两个问题,在城市建设方面,某一个建筑物就是模型,是一个模型元,若把整个城市当成模型的话,那么某个建筑物就是模块。

  既然可以把某个建筑物当成一个组成模型的最小元,我们就不可以拿之和软件的一个system比,虽然这个system最终是一个artifacts,但从建模方面考虑,必须当之为一个system

  关于系统化的建模存在那些不合理的方面,软件模型是一个模型系统实践的过程,将有一种模型设计迭代的方式代替原始的一步到位的方式,在软件的建模上称将统一建模过程代替瀑布法建模过程。

  "七宗罪"是目前城建规划不合理的几个方面,虽然,"七宗罪"说法并不一定符合整个城市化建设,但视之、分析之会得到什么结果?是模型不合理还是建模过程不合理?

  第一城市化建设贪洋求大,盲目追求国际大都市,比如说一个县政府在此县城里建了一个10万平方米的广场。考察软件模块,本也希望该软件做出来后可以包罗万象、可以及时跟上时代潮流,所在软件的接口部分庞杂而混乱。

  为什么产生如此现象,在建模上有没有问题?若创建了模型和计算过数字(把模型的某些数据量化),该问题基本上不会发生。你愿意看见一个极不协调的模型?所以模型可以让你清楚看见思想构架出的实例。

  第二缺乏统一协调机制,重复建设严重,在胶东半岛的青岛、济南、烟台有一个机场就够,却建了三个。考察软件模块,如从同一个地方读数据因为两个模块可能不是一个来写,两个人就会写两个模块来解决该任务。

  建模问题?若建模了,大家都从设计的模块上来构架开发程序,大家知道程序采用统一的读数据方式,根本就不会重复"建设"

  第三领导以权带法(标准),在建设项目时根本就不会关心该被建设的区域有没有被规划,领导说可以建就可以建。好了,如此问题在软件开发上好似不存在?一个项目,该项目的负责人因思想偏颇而让项目偏离原先的规划,由于没有讨论(项目负责人认为他的想法足已),项目无效。

  若使用建模,或更新建模,我们就有一个整体的计划。这个整个的计划一个主轴,该轴不是由某个人的想法的变化而变化,该变化一定参与讨论(更新已建的模型)。

  第四决策不当,不符合规划标准。该问题很简单,若建模型了,模型没有建对。做一个一些不符合规范的模型,该模型上构架事物又如何能正确呢。

  五是领导懂动科学。城市规划建设无方向性和前瞻性。作为软件开发者存在什么样的问题,现在做的程序一定要驾御现在的应用之上,一定需要的是前瞻性,为将来的软件升级做好适当准备。

  在软件的设计阶段,仅仅需要讨论的就是如何建模,因为我们有了模型了,才好在模型上进行构架软件本体(所以台湾把软件叫软体也是合乎道理的)。

  六是风景区开发无序。不是风景区开发无序存在问题,什么地方开发无序它都存在问题。有些人说浮沙之上不能筑高台,但若基础连浮沙都没有又如何筑台。无序的开发其部分难道不是在空之上筑台。

  七是缺乏有效的监督机制。法不是没有,但不执行你也没有办法,因为监督体制没有,其法也形同虚设。

  在此讨论了,如此没有建模带来的坏处,倘若建立简单模型呢?在软件实施时一定需要捡漏补缺。

  如此事实较为多,可以采用软件开发标准来按照逻辑开发软件产品,但根据SW-CMMSoftware Capability Maturity Model)或UMLUnified Modeling Language)等开发过程(或其他什么过程)来实施时,虎头蛇尾,执行一半就不再执行了,麻烦!?

  UML就是将system的所有元素和元素的关系模型化,同时也包括对system的理解,构架和实施的模型化。如何描述该system的模型、模型元素、元素关系…。

  依然从城市化建设来谈。

  城市化建设有一点需要认识,城市化建设中有哪些建设是被包罗的。

  描述一下:学校、小区、马路、公园…

  给个城市化建设的具体描述:

  城市化建设将包含如下部分<<>>{学校、小区、马路、公园…},何以描述,该方法是采用数学上的集合描述法。城市化建设就是如上所有"元素"的建设的"集合"

  模型元素的关系<<>>{模型关系描述一:在某某小区处建一个广场,该广场大小符合该处居民人口数量,一些设施符合该处居民的生活习惯。}{模型关系描述二:在某某公园门前建一条马路}

  于是乎,便可以在纸上画出待建建筑的分布图,可以画出效果图,也可以根据勾画出的图形采用积木搭建一个模型。有了这个模型,可以看出该片建设的蓝图,而且模型产生的效果,清晰、直观,便于分析、修改和重构。

  如何描述这些模型元素和元素的复杂关系,而且描述对象和采用的描述的文字应该能被所有围绕模型工作的人识别和理解。为此,从最根本的数学语言入手,彻底了解模型语言和建模方式、方法。

三.模型元素的集合(set)和关系(relation

  模型元素的集合和关系就是从数学上的集合和关系演化迩来的,如此来说明模型元素间的表述方式。

  数学间如此定义上述概念

  集合:一个集合是一些对象(objects)的整体。也可以说集合罗列了一些对象。

  序列或数组:和集合不同,序列(或数组(array))要考虑次序。也可以说序列是有次序的集合。

  集合与集合、集合元素与集合元素的关系:关系是有序偶(说明关系发生在两者之间,若在三者之间发生关系,则由两个关系合成)的集合。

  函数:函数是关系的一个特例。即给集合X的每个元素赋给集合Y的一个(或多个)元素。软件开发者对于函数的概念是一个操作过程,对一组地址或数字的操作方式、方法或过程。这个概念不矛盾,集合X元素(一组地址或数字)赋给(如何赋给:操作方式、方法或过程)集合Y(另一组地址或数字)。

3.1集合

  集合的概念对所有的数学和数学的应用都是基本的。

  一个集合简单的说就是一些对象的整体,如果一些集合是有限的也不是太大,我们可以用列出其中的所有元素来对它进行描述。

  在软件的开发过程,我们若是采用面向对象的方法,则在初始化对象的期间需要罗列各个对象的一些属性、操作,该属性和操作的表示,我们一般采用罗列的方式。

  该罗列的方式就是集合的表示法。

  例如:

  A={a, b, c, d}

  描述一个有四个元素a, b, cd的集合。此时,可以把a, b, c, d四个元素更换为四个对象,即集合表示为:

  A={对象a, 对象b, 对象c, 对象d}

  即说明了要描述A,就必须对A 内的四个对象进行描述。当然四个对象本身还含有不同的属性和操作。该处又如何表述?

  假如,对象a={属性a1,属性a2}

  对象b={属性b1,属性b2}

  我们可以如下描述

  A={对象a={属性a1,属性a2},对象b= {属性b1,属性b2}, 对象c, 对象d}

  此时,是否有点象给对象进行初始化了?

  但却不是(为什么,读者可以自行考虑)。

  一个集合本身由其元素确定,而与元素排列次序无关。这样,A也可以表示成为

  A={对象a, 对象b, 对象d, 对象c }

  组成集合的各个元素是不同的。虽然为了某种原因(比如该对象被两次或多次初始化),表中元素可能有重复,集合中每个元素只出现一次。由此,我们也可以把A写为

  A={对象a, 对象b, 对象c, , 对象c, 对象d}

  如果集合很大、无限大或该集合无法确定的大小,我们可由列出其元素具有的必要的性质老描述它。

  例如:

  B={x| x 是大于10的整数}

  规定B是由所有的大于10的整数组成,即是,B11,12,13,…等组成。此处,是成员的必要性质是"大于10的整数"。注意性质在垂直短线 | 后。

  在构建一个虚拟对象的时候,比如构建一个抽象类(abstract class),期间我们不能确定该对象的大小,因为其被继承性是要决定该对象的一些必要的性质,子对象在继承该基对象后,将拥有基对象声明的"必要的性质"

  如果X是一个有限的集合,令

  | X |=X中元素的个数

  给出集合X的如式(AB)那样的描述和一个对象x(比如对象a),我们就可以断定x是否属于 X。如果X的描述如A那样简单,一眼就可以看出来,如果如B一样,我们还要检验x是否具有列出的性质。如果x是在集合X中,我们写为x X

  没有元素的集合称为空集。

  既然是空集,在软件上应该是没有描述的对象了,并非如此理解,我们可以定义一个对象,该对象没有内容,由于没有内容,固然就不能实例化

  何为实例化?

  如,我们定义A如下

  A={对象a, 对象b, 对象c, 对象d}

  将A表述为

  城市化建设={学校、小区、马路、公园}

  我们将它表述为一个事实

  A市的城市化建设={A市第七小学学校、教育新区小区、教育新区路马路、教育新区休闲式公园}

  这个"A市的城市化建设"就是"城市化建设"的一个实例。

  若A为空集时,该对象的描述是不能被实例化。

  不能被实例化的类(对象的描述)可否被继承?

  如果两个集合XY有相同的元素,说两个集合相等,记为X=Y。另一个说法是,如x X那么x Y,且如x Y那么x X

  由于X的任意元素都在X中,任何的集合X是其本身的子集。如果XY 的子集,但XY,我们说XY的一个真子集。

空集是任何集合的子集。

  一个较为奇怪的事情产生了。

  何谓子集,子集的性质在父集合中都完全拥有,那么从一个父类(此时我应该提醒大家,看本书的人一定要学习过面向对象的编程)继承而来的子类,是否完全拥有父类的全部性质,好了,此时,你是否可以说父类是子类的一个子集。

  在面向对象的编程上,还有一个类从多个父类上继承其性质,此时对于该从多个父类继承的子类的理解还有问题吗?

  我们来表述它:

  子类={父类1,父类2,…}

  最为精确的说法为

  子类(属性、操作)={父类1(属性、操作),父类2(属性、操作),…}

  空集又如何说,一个"莫须有"对象。我们还不如理解从一个"莫须有"类(空集)上继承就是创建一个新类。

  此时,我必须声明一个概念,此时所说的集合虽然是数学上集合,但应该理解为对对象事物"概括性"地描述。

  给定集合的XY,有各种方法可以把XY联合成一个新的集合。

  集合XY={x | xXxY}称为XY的并集。并由属于XY的所有元素组成。

  何以有"并集"的性质,包(package)是一个例子。

  集合XY={x | xXxY}称为XY的交集。并由同时属于XY的所有元素组成。

  如果XY=Φ,说XY不相交。令S表示一些集合的集合,如S中不同的集合XY都是不相交的。

  何以有"交集"的性质,接口(interface)是一个例子。无论是包还是接口,我们来描述它,是需要考察它的功用,固然,我们需要一个良好的性质机制,更容易考察我们描述事物的性质。

  集合X-Y={x | xXxY}我们称为差集,由所有属于X但不属于Y的元素组成。

  有时我们讨论一些集合,它们全部是某些集合U的子集,此集合U成为全集。全集U应该在叙述中明确地给出或推断出来。给出一个全集UU的一个子集X,集合U-X称为X的补。

  集合的""""""""是集合的几大运算性质,若此处不是考察面向对象的软件的设计,而是描述比如数字系统的运算,那么关于此的说明就会很多。

<待续>

 

如果想了解更多相关内容请访问:

http://51cmm.csai.cn/ExpertEyes/No089.htm

 

 

posted on 2005-12-04 23:04 it110 阅读(221) 评论(0)  编辑 收藏 引用 所属分类: 需求工程
只有注册用户登录后才能发表评论。