6 | 设计思想

作者: 不一样的卡梅利多 | 来源:发表于2020-04-21 16:13 被阅读0次

系统复杂性

软件系统来源与真实世界的需求,由于现实世界系统的复杂,导致了软件系统的复杂性,其复杂性常常超出了人类认知的范围,虽然我们不能消除这些复杂性,但是我们可以通过一些方法(抽象 ,分解,分层)来掌握这些复杂性。

复杂的事物也有着自己本身的特点:系统是分层的 从外到内层(part of)、从上到下层(is a)、通过分层后,我们可以找到系统的基本组成部分,不同的人分层的标准不一样,导致我们看到的基本组成部分不一样。

系统分解后,组件内的联系通常比组件间的联系更强。这一事实将组件中的高频动作(涉及组件内部结构)和低频动作(组件间相互作用)分离开来。我们可以先关注各个组成部分外部表现形式,忽略内部细节,从它提供的功能来认识它。因为所有内部的实现都是为了承诺外部的功能。这也叫做抽象的思维方式,是认知复杂事物一种通用的方法,抓到事物的主要点,忽略次要点,细节。屏蔽复杂的细节,能够让我们更容易理解他们。也只有忽略细节,我们才能认知复杂的事物,因为人处理信息的能力有限,这也要求我们必须要舍弃 细节、次要的,非本质的信息。再依据28原则,事物的核心主要集中在系统的少数部分。反过来理解,我们在设计或者创建新的事物是,也是由简单(核心的、抽象的)到复杂(实现)进行的。造物主也是一样的。我们构造(设计)的时候,就需要 低耦合,高内聚,面向接口设计。

复杂系统,同一个系统内部,不同系统之间 都会有相同或者相似的地方,我们需要分析认识到这些共性,了解了其中一个,也就知道了其他。有了共性,就能复用,复用也是一种很重要的认识复杂事物的手段。

复杂系统通常都是通过稳定的中间件形式来构建,只有系统中各个子系统稳定了,整个系统才会稳定。我们可以利用稳定的中间形式构建更为复杂的系统。类比到代码设计上面,我们需要分析出,哪些是稳定的部分,哪些是可以扩展和修改的部分。稳定的部分就不要改动,否则,将会产生严重的影响。与开闭原则有相同的地方。

面向对象面

向对象既可以用来解决复杂系统的认识,也可以用来指导复杂系统的设计。面向对象分析和设计的主要方法为:抽象,封装、继承(多态)。
1、抽象 可以屏蔽复杂事物的细节,抓住事物的本质,简化认知事物的复杂度。
2、封装 可以 分离关注,将内部与外部分开。以局部自治的方式提供契约责任。将组件间影响程度降低到最低。
3、继承 主要是为了解决复用,共性问题。是定义系统层次结构的一种方法。

设计原则

设计原则指导怎么设计复杂系统

高内聚,低耦合与抽象

高内聚:每个类里面属性都是和行为强相关的,不会有其他不相关的属性。每个行为都是操作自己的属性。
低耦合:每个类只依赖和自己直接相关的类。不依赖多余的类或者间接相关的类,尽量依赖接口而不是实现,

1、 迪米特法则:又叫最小知识(最少依赖)原则,每个模块只应该了解和它关系密切的模块的有限知识。反过来理解,我们设计模块或者类的时候,我们需要提供最小接口(基于最小接口而非最大实现编程),这样其他类使用起来才会更方法。尽量内聚,减少外部协调。自己能干的事情,就不找别人。

2、依赖反转原则: 实现应该依赖抽象,抽象不应该依赖实现,面向接口而不是实现

3、接口隔离原则 :客户端不应该强迫依赖它不需要的接口,如果满足单一职责原则,接口隔离就更容易实现。

4、单一职责原则(Single Responsibility Principle):每个类模块职责单一,每个类提供的功能应该为该类最小承诺

共性和复用

里式替换原则: 子类能够替换所有父类出现的地方。共性与复用,可以测试类设计是否应该使用继承的关系。

稳定和扩展

开闭原则(Open Closed Principle) :对扩展开放,对修改关闭,需要在分析需求是,确定哪些是稳定的,哪些是可扩展的。找出稳定的中间部分。稳定的部分一般是底层的,框架性的,与业务无关的。

设计模式

创建

将对象的创建和使用分开,因为对象的创建过程有可能和复杂。

1、单例
2、工厂(抽象工厂)
3、建造者
4、原型

结构

主要是解决类结构的层次问题,是组成还是继承。

1、代理 (继承)
2、桥接,组合 (灵活,降低类层次关系的复杂度)
3、装饰器,继承+组合
4、适配器,类适配(继承),对象适配(组合)
5、门面(组合,封装)
6、组合模式,处理树形结构数据(区别与 继承、组合,继承模式更有效)
7、享元模式,共享、缓存

行为

主要是解决类(模块)与类(模块)之间通信问题。请求方->消息->接受方

1、观察者
2、模板
3、策略
4、责任链
5、状态模式
6、迭代器模式
7、备忘录模式
8、命令模式
9、解释器模式
10、中介模式

总结

1、以稳定部分来构建最小系统。

2、抽象出共性(属性,行为)。复用,通常是以由下往上,由细节到共性。

3、子系统之间需要 高内聚和低耦合

4、设计分析需要迭代循环演进,比如一个类代码太多,类太大,需要拆分。类的结构层次随着迭代也可能调整

5、代码实现上面需要面向接口编程和提供代码的可复用性,可扩展性,可维护性

相关文章

  • 6 | 设计思想

    系统复杂性 软件系统来源与真实世界的需求,由于现实世界系统的复杂,导致了软件系统的复杂性,其复杂性常常超出了人类认...

  • (学习记录)Android源码设计模式解析与实战——第一章总结

    面向对象6大原则 设计原则是设计模式的核心思想,23种设计模式均是合理应用6大设计原则的产物。换言之,通过合理的应...

  • 模块化思想之commonJS

    AMD/CMD/ES6 MODULE都是模块设计思想 NODE本身是基于CommonJS模块规范设计的 commo...

  • 第二章 不要小看数组

    1自己的数组类设计 画图 定义 3泛型 4动态数组的扩容和优化 5 eager / lazy 设计思想 6 复杂度...

  • 设计模式六大原则

    简介 6大原则是良好的软件工程设计思想。传统的23种设计模式,就是这6大原则在具体场景的应用。6大原则是本,23种...

  • 设计思想

    优先级:功能--》可读性--》维护-->扩展 --》性能 用设计优化 代替 代码复杂度,降低 维护 可读性: ...

  • ES6 - Module

    本文参考 阮一峰 ECMAScript 6 入门,进行简单语法总结 1.概述 ES6 模块的设计思想,打破了历史上...

  • ES6学习笔记(前言)

    参考:ECMAScript 6 入门 此系列学习笔记旨在总结阮一峰老师ES6教程的重点,理清概念,探索其设计思想等...

  • 思想(6)

    教育需要的不是出色的人才,而是“自己人” 智慧往往是朴素的,越是朴素的现象越能揭露事物的本质。 只有在不仅没有任何...

  • vue 与 react 的区别

    设计思想不同 react 的设计思想是:函数式的思想,把组件设计成纯函数,状态和逻辑通过参数传入,通过单向数据流保...

网友评论

    本文标题:6 | 设计思想

    本文链接:https://www.haomeiwen.com/subject/xztpihtx.html