概述
软件工程就是用科学的知识和技术原理来定义、开发、维护软件的一门学科。 目标:
- 较低的开发成本
- 要求的功能
- 更好的性能
- 易于移植
- 较低的维护费用
- 按时完成任务
- 可靠性好
1968 年 NATO(北大西洋公约组织)提出了软件危机(Software crisis)一词。同年,为了解决软件危机问题,“软件工程”的概念诞生了。一门叫做软件工程的学科也就应运而生。随着时间的推移,软件工程这门学科也经历了一轮又一轮的完善,其中的一些核心内容比如软件开发模型越来越丰富实用!什么是软件危机呢?简单来说,软件危机描述了当时软件开发的一个痛点:我们很难高效地开发出质量高的软件。
Dijkstra(Dijkstra 算法的作者) 在 1972 年图灵奖获奖感言中也提高过软件危机,他是这样说的:“导致软件危机的主要原因是机器变得功能强大了几个数量级!坦率地说:只要没有机器,编程就完全没有问题。当我们有一些弱小的计算机时,编程成为一个温和的问题,而现在我们有了庞大的计算机,编程也同样成为一个巨大的问题”。说了这么多,到底什么是软件工程呢?工程是为了解决实际的问题将理论应用于实践。软件工程指的就是将工程思想应用于软件开发。上面是我对软件工程的定义,我们再来看看比较权威的定义。IEEE 软件工程汇刊给出的定义是这样的:
- 将系统化的、规范的、可量化的方法应用到软件的开发、运行及维护中,即将工程化方法应用于软件。
- 在(1)中所述方法的研究。总之,软件工程的终极目标就是:在更少资源消耗的情况下,创造出更好、更容易维护的软件。
重点:
- 可行性研究
- 需求分析
- 总体设计
- 详细设计
- 实现
- 维护
软件危机
计算机软件的开发和维护中遇到的一系列(效率下降和质量下降)的问题。
- 开发成本高,进度估计不准
- 对已完成的软件系统不满意
- 质量差、可靠性差
- 可维护性差
- 没有合适的文档资料
- 软件成本逐年上升
- 软件开发生产率之后于硬件和计算机应用普及
软件开发过程
维基百科是这样定义软件开发过程open in new window的:软件开发过程(英语:software development process),或软件过程(英语:software process),是软件开发的开发生命周期(software development life cycle),其各个阶段实现了软件的需求定义与分析、设计、实现、测试、交付和维护。软件过程是在开发与构建系统时应遵循的步骤,是软件开发的路线图。需求分析:分析用户的需求,建立逻辑模型。软件设计:根据需求分析的结果对软件架构进行设计。编码:编写程序运行的源代码。测试 : 确定测试用例,编写测试报告。交付:将做好的软件交付给客户。维护:对软件进行维护比如解决 bug,完善功能。软件开发过程只是比较笼统的层面上,一定义了一个软件开发可能涉及到的一些流程。软件开发模型更具体地定义了软件开发过程,对开发过程提供了强有力的理论支持。
高内聚低耦合
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。 内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。 耦合:一个软件结构内不同模块之间互连程度的度量。 对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。
耦合包括:
- 数据耦合
- 标记耦合
- 控制耦合
- 外部耦合
- 内容耦合
内聚包括:
- 偶然内聚
- 逻辑内聚
- 时间内聚
- 过程内聚
- 通信内聚
- 顺序内聚
- 功能内聚
降低耦合度的方法
1、少使用类的继承,多用接口隐藏实现的细节。 Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。 2、模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。(其实这是高内聚的一种说法,高内聚低耦合一般同时出现)。 3、遵循一个定义只在一个地方出现。 4、少使用全局变量。 5、类属性和方法的声明少用public,多用private关键字。 6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。 7、尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。 8、最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。
增强内聚度方法
1、模块只对外暴露最小限度的接口,形成最低的依赖关系。 2、只要对外接口不变,模块内部的修改,就不得影响其他模块。 3、删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分。
结构化设计
要点是自顶向下,有整体到部分、抽象到具体。
- 模块化
- 由顶向下
- 上层模块分解成下层模块