设计原则解读。

设计原则是对设计模式的约束性要求,属于设计中基本的四项特征,不符合此四项特征的设计,不具有生命力。

设计模式也是在此四项设计原则上的具体化实例化衍生物。

Martin原文:

http://www.cvc.uab.es/shared/teach/a21291/temes/object_oriented_design/materials_adicionals/principles_and_patterns.pdf

Architecture and Dependencies

软件最开始的的设计,一般都是完美的,但是往往在软件后续的开发维护过程中,一点点的恶化掉,导致软件软件无法维护。

软件开发维护过程中,对软件的修改又是必不可少的,因为需求的变化是必可避免的,又是变化多样的, 对设计框架的冲击也最大。

后期维护者,由于项目需求的紧急程度,可能在不理解的原始设计的背景下,添加新的需求实现,违背了原始设计,则设计被破坏,后续维护者更加迷惘。

Symptoms of Rotting Design -- 设计恶化的特征

Rigidity - 修改困难

新的需求,不好在现有实现上添加代码实现。

Fragility - 脆弱性

新的修改, 牵扯到多个模块,且容易引入bug,导致一连串的修改,又继续扩散, 产品不再信任。

Immobility - 不可移植性

一个大项目,包括若干子功能, 功能见有复用的地方, 但是开发者却无法复用,因为依赖不清晰,拆分功能对原有功能产生影响。

Viscosity - 粘性

设计的粘性 和 环境的粘性

当保持设计的成本比较大, 则设计具有粘性,开发者往往会选择hack的方法,这种方法更加具有破坏性,设计的不好呗。

开发者开发的功能依赖开发环境,难于移植的生产环境,则产生环境的粘性。

Changing Requirements -- 变化的需求

不说了, 产品经理被打了,就说名需求的变化到底有多么剧烈。

Dependency Management -- 依赖管理

不恰当的模块依赖,加重的系统间的耦合, 导致源码更加难于管理。

合理的依赖防火墙,可以防止系统的设计的恶化。

Principles of Object Oriented Class Design

The Open Closed Principle (OCP) -- 开闭法则

A module should be open for extension but closed for modification.

Dynamic Polymorphism -- 动态多态

定义抽象的接口,具体的类实现此方法。 高层的逻辑操作逻辑对接口对象进行编程,不对具体类编程。

Static Polymorphism -- 静态多态

编译阶段使用的模板,在编译完成后,静态绑定待操作对象。

Architectural Goals of the OCP

开闭法则,要求设计者具有深刻的洞察力, 分辨出系统中那些部分是变化的,那些部分是不变的, 并将变化的内容,设置出扩展的机制。 例如虚拟接口,虚拟类,允许使用者实现或者替换接口,通过接口添加新的功能, 当然此功能早已经在设计之内,非设计之外的功能不能此类接口的职责之内,如果有则表明,现有设计并不全面。

The Liskov Substitution Principle (LSP)

Subclasses should be substitutable for their base classes

子类可以随时被父类替换。

对于父亲类暴露出去的接口,其实现的功能,  子类应该无条件完全实现, 不多也不能少。

Design by Contract -- 基于契约的设计

理解为面向接口的设计,接口就是使用方 和 实现方的公约,不容变化。

The Dependency Inversion Principle (DIP)

Depend upon Abstractions. Do not depend upon concretions.

一般实现,高层依赖中层,中层依赖底层:

每一层的直接依赖,不应该直接产生,应该给予抽象产生,即高层的底层都不应直接产生依赖,

已该生成出一个抽象层,类似接口契约, 高层依赖抽象层的接口,

底层实现抽象层的接口。

The Interface Segregation Principle (ISP)

Many client specific interfaces are better than one general purpose interface

对于接口的设计,不要整一个大而全的接口, 因为每个接口都具有不同组织的属性, 更加细分接口更加有利于管理接口, 并实现接口。

统一实现一个接口,则任何接口的变动,都将引起所有使用接口客户端的变动。

生动解释见:

https://www.jianshu.com/p/184a90eb3349

Design Principles and Design Patterns的更多相关文章

  1. Android Design Principles

    Android Design Principles Enchant Me Delight me in surprising ways 用惊奇的方式取悦用户 漂亮的界面,仔细放置的动画,一个恰到时机的音 ...

  2. Design Principles (设计原则)

    这是我在2018年4月写的英语演讲稿,可惜没人听得懂(实际上就没几个人在听). 文章的内容是我从此前做过的项目中总结出来的经验,从我们的寝室铃声入手,介绍了可扩展性.兼容性与可复用性等概念,最后提出良 ...

  3. gRPC Motivation and Design Principles | gRPC https://grpc.io/blog/principles/

    gRPC Motivation and Design Principles | gRPC https://grpc.io/blog/principles/

  4. Design Principle vs Design Pattern 设计原则 vs 设计模式

    Design Principle vs Design Pattern设计原则 vs 设计模式 来源:https://www.tutorialsteacher.com/articles/differen ...

  5. malware analysis、Sandbox Principles、Design && Implementation

    catalog . 引言 . sandbox introduction . Sandboxie . seccomp(short for secure computing mode): API级沙箱 . ...

  6. API Design Principles -- QT Project

    [the original link] One of Qt’s most reputed merits is its consistent, easy-to-learn, powerfulAPI. T ...

  7. Android Wear - Design Principles for Android Wear(设计原则)

    ---------------------------------------------------------------------------------------------------- ...

  8. UI design principles

    Master's conclusion: 1. fix a color pattern 2. fix the frames the UI will use 3. fix the subject tha ...

  9. Android——设计原则(Design Principles)

    Enchant Me Delight me in surprising ways(动画.音效...) Real objects are more fun than buttons and menus( ...

随机推荐

  1. scheme实现最基本的自然数下的运算

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/9123363.html 作者:窗户 Q ...

  2. 好程序员分享ApacheSpark常见的三大误解

    误解一:Spark是一种内存技术 大家对Spark最大的误解就是其是一种内存技术(in-memorytechnology).其实不是这样的!没有一个Spark开发者正式说明这个,这是对Spark计算过 ...

  3. winserver的consul部署实践与.net core客户端使用(附demo源码)

    winserver的consul部署实践与.net core客户端使用(附demo源码)   前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...

  4. 监控zookeeper

    [4ajr@db1 scripts]$ cat zookeeper_mode.sh #!/bin/bash mode=`echo srvr|nc 127.0.0.1 2181|awk '/Mode/{ ...

  5. Linux启动时间优化-内核和用户空间启动优化实践

    关键词:initcall.bootgraph.py.bootchartd.pybootchart等. 启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分. 从内核timestamp 0.0 ...

  6. 用python实现的一个自动聊天的机器人

    因为之前想过 如果每天早上微信能够发送天气预报给我,给我老婆多好,然后就动手看网上的教程做了一个可以定时发送天气预报的程序, 最近又想到折腾,做了一个更加详细的版本.但是需要主动操作 具体操作看图. ...

  7. 程序员修神之路--🤠分布式高并发下Actor模型如此优秀🤠

    写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的一件事. 传统多数流行的语言并 ...

  8. building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    Error msg: building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required. Ge ...

  9. LODOP设置超文本不自动分页的方法

    在LODOP中,超文本超过打印项高度会自动分页,自动分页有两种情况:超过设置的打印项高度,超过纸张.这里是指高度,超过纸张宽度的超文本不会显示,会隐藏掉. 如果你不了解什么是LODOP中的超文本打印项 ...

  10. Microsoft Visual Studio Tools for AI

    https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...