软件构造期末复习

文章探讨了软件构造的重点,包括代码基础、设计目标与原则、编程经验、代码的逻辑组织,以及软件的各个构成部分。强调了模块化、兼容性、效率和易用性等外部质量因素,同时提到了内部质量因素如代码行数、耦合度和内聚性。文章还涵盖了测试方法、软件开发模型,并讨论了OOP的概念和设计模式,如LSP原则、CRP原则和SOLID原则。此外,提到了避免调试的策略和不可变性在软件设计中的重要性。
摘要由CSDN通过智能技术生成

个人总结的软构重点,也同步到了github上。https://github.com/mathematic-s/computer

代码基础

由功能偏向质量,由具体偏向抽象,由编程偏向工程,由手工偏向工具

    • Design Goals 编程的视野
    • Design Principles 编程的标尺
  1. 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 (系统层次)抽象的行为和错误日志

external quality factor

  1. Correctness 按照预先定义的"规约"执行
    • Testing and Debugging
    • Defensive programming
    • Formal approach(高级)
  2. Robustness 针对异常情况的处理(Exception handling)

    合称reliability

  3. Extendibility 对规约修改的容易程度(高内聚,低耦合,如下)
    • Design simplicity简约主义
    • Decentralization分离主义
  4. Reusability 一次开发,多次使用

    合称modularity

  5. Compatibility 不同软件间的相互可容易的集成
    • 关键是in homogeneity of design, standardization; 尤其是standard protocols
  6. Efficiency 在硬件资源上放尽可能少的demands(processor time, space, bandwidth)
  7. Portability 软件在不同的软硬件环境间移植
  8. Ease of use 容易use, installation, operation, monitoring
    • Structural Simplicity
    • Know the user
  9. Functionality
  10. 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 接口聚合原则:只提供必须的接口

测试

internal quality factor

  1. LOC代码行数
  2. Cyclomatic complexity循环层次
  3. coupling and cohesion耦合度和内聚性
  4. readability可读性

Test first programming 先写测试,再写代码
residual defect rates per kloc 每千行代码残留缺陷率
Unit Testing单元测试
Integration testing集成测试
System testing系统测试
黑盒测试 从spec导出测试区间的等价类划分
白盒测试 考虑内部实现细节,对所有执行路径进行等价类划分找出代表性的简单路径
code coverage 代码覆盖度

  1. Function Coverage
  2. Statement Coverage
  3. Branch Coverage
  4. Condition Coverage
  5. 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 增量VModel VPrototyping 原型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{
    
}

多态

  1. Ad-hoc polymorphism重载多态 / 运算符多态 函数重载或运算符重载
  2. Parametric polymorphism泛型多态 / 参数化多态 泛型
  3. 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. deterministicundetdetermined(不是nondeterministic)declarativeoperationalstrong(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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值