敏捷设计
•全局视图和软件一起演化
•设计尽可能适合当前系统,关注当前系统结构
•增量地演化出系统最佳架构和设计
•设计和架构过程是持续不断进行的
•从根本上讲,源代码就是设计
•敏捷设计是一个过程,不是一个事件,是一个持续的应用原则、模式以及实践来改进软件结构和可读性的过程
•敏捷设计步骤
–遵循敏捷实践去发现问题
–应用设计原则去诊断问题
–应用适当模式去解决问题
设计臭味
•设计臭味
–僵化性(rigidity)——连锁改动
–脆弱性(fragility)——耦合、易遭破坏
–顽固性(immobility)——难以重用
–粘滞性(viscosity)——难以做正确的事情
–不必要的复杂性(needlesscomplexity)——过度设计
–不必要的重复(needlessrepetition)——忽略抽象
–晦涩性(opacity)——难以理解
SRP(单一职责原则)
•内聚性
–一个模块的组成元素之间的功能相关性
•SRP
–一个类应该只有一个发生变化的原因,及一个类应该只有一个职责
•职责
–发生变化的原因
–需求变化反应为职责的变化
•软件设计,就是要发现职责,并把它们相互分离
OCP(开放-封闭原则)
•封闭是建立在抽象的基础之上的
•只受一次愚弄
•刺激变化:测试驱动、快速交付
•正确判断各种变化的可能
•一直等到变化发生时才采取行动
•OCP是面向对象设计的核心所在
•拒绝不成熟的抽象和抽象本身一样重要
•OCP背后的主要机制是抽象和多态
•有经验的设计人员希望自己对用户和应用领域很了解,能够以此来判断各种变化的可能性。然后,他可以让设计对于最有可能发生的变化遵循OCP原则
LSP(Liskov替换原则)
•子类型必须能够替换掉它们的基类型,替换后,程序的行为功能不变
•一个自相容的设计未必就和所有的用户程序相容
•一个模型的有效性只能通过它的客户程序来表现
•在考虑一个特定设计是否恰当时,不能完全孤立的来看这个解决方案,必须根据该设计的使用者所作出的合理假设来审视它(这些合理的假设常常以断言的形式出现在为基类编写的单元测试中)
•违反LSP往往是很微妙的
基于契约的设计
•LSP清楚的指出,OOD中的IS-A关系是就行为方式而言的,行为方式是可以进行合理假设的,是客户程序所依赖的。
•使用基于契约的设计可以使LSP明确化
•基于契约的设计
–在重新声明派生类的例程中,只能使用相等或更弱的前置条件,只能使用相等或更强的后置条件
–若违反了这条原则,则必定违反LSP原则
•为每个方法的注释添加前置和后置条件
•通过单元测试来指定契约
DIP(依赖倒置原则)
•DIP
–高层模块不应该依赖底层模块,二者都应该依赖于抽象
–抽象不应该依赖于细节。细节应该依赖于抽象
•框架设计的核心原则
•DIP解析
–高层模块即客户端或使用方,底层模块即服务端
–应由使用方提出所需的接口,由服务方来实现这些接口的具体功能
–因此软件开发的过程应该是自上而下的
•抽象接口归客户端所有
ISP(接口隔离原则)
•不应该强迫客户程序依赖它们并不使用的方法/接口。
•分离客户就是分离接口。
分享到:
相关推荐
Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...
### FPGA自学笔记——设计与验证公开版 #### 1. FPGA技术背景与发展趋势 随着FPGA技术的不断发展,从最初的简单逻辑粘合逐渐演变为现在的可编程片上系统(SoC),FPGA的应用范围也在不断扩大。例如Altera(现已被...
通过阅读和学习这些JAVA学习笔记,开发者不仅可以掌握JAVA编程的基本技能,还能深入了解其设计理念,从而更好地应对各种实际开发问题。不断更新和完善自己的JAVA知识体系,对于成为一名优秀的JAVA开发者至关重要。
S7-200 Smart入门笔记1——流水灯 按钮 S7-200 Smart入门笔记1——流水灯 定时器 S7-200 Smart入门笔记2——读时钟 S7-200 Smart入门笔记3——呼吸灯 S7-200 Smart入门笔记4——全局变量和局部变量 S7-200 Smart入门...
在描述中,“论文笔记模板——自用xmind模板.zip”重复了标题的信息,进一步确认这是一个专为记录和组织论文相关笔记设计的模板,可能包含了特定的结构、主题和样式,适合个人使用。 由于标签为空,我们无法直接...
通过阅读这些笔记,学习者不仅可以掌握前端开发的基本技能,还能了解到实际开发中可能会遇到的问题和解决策略。 文件列表中的"CSS1"和"CSS2"可能包含了一些CSS的实例或练习,"html"文件夹可能包含了HTML页面示例,...
这篇压缩包文件“上海初三英语阅读精讲笔记1——阅读A篇题型-原创.rar”显然是针对中国上海市初中三年级学生的一份英语学习资料,重点在于提高学生的阅读理解能力。其中包含了一个PDF文档,名为“上海初三英语阅读...
**思源笔记插件——汇总散落在整个工作空间的任务 Siyuan Note Plugin** 思源笔记(Siyuan Note)是一款开源的个人知识管理系统,它以其强大的笔记组织功能和灵活的自定义能力受到许多用户的喜爱。在日常工作中,...
记忆笔记一——文化生活二 .pdf
本资源提供了一份“论文笔记模板——自用xmind模板”,旨在帮助用户以更有序的方式整理和记录论文阅读心得。 Xmind是一款强大的思维导图软件,它以其直观的界面和丰富的功能深受用户喜爱,尤其适用于整理复杂信息和...
### C语言设计笔记——分享设计思路 #### 软件工程的三要素 - **方法**:提供“如何做”的技术指导,是软件开发的基础。 - **工具**:为软件工程方法提供自动化的或半自动的支持环境,提高开发效率。 - **过程**:...
读书笔记——AGoodManIsHardToFind.pdf 读书笔记——AGoodManIsHardToFind.pdf 是一篇关于美国南方女作家 Flannery O'Connor 的读书笔记。该笔记主要讨论了 O'Connor 的小说《好人难寻》(A Good Man Is Hard to ...
学习笔记之——基于pytorch的FSRCNN 把我的代码上传了,后续有更正会更新这个代码
公开课笔记3——局部加权回归、逻辑斯蒂回归、感知器算法 公开课笔记4——牛顿方法、指数分布族、广义线性模型 公开课笔记5——生成学习、高斯判别、朴素贝叶斯 公开课笔记6——NB多项式模型、神经网络、SVM初步 ...
读书笔记:数学之美读书笔记——吴军博士2020年寒假大三上学期
《FPGA自学笔记——设计与验证jmb》是一本针对初学者精心编写的教程,旨在帮助读者快速掌握FPGA(Field-Programmable Gate Array,现场可编程门阵列)的基础知识并进行实际的设计与验证。小梅哥,这位业界知名人士,...
Spring.NET学习笔记22——整合WCF(应用篇) http://www.cnblogs.com/GoodHelper/archive/2010/05/15/SpringNet_Wcf.html
个人网课学习笔记