软件的复用技术及开发方法

2.1软件的复用技术
软件复用是指在开发新的软件系统时,对已有的软件或软件模块重新使用,该软件可以是己经存在的软件,也可以是专门的可复用组件〔8〕。软件可复用性的高低影响到生产效率的高低、软件质量的好坏和系统可维护性的好坏。在软件工程中面临的问题不是缺乏复用,而是缺乏广泛的、系统的复用。软件复用包括构造可复用软件和用可复用软件进行构造。构造可复用软件,一方面可以从现存的软件系统中抽取,另一方面通过改写或重新设计来实施。
Jones将软件复用的对象分为4种数据复用、体系结构复用、设计复用和程序复用。这样,软件复用可在实现层、设计层和体系结构层三个层次上实现。实现层软件复用是指对己有的程序代码进行复用,它包括源代码组件形式。设计层软件复用是指对已有的软件系统的设计信息进行复用。而体系结构层软件复用是最有效的软件复用,它主要是软件体系结构形式化的复用,即将软件的框架组织,全局结构设计作为复用对象。可复用的软件体系结构则通常是显式地复用软件体系结构,并通过集成其他软件体系结构,建立新的更高层次的体系结构。   
面向对象的软件复用机制主要有两种:继承和对象组合。
(1)继承
继承是指子类可以从父类中直接获得某些特征和行为的能力,继承可作为代码复用和概念复用的手段。作为代码复用的手段是指:子类通过继承父类的行为,一些代码就不必重写;作为概念复用的手段是指:子类共享父类的方法定义。作为代码复用和概念复用手段的继承机制,在面向对象技术中,通过面向对象技术的一些主要机制来实现对“支持可维护性的可复用性”的支持。这些面向对象的主要机制是:数据的抽象化、封装和多态性。通过运用这些机制,继承可以在高层次上提供(相对于传统的低层次复用)可复用性:数据的抽象化和继承关系使得概念或定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和促进系统的可维护性。这样一来,复用的焦点不再集中在函数和算法等具体实现细节上,而是集中在最重要的含有宏观商业逻辑的抽象层次上。换言之,复用的焦点发生了“倒转”。发生复用焦点的倒转并不是因为实现细节的复用并不重要,而是因为这些细节上的复用己经做的很好了,并且这种复用在提高复用性的同时提高了软件的可维护性。由于继承关系直接继承的是接口,同时也继承实现,因而实际上父类的内部实现对子类而言是可见的,属于白盒复用方式。
(2)对象的组合
对象组合是指新的复杂功能可以通过组装或组合对象来获得。这种复杂的功能由对象组合来获得的设计思想与过程化程序设计思想是相似的,在过程化程序设计中,一个复杂的功能模块可以分解为更细小的和更简单的功能模块,整体功能是各个局部功能的聚集。在面向对象系统中,系统是由对象构成,因此复杂的功能或者说能完成更复杂功能的对象,可以通过功能较简单的对象的组装或组合来实现。对象组合方式是从整体与局部的角度来考虑软件复用思想的。
对象组合要求对象具有良好的接口定义,使用对象的接口来使用对象的功能,并往往运用赋值多态来获得具体对象,对象的内部功能是不可见的,对象只以“黑盒”的形式出现,属于黑盒复用方式。
面向对象的软件复用过程有以下步骤:
①抽象:对软件制品进行抽象,抽象层次越高,复用的机会就越大;
②选择:一般通过分类和编目方案组织和检索可复用的软件制品;
③特殊化:即将上步选定了的一个一般化的软件制品进行特殊化,以满足特定领域的要求;
④集成:集成需要在软件体系结构或框架的指导下,将选定的、特殊化了的模块集合组成一个完整的软件系统。要有效地将可复用制品集成为一个软件系统,使用者必须清楚地理解该模块的接口。
而从复用的使用角度上看,软件复用的使用行为可能发生在三个维上。
①平台维:以某平台上的软件为基础,修改它与运行平台相关的部分,使其能够运行在新的平台,即软件移植;
②时间维:使用以前的软件版本作为新版本的基础,加入新功能,适应新需求,即软件维护;
③应用维:将某软件或其中构件用于其他系统中,新系统具有不同功能和用途,即真正的软件复用。
这三种行为中都重复使用了现有的软件,但是真正意义的软件复用指的是应用维上的软件复用,即“使用为复用而开发的软件”来更快更好地开发新的应用系统。通过软件复用,消除了许多重复劳动,降低了软件开发的时间。同时,复用高质量的己有开发成果,避免了重新开发可能引入的错误,从而提高了软件的质量。
2.2软件的开发方法
2.2.1结构化开发方法
结构化方法是把现实世界描绘为数据在信息系统中的流动,以及在数据流动的过程中数据向信息的转化。其基本思想为:基于功能分解设计系统结构,通过把复杂的问题逐层分解,进行简化(即自顶向下,逐层细化),将整个程序结构划分成若干个功能相对独立的子模块直至最简,并且每个模块最终都可使用顺序、选择、循环三种基本结构来实现,它是从系统内部功能上模拟客观世界。
结构化方法强调系统开发过程的整体性和全局性,强调在整体优化的前提下来考虑具体的分析设计问题。结构化方法严格地区分开发阶段,强调一步一步地严格地进行系统分析与设计,每一步工作都及时地总结、发现问题,从而避免了开发过程的混乱状态。
结构化方法是目前被广泛采用的系统开发方法之一,但是结构化方法也存在的许多问题,其局限性有以下几点:
(1)难以解决软件重用问题。结构化方法从功能抽象出发进行模块划分,所划分出的模块千差万别,模块共用的程度不高。
(2)结构化方法在需求分析中对问题域的认识和描述不是以问题域中固有的事物作为基本单位,而是打破了各项事物之间的界限,在全局范围内以数据流为中心进行分析,所以分析结果不能直接反映问题域。同时,当系统较复杂时,很难检验分析的正确性。因此,结构化分析方法容易隐藏一些对问题域的理解偏差,与后继开发阶段的衔接也比较困难。
(3)结构化方法对需求变化的适应能力比较弱,软件系统结构对功能的变化十分敏感,功能的变化会引起相关联的许多数据流的修改,同时设计出的软件难以重用,延缓了开发的过程。
(4)结构化方法中设计文档很难与分析文档对应,因为二者的表示体系不一致。结构化方法的结果-数据流图(DFD)和结构化设计结果-模块结构图(MSD)是两种不同的表示体系,从分析到设计的“转换”使得设计文档与问题域的本来面貌相差甚远。

2.2.2面向对象开发方法
面向对象的开发方法采用从特殊到一般的归纳方法,它是对现实世界中的实体进行分类,然后区分对象及其属性,整理对象及其组成部分,并划分成不同的对象类,从而得到现实系统中对象及其关系,进而分析并掌握系统运行的规律。OOA的重点是使用面向对象的观点解决现实世界模型的建立问题,是利用从问题域中抽象出的类和对象来研究系统实际需求的一种分析方法。
这种方法是以对象作为分析问题、解决问题的核心,对问题空间进行直接映射,使计算机实现的对象与真实世界具有一一对应关系,所以自然符合人类认识规律,有效地解决了需求分析模型和软件设计模型的不匹配现象,它同时也易于适应系统的变化处理。面向对象的系统设计基本过程一般包括:问题域分析、发现和定义对象类、识别对象的外部联系、建立系统的静态模型、以及建立系统的动态行为模型。
(1)问题域分析:分析应用领域的业务范围、业务规则和业务处理过程,确定系统的责任、范围和边界,确定系统的需求;
(2)发现和定义对象类:识别对象和类,确定它们的内部特征:属性和服务操作;
(3)识别对象的外部联系:在发现和定义对象与类的过程中,需要同时识别对象与对象、类与类之间的各种外部联系,包括结构性的静态联系和行为性的动态联系;
(4)建立系统的静态结构模型:分析系统的静态结构,建立系统的静态结构模型,并且把它们用图形和文字说明表达出来;
(5)建立系统的动态行为模型:分析系统的行为,建立系统的动态行为模型,并且把它们用图形和文字说明表达出来。
面向对象模型比以往的模型有了很大的进步,但仍有不足。首先面向对象方法中对象的确定有时会因客观边界模糊而难以确定,这样很难保证软件描述的正确性。其次面向对象方法在描述问题域方面存在不足。在问题域中,面向对象方法把具体或抽象的问题现象直接表述为对象,同时把现象类型直接表述为类。大多数OOA方法支持多视角模型,即对同一问题域现象,不同的主体可以将它表述为同一对象或类型。但系统的描述在应用面向对象方法进行建模时常遇到这样的困惑,描述者力图通过面向对象的表述对存在的问题现象达成一致,然而结果得到的对象或类并不适合于某个描述者对对象的独自表述,即在面向对象模型中,很难把不同描述者对现象的描述正确的统一起来。
2.2.3基于设计模式的开发方法
设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。希望避免重复设计或尽可能少做重复设计。而模式是针对一个反复出现的问题优秀的解决方案,它的方法就是发现变化、封装变化〔2‘,。模式本身已经充分考虑了变化的情况,并且采用了一种特殊的对待变化的方法,它不是预先考虑会如何变化,而是考虑哪里可能会变化,然后隔离,所以当变化发生时不会带来全局性的破坏。
有经验的面向对象设计者能做出良好的设计,他们知道:不是解决任何问题都要从头做起。他们更愿意复用以前用过的好的解决方案。这些经验是他们成为内行的部分原因。实际上,在许多面向对象的系统中,都存在诸多的类和相互通信的对象的重复模式。这些模式帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。一个熟悉这些模式的设计者不需要再去发现它们,就能够立即将它们应用于设计问题中。使得面向对象设计更灵活、优雅,最终复用性更好。
模式可以在软件开发的各个阶段被使用,既可以创建一个解决单一问题的模式或者针对某一用例应用的模式,也可以同时使用多个模式来解决复杂的问题。模式的设计类型可以包括结构化的、行为化的和条件化的解决方案,因此,模式的应用范围是非常广阔和灵活的。一旦‘懂得了模式,许多设计决策自然而然就产生了。在人们充分认识到模式的重要性后,逐渐将面向对象软件的设计经验作为设计模式记录下来。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的、重复出现的设计,能够被人们有效的利用。
模式和系统架构有很大的相似性,都是处理一些抽象概念间的关系,但是二者还是有很大的不同,模式是领域无关的,它是解决一些抽象问题的,但是系统架构是针对所要解决的实际问题的,是领域相关的。模式在应用时可以
通过下述步骤进行设计:
(1)对问题领域进行分析、分解,结合模式的适用条件找到和待解决的问题匹配的模式,对该模式进行定制应用到具体系统中来。
(2)和模式结合在一起构建起整个系统架构。比如:MVC(Model-View-Controller),它是专门针对交互系统提出的,如果要构建一个交互系统,那么就可以直接应用MVC模式,然后在该模式所搭建的场景启发下去发现Model、View以及Controller,在大的场景的指导下根据其它的需求(模式)构建一些小的场景对系统进行有效的分化。
2.3 设计模式的优点
大多数设计模式还能使软件更容易修改和维护。因为它们都是久经考验的解决方案。它们的结构也都是经过长期发展形成的,比新构思的解决方案更善于应对变化。而且,这些模式所用代码往往更易于理解——从而使代码更易维护。
设计模式对优秀面向对象设计的策略提出了一些建议,其中包括按接口编程、尽量用聚合、找出变化并封装。这些策略在大多数设计模式中都遵循和使用着。所以用不着学习太多设计模式,只学几个就能使你理解这些策略的重要性。这种理解将会成为将策略应用于实际设计问题的一种能力,即使你并不直接使用设计模式。
设计模式还有一个好处是,可以在不使用巨型继承层次结构的情况下,为复杂问题创建出设计方案。同样,即使并不直接使用设计模式,不使用巨型继承层次结构也会使设计质量提高。

软件的复用技术及开发方法相关推荐

  1. 软件的基于生命周期开发方法

    软件的基于生命周期开发方法 ​ 早期软件开发处于一种无序状态,经历软件危机之后,开始采用系统工程方法论指导开发,根据软件开发的的生命周期将整个开发划为5个阶段(规划阶段.分析阶段.设计阶段.实施阶段. ...

  2. 认识基于中间件的软件开发方法

    与传统的软件开发方式相比,基于中间件的软件开发方法有什么突破呢? 一.体系结构 软件体系结构代表了系统公共的高层次的抽象,它是系统设计成败的关键.其设计的核心是能否使用重复的体系模式.传统的应用系统体 ...

  3. 【软件工程】软件开发方法

    开发方法 过程式逻辑是僵化的,并且无法对突发事件做出恰当的响应.一旦开始,程序便以或多或少的确定性方式来执行,直至完成.偶尔,程序会要求用户输入信息,然后将沿着不同的路径执行.一般来说,与用户的交互是 ...

  4. 【中级软考】什么是“敏捷过程的开发方法(敏捷方法agile)“(极限编程XP、特征驱动开发FDD、并列争球法Scrum、水晶法Crystal、开放源码法、自适应软件开发 ASD方法)

    文章目录 敏捷方法 1 极限编程 XP 1.四大价值观 2.十二个最佳实践 2 特征驱动开发 FDD 1.FDD 角色定义 2.核心过程 3.最佳实践 3 并列争球法 Scrum 1.Scrum 的五 ...

  5. 软件工程与软件开发模型、软件开发方法

    什么是软件工程? 软件工程一直以来都缺乏一个统一的定义. IEEE给出的定义是:软件工程是:1.将系统化的.严格约束的.可质量化的方法应用于软件的开发.运行和维护,即将工程化应用于软件:2.在1中所述 ...

  6. 软件工程结构化建模的方法和工具_系统架构师之——软件开发方法

    不管你是开发人员,还是互联网行业人员,基本上经常看到各种各样的软件相关的图,如什么架构图什么设计图什么模式图甘特图等.很多时候总是傻傻分不清.对此,我们很有必要对系统开发基础知识有认知.对于一名程序员 ...

  7. 产品经理懂点技术:几种常用的系统开发方法

    常用的系统开发方法有: 结构化系统开发方法 原型法 面向对象方法 计算机辅助软件工程方法 下面一一为大家详细介绍: 1 结构化系统开发方法 结构化系统开发方法(Structured System An ...

  8. 一、信息系统开发方法及技术

    1.信息系统开发方法 信息系统常用的开发方法有结构化方法.面向对象方法.原型化方法.面向服务方法等. 2.常规信息系统集成技术 2.1 网络标准和网络协议 1)OSI协议 OSI(Open Syste ...

  9. 平台化企业管理软件的主要技术方法

    平台化企业管理软件,是指可根据需要在运行过程中重新设定系统功能和管理流程的软件系统. 一.平台化软件的主要特征 1.稳定的运行效果. 2.数据和代码分离. 3.前后台设计完全分离. 4.快速定制功能或 ...

最新文章

  1. 刚进园子,广州的冬天像夏天
  2. 数据变金矿:一文读懂序列模型(附用例)
  3. linux安装之后缺少命令,Centos 7 最小安装后关键命令找不到 ifconfig等
  4. (转)搭建Spring4.x.x开发环境
  5. 机皇再翻车!微信、支付宝关停其指纹支付功能,用户难以原谅
  6. 网线(水晶头)制作流程 请附件下载
  7. 「leetcode」C++题解:226.翻转二叉树,递归法与迭代法详解
  8. Pg Admin4 无法正常启动
  9. GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-19475)复现
  10. 航空公司客户价值分析
  11. 第一章 前缀和与差分
  12. 杭州电子科技大学计算机考研录取名单,杭州电子科技大学2017年硕士研究生一志愿考生复试名单公布...
  13. 通用API接口签名算法(参考淘宝)
  14. Modulo Sum
  15. 强烈推荐代码生成器Cursor
  16. 三菱PlC计数器与定时的使用
  17. 新增诊所19804家 | 私营诊所要如何主动?才能被患者选择
  18. RTL8723BU移植
  19. HTML的标准模式与怪异模式
  20. 获取图片Exif信息

热门文章

  1. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
  2. 【数据挖掘】神经网络 后向传播算法 向前传播输入 案例计算分析 ( 网络拓扑 | 输入层计算 | 隐藏层计算 | 输出层计算 )
  3. java多线程基础篇第二篇-volidate关键字
  4. 7-1 银行业务队列简单模拟 (25 分)
  5. Python3 文件的重命名
  6. Meavn 搭建项目遇到Error creating bean with name 'sessionFactory' defined in class path resource...
  7. java基础:任意进制到十进制的转换
  8. base--AuditResult
  9. iOS 加密的3种方法
  10. 分页数据的新展示方式---瀑布流