跳到主要内容

概述

软件工程就是用科学的知识和技术原理来定义、开发、维护软件的一门学科。 目标:

  1. 较低的开发成本
  2. 要求的功能
  3. 更好的性能
  4. 易于移植
  5. 较低的维护费用
  6. 按时完成任务
  7. 可靠性好

1968 年 NATO(北大西洋公约组织)提出了软件危机(Software crisis)一词。同年,为了解决软件危机问题,“软件工程”的概念诞生了。一门叫做软件工程的学科也就应运而生。随着时间的推移,软件工程这门学科也经历了一轮又一轮的完善,其中的一些核心内容比如软件开发模型越来越丰富实用!什么是软件危机呢?简单来说,软件危机描述了当时软件开发的一个痛点:我们很难高效地开发出质量高的软件。

Dijkstra(Dijkstra 算法的作者) 在 1972 年图灵奖获奖感言中也提高过软件危机,他是这样说的:“导致软件危机的主要原因是机器变得功能强大了几个数量级!坦率地说:只要没有机器,编程就完全没有问题。当我们有一些弱小的计算机时,编程成为一个温和的问题,而现在我们有了庞大的计算机,编程也同样成为一个巨大的问题”。说了这么多,到底什么是软件工程呢?工程是为了解决实际的问题将理论应用于实践。软件工程指的就是将工程思想应用于软件开发。上面是我对软件工程的定义,我们再来看看比较权威的定义。IEEE 软件工程汇刊给出的定义是这样的:

  1. 将系统化的、规范的、可量化的方法应用到软件的开发、运行及维护中,即将工程化方法应用于软件。
  2. 在(1)中所述方法的研究。总之,软件工程的终极目标就是:在更少资源消耗的情况下,创造出更好、更容易维护的软件。

重点:

  1. 可行性研究
  2. 需求分析
  3. 总体设计
  4. 详细设计
  5. 实现
  6. 维护
软件工程三要素
  1. 方法: 完成软件开发的各项任务的技术方法
  2. 工具: 为运用方法提供的自动或半自动的软件工程的支撑环境
  3. 过程: 获得高质量软件所需要完成的一系列任务的框架

软件危机

计算机软件的开发和维护中遇到的一系列(效率下降和质量下降)的问题。

  1. 开发成本高,进度估计不准
  2. 对已完成的软件系统不满意
  3. 质量差、可靠性差
  4. 可维护性差
  5. 没有合适的文档资料
  6. 软件成本逐年上升
  7. 软件开发生产率之后于硬件和计算机应用普及
产生原因
  1. 软件本身的特性:缺乏可见性
  2. 对软件开发的错误认识和做法
  3. 开发和维护的方法不准确

软件开发过程

维基百科是这样定义软件开发过程open in new window的:软件开发过程(英语:software development process),或软件过程(英语:software process),是软件开发的开发生命周期(software development life cycle),其各个阶段实现了软件的需求定义与分析、设计、实现、测试、交付和维护。软件过程是在开发与构建系统时应遵循的步骤,是软件开发的路线图。需求分析:分析用户的需求,建立逻辑模型。软件设计:根据需求分析的结果对软件架构进行设计。编码:编写程序运行的源代码。测试 : 确定测试用例,编写测试报告。交付:将做好的软件交付给客户。维护:对软件进行维护比如解决 bug,完善功能。软件开发过程只是比较笼统的层面上,一定义了一个软件开发可能涉及到的一些流程。软件开发模型更具体地定义了软件开发过程,对开发过程提供了强有力的理论支持。

高内聚低耦合

耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。 内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。 耦合:一个软件结构内不同模块之间互连程度的度量。 对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。

耦合包括:

  1. 数据耦合
  2. 标记耦合
  3. 控制耦合
  4. 外部耦合
  5. 内容耦合

内聚包括:

  1. 偶然内聚
  2. 逻辑内聚
  3. 时间内聚
  4. 过程内聚
  5. 通信内聚
  6. 顺序内聚
  7. 功能内聚

降低耦合度的方法

1、少使用类的继承,多用接口隐藏实现的细节。 Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。 2、模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。(其实这是高内聚的一种说法,高内聚低耦合一般同时出现)。 3、遵循一个定义只在一个地方出现。 4、少使用全局变量。 5、类属性和方法的声明少用public,多用private关键字。 6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。 7、尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。 8、最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。

增强内聚度方法

1、模块只对外暴露最小限度的接口,形成最低的依赖关系。 2、只要对外接口不变,模块内部的修改,就不得影响其他模块。 3、删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分。

结构化设计

要点是自顶向下,有整体到部分、抽象到具体。

  1. 模块化
  2. 由顶向下
  3. 上层模块分解成下层模块
Loading Comments...