作为软件工程专业的核心课程之一软件构造结束了,不为博客分数,只为能留下点什么。
PS:下面大多都是我个人的理解,用词上可能不太严谨。
讲述了一个完整的程序的解剖图,不难看出,Code-level是代码逻辑层面,Component-level是代码的物理层面代码本身的文件等等,Moment代表程序在某一时刻的情况,而Period代表程序在生产周期里面相关的事项。Build-time和Run-time就不难理解啦,一个是编译阶段,一个是运行阶段,图上的内容不需要死记硬背,根据特性记忆就可以,唯一需要说的是AST是语法分析树,就是解剖代码的东西,知道了这些,就很好判断位置啦。
SRP The Single Responsibility Principle 单一责任原则
OCP The Open-Closed Principle 开放-封闭原则
LSP The Liskov Substitution Principle Liskov替换原则
ISP The Interface Segregation Principle 接口聚合原则
DIP The Dependency Inversion Principle 依赖转置原则
S:一个类一个作用,自己干自己的事。
O:防止修改,开放扩展。
L:LSP原则,替换时前置更弱后置更强。总的来说就是只能更加好用。
I:不要有大型接口,尽量小一点,使用的时候再组装起来。
D:不同的类只能依赖于其抽象父类,互相尽量不要有黏连。
利用一个工厂类制造出同一类不同的具体类。
利用多个类的工厂聚合出有构架的对象。(Client参与构建过程,东西可能不同但是搭配一定一样)
利用多个类的工厂聚合出有构架的对象。(内含复杂的构建过程,但Client不可见)
在创建一个类的时候永久delegation进去另外一个类,利用该类特性。
通过代理类访问具体类。
用一个数据结构保存很多其他组合对象。
偶像类有很多粉丝类对象,粉丝利用偶像加入偶像,偶像做出改变通知粉丝。(类似微博)
设计一个方法,参数是接口,供类内使用该方法时可以扩展。(OCP原则)
就是设计状态构造一个自动机。
记录一个类的历史状态,可以恢复和管理历史状态。
某些类和接口Client无法使用,使用Adapter使其转化为可以适配的形式。
通过delegation或者继承的方式为该类增加新特性。
将该类封装成简单易操作的形式。(可以想象成要做一个GUI供外界使用)
为某一个方法设计多种不同的算法。(与visitor的区别是这里侧重于算法,方法作用一致,只是性能上面有区别)
做事情的步骤一样,但具体方法不同,共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。使用继承和重写实现模板模式。
独立于元素类型,访问容器内的所有元素。
白盒测试:依据代码结构测试代码(已知代码)
黑盒测试:仅根据Spec测试数据。(TDD测试驱动开发)
阶段清楚,管理简单,无法适应需求变化
多个瀑布串行,比较容易适应需求的增加(有需求就增加一个瀑布)
在原型上持续不断的迭代,发现用户变化的需求
迭代:开发出来后由用户试用/评审,发现问题反馈给卡发着,开发者修改原有的实现,继续交给用户评审
时间代价高,但开发质量也高
多轮迭代基本遵循瀑布模式
每轮迭代有明确的目标,遵循"原型"过程,进行严格的风险分析,方可进入下一轮迭代
通过快速迭代和小规模的持续改进,以快速适应变化
用户高度参与,小步骤迭代确认验证。强调人的作用
Correctness 正确性:按照spec执行,得到正确的结果,软件的行为要严格符合规约中定义的行为
保证正确性:测试和调适、防御式编程,形式化方法(形式化语言)
encapsulation, decentralization 封装、分散化
Robustness 健壮性:针对异常情况的处理:出现规约定义之外的情形,软件做出恰当的反应(出现异常时不要崩溃),未被spec覆盖的情况即为"异常情况"
encapsulation, error handling封装、异常处理
Extendibility 可扩展性:是否容易使软件适应规约的变化
提升可扩展性的两个原则:简约主义设计,分离主义设计
encapsulation, information hiding封装,信息隐蔽(结构良好的对象有简单的接口,并且不向外界显漏任何内部机制。)
Reusability 可复用性:一次开发,多次使用,发现共性
modularity, component, models, patterns模块化、组件、模型、模式
Compatibility 兼容性:不同软件系统之间相互可容易的集成
保持设计的同构性:标准化文件格式,标准化数据结构,标准化用户接口
Efficient 性能:良好的运行性能
Portability 可移植性:软件可方便的在不同的技术环境之间移植:硬件、操作系统
Ease of use 易用性:易学、安装、操作、监控
给用户提供详细的指南,结构简单
Functionality 功能:功能完善。
Timeliness 及时性:及时发布等
其他质量:verifiability 可验证性、integrity完整性,repairability可修复性,economy经济型
代码相关:lines of code(LOC)、cyclomatic complexity 循环复杂性
结构相关:coupling耦合度(多个模块间联系),cohesion聚合度(一个模块;高内聚,一个程序只执行一种功能) (应当 高内聚低耦合,单一责任原则)
Readability 可读性
Understandability 可理解性
Clearness 清晰
Size 文件大小
Correctness and robustness: reliability(可靠性)
Extendibility and reusability: modularity(模块化)
Understandability:注释、命名、日志等
Reusability:ADT、OOP、设计模式等以及复用外部文件
Maintainability and Adaptability
Robustness 异常处理、断言、防御式变成、测试优先原则、日志追踪、debug、内存导出
Performance 代码调优、空间复杂性(内存管理)、时间复杂性(I/O性能等),分布式系统,多线程
$ git status
Lists all new or modified files to be committed
$ git add [file]
Snapshots the file in preparation for versioning
$ git reset [file]
Unstages the file, but preserve its contents
$ git diff
Shows file differences not yet staged
$ git diff --staged
Shows file differences between staging and the last file version
$ git commit -m "[descriptive message]"
Records file snapshots permanently in version history
$ git branch
Lists all local branches in the current repository
$ git branch [branch-name]
Creates a new branch
$ git checkout [branch-name]
Switches to the specified branch and updates the working directory
$ git merge [branch]
Combines the specified branch’s history into the current branch
$ git branch -d [branch-name]
Deletes the specified branch
$ git init [project-name]
Creates a new local repository with the specified name
$ git clone [url]
Downloads a project and its entire version history
$ git fetch [bookmark]
Downloads all history from the repository bookmark
$ git merge [bookmark]/[branch]
Combines bookmark’s branch into current local branch
$ git push [alias] [branch]
Uploads all local branch commits to GitHub
$ git pull
Downloads bookmark history and incorporates changes
上面需要注意pull=fetch + merge
版本之间的演化关系图,一条边B->A表示在版本A的基础上做出改变,形成了版本B,这代表所有的顶点至少有一个入度,至少有0个出度
final类无法产生子类,final变量无法改变值和引用,final方法无法被子类重写
不可变类型使用双线椭圆,可变类型用单线椭圆。
不可变引用使用双线箭头,可变引用用单线箭头。
双线不可以被划掉。
PS:同样的RI也可能有不同的AF。