定义和分类
•分解:将软件不断地分解为更细粒度的代码单元,例如从组件、模块到文件和类 • 抽象:忽略无关细节,只保留与当前问题相关的关键信息,例如接只抽象使得我们可以针对接口进行编程而忽略内部数据结构、算法等实现细节 • 数据抽象:对于目标对象的数据化抽象描述 • 过程抽象:对一系列过程性步骤和指令序列的整体抽象
核心本质是:屏蔽底层细节,突出事物的本质特性
考察方式:分析抽象是否合理
左边的抽象方案更符合人对于“账户”这个概念的理解,同时也能更好地适应变化:如果银行改变了账户取款的手续费策略,那么只需要修改取款(withdraw)操作的内部实现以调整手续费扣除策略, 而调用该操作的客户端无需修改代码
是:软件系统的顶层设计方案 体现:分解与抽象的原则 作用:
风格
软件体系结构风格
层次化
知识库
管道-过滤器
微服务
以及C/S, B/S
关注点:软件系统中所实现的某种功能或特性,反映不同涉众所关注和关切的方
关注点分离:将软件系统的整体需求分解为尽可能小的关注点并分解到不同的模块单元(例如模块、包、类、方法等)中实现
模块化划分就体现了关注点分离的思想
关注点存在散布和混杂问题 • 散布:与同一关注点相关的职责散布在多个模块单元中 • 混杂:同一模块单元中又混杂了多个关注点的职责
对策:横切关注点,面向切面的编程
【这部分应该后续会展开,到时候看一下】
模块化:将整个产品或系统分解为大小合适、相对独立的模块 模块可替换和拓展
体现分解和抽象的设计思想
好的模块化设计应实现模块的高内聚和低耦合;
模块职责明确专一
examples
例子
将实现细节隐藏在模块内部,仅通过受限的接口对外提供访问
实现: packet private/public
定义:在不改变代码外在行为的前提下,对代码作出修改以改进程序的内部结构----改进设计
目的:提高软件的可维护性和可扩展性
和其他概念的关系:是敏捷开发里推崇的一种开发实践,是实现演化式设计(即随着迭代化的开发过程逐步完善设计)的一种重要手段
在不同软件系统中或同一软件系统的不同部分重复使用相同或相似的软件代码、软件设计或其他相关的软件知识
examples 源代码复制粘贴(不推荐) • 软件库(包括编程语言开发库以及第三方库)API调用 • 软件设计模式(需要结合具体问题需要进行实例化) • 面向特定类型软件应用的软件框架(例如Spring框架
软件复用的两个方面 • 面向复用的软件开发:为未来的软件开发提供软件复用机会和可复用软件资产,为此需要考虑共性抽象和封装 • 基于复用的软件开发:利用潜在复用机会进行开发,需要考虑适合于当前项目的软件框架、设计模式和软件组件
好处