个人总结的软构重点,也同步到了github上。https://github.com/mathematic-s/computer
代码基础
由功能偏向质量,由具体偏向抽象,由编程偏向工程,由手工偏向工具
-
- Design Goals 编程的视野
- Design Principles 编程的标尺
- Design Patterns 编程的经验
三维度八视图
阶段
构造时build-time / 运行时视图run-time
动态性
时刻moment / 阶段视图period
构造对象
代码code / 构件视图component
Build-time 构建阶段 idea->
requirement->
design->
code->
installable/executable package
代码的逻辑组织
{
f
u
n
c
t
i
o
n
s
c
l
a
s
s
e
s
m
e
t
h
o
d
s
i
n
t
e
r
f
a
c
e
s
代码的逻辑组织\left\{ \begin{array}{lcl} functions\\ classes\\ methods\\ interfaces \end{array} \right.
代码的逻辑组织⎩
⎨
⎧functionsclassesmethodsinterfaces
- Software = Program(codes)
- Software = Algorithm+Data Structure
- Software = Program+Data+Documents
- Software = Modules(Components)+Data/Control Flows
链接 静态链接
库被copy进代码形成整体,执行的时候无需提供库文件动态链接
仅仅做出标记,运行时根据标记加载库文件至内存
SCI Software Connfiguration Item
软件配置项
Evolution Graph 演化图
versioning版本号的一般命名
major.minor.patch
几种代码运行方式
full program interpretation 由runtime system完全载入并interpret
native machine code 完全转换为CPU的可执行程序
Interpreted byte codes 被编译成字节码的形式(如java的class文件)再以前两种方式运行
Perl or Python 在运行时编译成字节码解释执行
snapshot diagram 描述程序运行时,某时刻内存里变量层面的状态
memory dump 内存信息转储,储存程序间断错误或信号
execution tracing 用日志方法记录程序执行的调用次序
event logging (系统层次)抽象的行为和错误日志
- Correctness 按照预先定义的"规约"执行
- Testing and Debugging
- Defensive programming
- Formal approach(高级)
- Robustness 针对异常情况的处理(Exception handling)
合称reliability
- Extendibility 对规约修改的容易程度(高内聚,低耦合,如下)
- Design simplicity简约主义
- Decentralization分离主义
- Reusability 一次开发,多次使用
合称modularity
- Compatibility 不同软件间的相互可容易的集成
- 关键是in homogeneity of design, standardization; 尤其是standard protocols
- Efficiency 在硬件资源上放尽可能少的demands(processor time, space, bandwidth)
- Portability 软件在不同的软硬件环境间移植
- Ease of use 容易use, installation, operation, monitoring
- Structural Simplicity
- Know the user
- Functionality
- Timeliness 按时release
Liskov Substitution PrincipleLSP原则
如果S是T的子类型subtype
,那么程序中使用T类型的对象的地方,也可以用S类型的对象替换,而不会产生任何错误或异常。
委托delegation
是一种设计模式,用于将某个对象的功能委托给另一个对象来处理。它通过在对象之间建立一种关系,使得一个对象能够调用另一个对象的方法,并将任务的执行委托给该对象。
协变Covariance
:
协变是指在类型转换或继承关系中,保持类型关系的方向不变。简而言之,如果类型 A 可以被隐式转换为类型 B,那么 A 是 B 的协变类型。
Composite Reuse Principle (CRP) 更倾向于使用委派而不是继承来实现复用。
SOLID是OO设计原则 5 classes design principles
▪ (SRP) The Single Responsibility Principle 单一责任原则:There should never be more than one reason for a class to change
▪ (OCP) The Open-Closed Principle 开放-封闭原则:行为是可拓展的,自身代码是不可修改的
▪ (LSP) The Liskov Substitution Principle Liskov替换原则:子类型可替换父类型
▪ (DIP) The Dependency Inversion Principle 依赖转置原则:具体应该依赖于抽象
▪ (ISP) The Interface Segregation Principle 接口聚合原则:只提供必须的接口
测试
- LOC
代码行数
- Cyclomatic complexity
循环层次
- coupling and cohesion
耦合度和内聚性
- readability
可读性
Test first programming 先写测试,再写代码
residual defect rates per kloc 每千行代码残留缺陷率
Unit Testing
单元测试
Integration testing
集成测试
System testing
系统测试
黑盒测试 从spec导出测试区间的等价类划分
白盒测试 考虑内部实现细节,对所有执行路径进行等价类划分找出代表性的简单路径
code coverage 代码覆盖度
- Function Coverage
- Statement Coverage
- Branch Coverage
- Condition Coverage
- Path Coverage
构造过程
b a s i c t y p e s { L i n e a r I t e r a t i v e \textcolor{red}{basic\ types} \left\{ \begin{array}{lcl} Linear\\ Iterative\\ \end{array} \right. basic types{LinearIterative
e
x
i
s
t
i
n
g
m
o
d
e
l
s
{
W
a
t
e
r
f
a
l
l
瀑布
I
n
c
r
e
m
e
n
t
a
l
增量
V
−
M
o
d
e
l
V
字
P
r
o
t
o
t
y
p
i
n
g
原型
S
p
i
r
a
l
螺旋
\textcolor{red}{existing\ models}\left\{ \begin{array}{lcl} Waterfall\ 瀑布\\ Incremental\ 增量\\ V-Model\ V字\\ Prototyping\ 原型\\ Spiral\ 螺旋 \end{array} \right.
existing models⎩
⎨
⎧Waterfall 瀑布Incremental 增量V−Model V字Prototyping 原型Spiral 螺旋
Waterfall 线性推进,阶段划分清楚
Increment 多个Waterfall的串行
V-Model Waterfall增加了Verification和Validation
Prototyping 首先做出合适的基础模型,接着不断根据需求迭代
Spiral 风险驱动,多轮迭代基本遵循Waterfall
Agile development 敏捷开发 rapid delivery,eXtreme Programming
Pair Programming 一个人写,一个人看
Scrum 核心是 Sprint(迭代)和 Scrum Team(团队)
Fagan inspection 核心思想是通过系统性的检查和评审来提高软件质量。
Team Version Control
Software Configuration Item 软件中发生变化的基本单元
OOP的基本概念
public
,protected
,default
,private
四种对象访问权限类型
抽象类 包含至少一个抽象方法
abstract class name{
}
- Ad-hoc polymorphism
重载多态 / 运算符多态
函数重载或运算符重载 - Parametric polymorphism
泛型多态 / 参数化多态
泛型 - subtyping(subytpe polymorphism or inclusion polymorphism)
对象多态/继承多态
继承和方法重写
Specifacations
Spec规约
充当过程的实现者与其客户之间的重要防火墙。它使单独开发成为可能:客户可以自由编写使用该过程的代码而无需查看其源代码,而实现者可以自由编写实现该过程的代码而不知道它将如何使用。
Null
值是 Java 类型系统中的一个不幸漏洞。当程序试图在null上调用方法或访问其成员时,会触发NullPointerException(空指针异常)
precondition前提条件
说明参数的限制等,postcondition后置条件
说明返回类型等
java异常
{
c
h
e
c
k
e
d
e
x
c
e
p
t
i
o
n
u
n
c
h
e
c
k
e
d
e
x
c
e
p
t
i
o
n
(
R
u
n
t
i
m
e
E
x
c
e
p
t
i
o
n
)
\left\{ \begin{array}{lcl} checked\ exception\\ unchecked\ exception (RuntimeException) \end{array} \right.
{checked exceptionunchecked exception(RuntimeException)
try,catch,finally
Error表示严重的错误,一般是由于虚拟机出现问题或系统资源耗尽等无法恢复的情况引起的。通常情况下,程序不会捕获和处理Error类型的异常,而是由虚拟机来处理。
Exception表示非致命的异常,可以通过程序的处理来恢复或终止程序的执行。
Designing Specifications
{
d
e
t
e
r
m
i
n
i
s
t
i
c
和
u
n
d
e
t
d
e
t
e
r
m
i
n
e
d
(
不是
n
o
n
d
e
t
e
r
m
i
n
i
s
t
i
c
)
d
e
c
l
a
r
a
t
i
v
e
和
o
p
e
r
a
t
i
o
n
a
l
s
t
r
o
n
g
(
p
r
e
c
o
n
d
i
t
i
o
n
弱,
p
o
s
t
c
o
n
d
i
t
i
o
n
强
)
和
w
e
a
k
\left\{\begin{array}{lcl} deterministic和undetdetermined(不是nondeterministic)\\ declarative和operational\\ strong(precondition弱,postcondition强)和weak \end{array}\right.
⎩
⎨
⎧deterministic和undetdetermined(不是nondeterministic)declarative和operationalstrong(precondition弱,postcondition强)和weak
要求:coherentmeaning that it does one thing and does it well
,
results informative,
strong enough,
weak enouph,
use abstract types when possible
static
vs. instance
static
static关键字用于声明静态成员(变量或方法),即类级别的成员,不依赖于类的实例而存在。
静态成员属于类本身,只会在内存中存在一份副本,被所有类的实例共享。
可以通过类名直接访问静态成员,无需创建类的实例。
静态变量在程序启动时被初始化,可以在任何时候访问。
instance
实例成员是与类的实例相关联的成员,每个类实例都有自己的一组实例成员。
实例成员包括实例变量和实例方法,它们依赖于类的实例的创建和存在。
实例成员在每个类的实例中都有自己的副本,它们独立于其他实例。
实例成员需要通过创建类的实例来访问和使用。
Avoiding Debugging
利用assert
检查先决条件是防御性编程
的一个例子。
不要使用断言来测试程序外部的条件,而是使用异常。
由于断言可能被禁用,您的程序的正确性不应该依赖于断言表达式是否被执行。
assert (x >= 0) : "x is " + x;
当x是-1时,将输出x is -1
默认情况断言语句不执行,必须通过将-ea(代表启用断言)传递给 Java 虚拟机来显式启用断言。
Mutability&Immutability
mutabale objects会使对其大量操作时所需空间复杂度大大降低
passing mutable objects和returning mutable objects一样有latent bug,需要defensive copying
Sharing a mutable object complicates a contract. 因为要用时合同不清楚的话不知道是否已经被人修改
contract: a form of agreement or protocol that establishes the rules of engagement between different parts of a system