2-2 软件构造的流程和工具
广义的软件构造:Design ==> Programming/refactoring ==> Debugging ==> Testing ==> Build ==> Release
狭义的软件构造:Validate ==> Compile ==> Link ==> Test ==> Package ==> Install ==> Deploy
一.软件构造流程
构造语言的3部分:
- 编程语言: C++, Java, Python...
- 模型语言: UML等
- 配置语言: XML等
1.编程语言
静态语言: 变量创建时必须声明类型
如c语言中: int a =5;
动态语言:变量创建时不需要生命类型,程序运行时自行判断
如python中: a = 5
编译型语言:先源代码编译生成机器语言,再由机器运行机器码
编译型语言有:C/C++、Pascal/Object Pascal
解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。
解释型语言有:JavaScript、VBScript、Perl、Python、Ruby、MATLAB
比较:
编译型语言,执行速度快、效率高;依靠编译器、跨平台性差些。 解释型语言,执行速度慢、效率低;依靠解释器、跨平台性好。
Java语言具备以上两种类型的性质: 既要编译又要运行.
强类型定义语言:一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了
弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值
2.建模语言和工具
建模语言是一种人工语言,用于表达信息、知识或系统,以一套一致的规则定义来可视化、推理、验证和交流系统的设计。最常用的建模语言是UML(Unified Modeling Language,统一建模语言)。建模语言的关键在于能够实现模型概念的传递。
统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。
类图(Class Diagram): 类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。
类图的3个基本组件:类名、属性、方法。
1.泛化,即继承(generalization):表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节。直接使用语言中的继承表达。在类图中使用带三角箭头的实线表示,箭头从子类指向父类。
2.实现(Realization):在类图中就是接口和实现的关系。这个没什么好讲的。在类图中使用带三角箭头的虚线表示,箭头从实现类指向接口。
3.依赖(Dependency):对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类。
4.关联(Association) : 对象之间一种引用关系,比如客户类与订单类之间的关系。这种关系通常使用类的属性表达。关联又分为一般关联、聚合关联与组合关联。后两种在后面分析。在类图使用带箭头的实线表示,箭头从使用类指向被关联的类。可以是单向和双向
4.聚合(Aggregation) : 表示has-a的关系,是一种不稳定的包含关系。较强于一般关联,有整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。在类图使用空心的菱形表示,菱形从局部指向整体。
5.组合(Composition) : 表示contains-a的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。是一种更强的聚合关系。部分不能脱离整体存在。如公司和部门的关系,没有了公司,部门也不能存在了;调查问卷中问题和选项的关系;订单和订单选项的关系。在类图使用实心的菱形表示,菱形从局部指向整体。
6.多重性(Multiplicity) : 通常在关联、聚合、组合中使用。就是代表有多少个关联对象存在。使用数字..星号(数字)表示。如下图,一个割接通知可以关联0个到N个故障单。
聚合和组合的区别
这两个比较难理解,重点说一下。聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
聚合关系图:
组合关系图:
小结:对象之间的联系
继承 inheritance :一般与特殊的关系 is a kind of组合 composition :部分与整体的关系,彼此不可分 is part of聚合 aggregation :部分与整体的关系,但彼此可分 owns a关联 association :对象之间的长期静态联系 has a依赖 dependence :对象之间的动态的、临时的通信联系 use a类间联系的强度:继承 >>> 组合 >> 聚合 >> 关联 >>> 依赖
3.配置语言
配置程序的参数和初始设置,应用应提供工具支持配置文件的维护
如: XML, YAML, JSON
XML:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
什么是可扩展标记语言?
- 可扩展标记语言是一种很像超文本标记语言的标记语言。
- 它的设计宗旨是传输数据,而不是显示数据。
- 它的标签没有被预定义。您需要自行定义标签。
- 它被设计为具有自我描述性。
- 它是W3C的推荐标准。
YAML是“YAML不是一种标记语言”的外语缩写 ;但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
二.代码走查
一种结构化的检查代码和文档缺陷的过程
代码静态分析:
定义:是在不执行计算机程序的条件下,对源代码进行分析,找出代码缺陷。
执行方式:一般配合静态程序分析工具进行,如CheckStyle, FindBugs, PMD for Java
可检测类型:死锁,空指针,资源泄漏,缓存区溢出,安全漏洞,竟态条件。
用途:程序翻译/编译,程序优化重构,软件缺陷检测等。
1.能够检测所有的代码级别可执行路径组合,快速,准确。
2.直接面向源码,分析多种问题。
3.在研发阶段开始找到并修复多种问题,节省大量时间,人力成本
动态调试技术
动态调试技术在软件逆向工程领域也是一个很热门的概念,他是与静态分析技术相对而言的。静态分析技术是指破解者利用反汇编工具将二进制的可执行文件翻译成汇编代码,通过对代码的分析来破解软件。而动态调试则是指破解者利用调试器跟踪软件的运行,寻求破解的路径。
代码动态调试技术,一般是通过观察程序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用情况等等,分析函数功能,明确代码逻辑,挖掘可能存在的漏洞。
运行程序以分析代码;利用测试度量技术(如覆盖率)确保代码的可能功能均被充分测试到
Profiling 用来测量程序的时空复杂度,特定指令或函数的调用频率或持续时间
三.调试和测试(Debugging and Testing)
测试(test): 判断软件是否存在错误
调试(debug): 找到错误(bug)并改正的过程
注意: 测试和调试不会提升软件质量,而是发现缺陷的主要手段,软件质量应通过认真的分析需求、良好的设计、高质量的编码来确保。
四.重构(Refactoring)
重构是在不改变代码外部行为的前提下,改善其内部结构。
五.编译
For Java:
– Make
– Ant
– Maven
– Gradle
– Eclipse
原文地址:https://www.cnblogs.com/lee3258/p/11994069.html