软构笔记-9-面向复用的软件构造技术

Posted blogstb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软构笔记-9-面向复用的软件构造技术相关的知识,希望对你有一定的参考价值。

软构9 面向复用的软件构造技术

本章大纲:

  • 软件复用的优缺点
  • 为复用而construct
  • 通用可复用组件的特征
  • 开发便携式应用系统的方法
  • 可复用组件的级别和形态
    • 源代码级别的复用
    • 模块级别的复用:类/抽象类/接口
    • 库级别的复用:API/包
    • 系统级别的复用:框架

源代码复用

类型:

  • 白盒复用:源代码可见,可修改和扩展
    • 复制已有代码到正在开发的系统,进行修改
    • PRO:可定制化程度高
    • 其修改增加了软件的复杂度,且需要对其内部充分的了解
  • 黑盒复用:源代码不可见,不能修改
    • 只能通过API接口来使用,无法修改代码
    • Pro:简单,清晰
    • 适应性差些

模块级别的复用 class/interface

class 的复用

两种方式:

  • inheritance 继承
  • delegation 委派
    delegation是当一个对象依赖另一个对象来实现其功能的某些子集时

在OOP中设计复用类

方法:

  • 子类型多态
  • LSP原则

子类型多态

在JAVA中:

  • 子类型可以增加方法,但不可删
  • 子类型需要实现抽象类型中的所有未实现方法
  • 子类型中重写的方法必须有相同类型的返回值或者符合co-variancel的返回值
  • 子类型中重写的方法必须使用同样类型的参数或者符合contra-variancel的参数
  • 子类型中重写的方法不能抛出额外的异常,抛出相同或者符合co-variance的异常

对方法来说意味着:

  • 更强的不变量
  • 更弱的前置条件
  • 更强的后置条件

LSP原则

LSP is a particular definition of a subtyping relation,called (strong) behavioral subtyping强行为子类型化
在编程语言中,LSP依赖以下限制:

  • 前置条件不能强化
  • 后置条件不能弱化
  • 不变量要保持
  • 子类型方法参数:逆变
  • 子类型方法的返回值:协变
  • 异常类型:协变
协变

父类型→子类型:越来越具体specific
返回值类型:不变或变得更具体
异常的类型:也是如此。

反协变、逆变

父类型>子类型:越来越具体specific
参数类型:要相反的变化,要不变或越来越抽象

软件构造常用技术

软件构造常用技术:

1.软件复用

软件复用是指在构造新的软件系统的过程中,对已存在的软件产品(设计结构、源代码、文档等)重复使用的技术

软件复用有三个层次:知识的复用、方法的复用和软件成分的复用,前两个属于知识工程的范畴,这里只讨论软件成分的复用。软件成分的复用包括

  (1)代码的复用,可以采用源代码剪贴、源代码包含和继承来实现。

  (2)设计结果的复用,是指复用某个软件系统的设计模型,适用于软件系统的移植。

  (3)分析结果的复用,是指复用某个软件系统的分析模型,适用于用户需求未改变,而系统体系结构变化的场合。

软件复用的意义是降低软件开发和维护的成本,提高软件开发效率,提高软件的质量。

 

2.类的设计与使用

  类是封装对象属性和行为的载体,在JAVA中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。类的设计与使用,另JAVA的编程更加简单,易于理解与操作。

 

3.抽象数据类型

抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。

 

4.错误处理

  设置了具体的异常类,可以更加清晰地看出程序所发生地错误。在程序中可以捕获异常,另程序正常退出或者忽略错误继续执行。

 

5.分布式程序构造

  分布式应用程序利用多台机器的资源及许多进程的空间,把应用程序分成更易管理的任务组,这些任务组能在各种不同的结构下进行部署。把应用程序分成很多组有许多好处,最直接的就是可以重复使、扩充和管理。

1、两层应用程序(客户端/服务端)

    先举例简单描述一下两层的客户端/服务器结构。典型的结构是一个客户端的用户PC机(前端)和一个包含数据库的网络服务器(后端),逻辑上根据两者的物理位置划分。通常客户端包含大部分业务逻辑,随着数据库及存储过程的发展,SQL语言允许业务逻辑在数据库服务器中存储并执行。

2、三层和N层应用程序

   由于两层应用程序即客户端/服务器端结构的功能限制,分布式应用程序通常分为三层或者更多层。每层的组件都执行一个特定类型的处理,但目前最常用的是三层应用程序结构。在三层应用程序中,包含一个用户服务层(表现层),一个业务服务层和一个数据服务层。三层结构和传统的二层客户端/服务器结构的主要区别就是在三层体系内,业务逻辑层从用户界面和数据源中分离出来。把应用程序划分成独立的层或部分能减小整个应用程序的复杂性,并且使应用程序能够更好的扩展,跟得上企业发展的需要。

 

6.单元测试:

  单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

 

7.重构

   程序员对已有程序在尽量不改变接口的前提下,进行重新编写代码的工作,一般有以下几方面:

(1). 去除已知bug。

(2). 提高程序运行效率。

(3). 增加新的功能。

通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

 

8.极限编程

极限编程是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。

 

以上是关于软构笔记-9-面向复用的软件构造技术的主要内容,如果未能解决你的问题,请参考以下文章

软构笔记-7-面向对象的编程

软件构造复习

可复用

软件构造复习内容---面向复用的设计模式

面向对象软件构造 (Bertrand Meyer 著)

软件构造第五章第三节 可复用的设计模式