在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发、和维护的成本

目录

  • 几个问题
  • 为什么要学习设计模式
  • 优良架构设计的具体指标
  • 理解复杂系统
  • 面向对象思想(指导复杂系统的分析、设计、实现)
  • 设计原则
  • 设计模式

几个问题

  • 单一职责原则的职责是什么
  • 依赖倒置中的依赖是什么?(依赖注入DI,和 IOC 控制反转)
  • 组合与聚合的区别是什么
  • 贫血模型与充血模型的差异在什么地方
  • 阅读开源项目代码时,单个方法可以理解,整体看不懂

为什么要学习设计模式

  • 有助于更快地读懂开源项目代码
  • 自己编写通用组件、框架

设计模式可以帮助我们优化系统的设计,增强系统的健壮性,可扩展性

优良架构设计的具体指标

  • 可维护性
  • 可读性
  • 可扩展性
  • 灵活性
  • 简洁性
  • 可复用性
  • 可测试性

可维护性

  • 在不破坏原有代码设计、不引入新的 bug 的情况下,能够快速地修改或者添加代码
  • 代码分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设计原则

可读性

  • 任何傻瓜都会编写计算机能理解的代码
  • 好的程序员能够编写人能够理解的代码
  • 代码只是偶尔拿出来给机器读一下,大多数时候都是给人读的

可扩展性

  • 代码预留了一些功能扩展点,可以把新功能代码,直接插到扩展点上,而不需要因为添加一个功能而大动干戈,改动大量原始代码
  • 对修改关闭,对扩展开放原则

灵活性

  • 当我们添加一个新的功能代码的时候,原有的代码已经预留好了扩展点,我们不需要修改原有的代码,只要在扩展点上添加新的代码即可
  • 当我们要实现一个功能的时候,发现原有代码中,已经抽象出了很多底层可以复用的模块、类等代码,我们可以拿来直接使用
  • 当我们使用某组接口的时候,如果这组接口可以对应各种使用场景,满足各种不同的需求

简洁性

  • 代码简单,逻辑清晰
  • KISS 原则(Keep It Simple, Stupid)

可复用性

  • 解耦、高内聚、低耦合、模块化、组件化

可测试性

  • 单元测试友好 Mock

理解复杂系统

  • 系统思维
  • 什么是复杂系统
  • 系统复杂的原因
  • 软件系统的复杂性
  • 控制复杂性
  • 面向过程与面向算法

系统思维

什么是系统?

  • 系统是由一组实体和这些实体之间的关系所构成的集合,其功能要大于这些实体各个功能之各(涌现原则)
  • 系统并不是其组成物的简单加总,而是这些组成物之间互动的产物 -- Russell Ackoff
  • 整体大于其各部分之和 -- 亚里士多德

什么是复杂系统

由很多高度相关、高度互联和高度混杂的元素或实体所组成的系统

系统复杂的原因

  • 我们总是有“更多的要求”(更多功能,更好性能,更健壮,更灵活)
  • 我们要求系统能够与其它系统相互协作,相互连接
  • 要用大量的信息来指定并描述

软件系统的复杂性

  • 问题域的复杂性
  • 管理开发过程的复杂性
  • 软件系统中随处可能出现的灵活性
  • 描述离散系统行为的问题

控制复杂性

  • 算法分解
  • 面向对象分解

面向对象思想(指导复杂系统的分析、设计、实现)

  • 面向过程与面向算法
  • 对象
  • 抽象
  • 封装
  • 分解
  • 分层

面向过程与面向算法

面向对象

它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石

面向过程

它以过程(可以理解为方法、函数、操作)作为组织代码的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点。面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能

对象

对象是一个实体,这个实体具有明确定义的边界(Boundary)和标识(Identity),并且封装了状态(State)和行为(Behavior)

  • 对象具有明确定义的边界和标识
  • 对象封装了状态和行为

类是一种抽象,它将相似的实体抽象成相同的概念,这种抽象过程强调相关特征而忽略其他特征

抽象

抽象(Abstraction)的过程就是揭示事物区别于其他事物的本质特征的过程,是一个分析和理解问题的过程,这个过程取决于使用者的目的,它应该包括使用者所感兴趣的那些职责问题,而忽略掉其他不相关的部分。从对象到类的过程就是抽象的过程,即将所见到的具体实体抽象成概念,从而可以在计算机世界中进行描述和对其采取各种操作

最少承诺

根据这个原则,对象的接口只提供它的基本行为,此外别无其他

最少惊奇

这个原则是指抽象捕捉了某个对象的全部行为,不多也不少,并且不提供抽象之外的惊奇效果或副作用

封装

封装是一个过程,它分隔构成抽象的结构和行为的元素。封装的作用是分离抽象的概念接口及其实现

  • 抽象和封装是互补的概念:抽象关注的是对象可以观察到的行为,而封装关注这种行为的实现
  • 抽象“帮助人们思考他们做什么”,而封装“让程序可以借助最少的工作进行可靠的修改”
  • 封装在不同的抽象之间提供了明确的边界,因此导致了清晰的关注点分离
  • 要让抽象能工作,必须将实现封装起来
  • 明智的封装让可能改变的设计决策局部化
  • 绝大多数情况下,只有当这个抽象的创造者显示地暴露出实现,而且客户愿意接受由此带来的额外的复杂性时,才会这样做

分解

分解(Decomposition)是指将单个大规模复杂系统划分为多个不同的小构件。分解后的构件通过抽象和封装等技术形成相对独立的单元,这些单元可以独立地设计和开发,从而实现化繁为简、分而治之,以应对系统的复杂系,降低软件开发成本

分层

分层(Hierarchy)是指面向不同的目标建立不同的抽象级别层次,从而在不同的抽象层次对系统进行分解,进一步简化对系统的理解

课程链接

https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET 云原生架构师训练营(设计原则与模式)--学习笔记的更多相关文章

  1. .NET 云原生架构师训练营(Identity Server)--学习笔记

    目录 OAuth 2.0 OpenID Connect QuickStart OAuth 2.0 概念 过程 通信 组件 示例代码 概念 OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是 ...

  2. .NET 云原生架构师训练营(模板方法 && 建造者)--学习笔记

    目录 模板方法 源码 建造者 模板方法 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 源码 https://github.com ...

  3. .NET 云原生架构师训练营(责任链模式)--学习笔记

    目录 责任链模式 源码 责任链模式 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了 何时使用:在处理 ...

  4. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  5. .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

    目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...

  6. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

  7. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记

    2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...

  9. .NET 云原生架构师训练营(系统架构)--学习笔记

    目录 对外展现的功能 内部功能 功能交互与价值通路 系统架构 目标 认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构 受益原则 好的架构必须使人受益,要想把架构做好,就要专 ...

随机推荐

  1. .Net core Worker Service 扩展库

    .Net core Worker Service 扩展库,目的为更易控制每一个worker 的运行. 提供根据配置文件对每一个Worker的停止.启动和自动解析注册Worker. 获取配置的方式不限于 ...

  2. Centos7 cache/buff过高处理方法

    Centos7 cache/buff过高处理方法   kevinxliu关注0人评论36799人阅读2018-07-26 10:09:59   当linux运行久点,会产生很多不必要的cache或者b ...

  3. 精确报告Linux内存使用情况实用脚本:ps_mem

    精确报告Linux内存使用情况实用脚本:ps_mem 2019-09-06 12:45 ps_mem内存工具 ps_mem 是一个可以帮助我们精确获取 Linux 中各个程序核心内存使用情况的简单 p ...

  4. JQuery 使用教程

    引言 JQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程.JQuery 拥有丰富的选择器,可以非常方便的获取和操作 DOM 元素,而在 JQuery 中所有选择 ...

  5. 基于python内置方法进行代码混淆

    0x00 动态加载模块 在python脚本中,直接使用import os.import subprocess或from os import system这种方法很容易被规则检测,即使使用其它执行命令的 ...

  6. C语言编程 菜鸟练习100题(41-50)

    [练习41]字符串翻转 0. 题目: 字符串翻转 1. 分析: 学习递归思想和方法. 2. 程序: 方法一: #include <stdio.h> void reverseSentence ...

  7. 转载 | Scala 如何避免使用 Null

    在 Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的. Scala 的 Option类型 Scala在变量和函数返回值可能不会引用任何值的时候使用 Option 类型 ...

  8. HashMap源码:聊聊Map的遍历性能问题(一)

    目录 引言 迭代器测试 迭代器源码探究 其他遍历方法 增强型for循环 Map.forEach Stream.forEach 总结 附:四种遍历源码 附:完整测试类与测试结果+一个奇怪的问题 引言 今 ...

  9. 北汽极狐ARCFOX与华为合作

    北汽极狐ARCFOX与华为合作 全球首款激光雷达量产车 2021年,是激光雷达"上车"的元年. 曾经价格高不可攀,只能用于Robotaxi.无人车测试的激光雷达,终于彻底具备商业化 ...

  10. TVM将深度学习模型编译为WebGL

    使用TVM将深度学习模型编译为WebGL TVM带有全新的OpenGL / WebGL后端! OpenGL / WebGL后端 TVM已经瞄准了涵盖各种平台的大量后端:CPU,GPU,移动设备等.这次 ...