软件构造不是简单的写完源代码,能够成功运行就可。一般通过三维度、八视图的方法来认识软件构造。
软件构造的三个维度:
按阶段分:build-time / run-time;
按动态性分:moment / period;
按构造对象分:code-level / component-level。
三维度、八视图的总图:
-
build-time,moment,code-level
这里面涉及到三个相互关联的层面:词汇层面、语法层面、语义层面;
**词汇层面:**基于词汇的半结构化源代码,之所以半结构化是为了便于程序员理解 的同时便于编译器理解。
**语法层面:**程序的语法结构。具体的例子有AST(抽象语法树),是将程序按照语法结构化的形成一棵树来反映程序,对树的各种操作就是对代码的修改。
**语义层面:**程序的语义机构。具体的例子有类图(UML),他描述了interfaces、classes、attributes、methods以及他们之间的关系。 -
build-time,period,code-level
这个视图中描述了代码的变化,具体有代码行的增加、删除和修改。在github每次提交的时候我们可以很清楚的看到这个视图。 -
build-time,moment,component-level
这个视图描述的是软件的物理组成结构,也就是文件组成结构。大部分的开发需要大量的文件,如何组织这些文件就是这个视图所要展示的,对于一些功能相关的文件我们需要把他们放在一个包中,进而形成组件或者子系统,对于一些可复用的组件我们可以将他们封装成库,同时我们在开发过程中很大可能性要用到其他库中的某些功能,一种实现技术就是通过静态链接的方式。 -
build-time,period,component-level
软件开发是一个长久的,不断迭代的过程,在上一个时刻用这个算法编写的代码,下一个时刻需要用其他算法,或者某一个时刻的代码中包含了某个bug,需要修复。这些变化一般是发生的某个组件中的,不需要修改全部。可以一张图来表示:
-
run-time,moment,code-level
Code snapshot:描述了程序运行时内存里变量层面的状态。
memory dump:一种可以反应内存状态的文件,当进程因为错误或者信号终止时产生。里面包含了寄存器的信息,栈的信息以及程序的数据。 -
run-time,period,code-level
这个视图展示了代码在运行时的调用和继不同的机器承关系,可以通过日志方式记录调用次序。 -
run-time,moment,component-level
举个栗子:一个分布式的系统需要配置到多个物理机器上,如何将这些组件配置到机器上以及他们之间的关系就是这个系统在这个视图中的表现。用一张图表示为:
-
run-time,period,component-level
这个视图展示了软件运行过程过系统层面上产生的信息。可以通过事件日志记录,记录事件发生的地点,时间,信息等。