软件架构设计:遵循的设计原则

 

 

根据网上资料整理而成的文档,希望能有所启迪。

 

  • 架构六大设计原则

设计原则图示:

这幅图清晰地表达了六大设计原则,下面将从原文、译文、理解、应用,这四个方面分别进行阐述。

1. 单一职责原则(Single Responsibility Principle - SRP)

原文:There should never be more than one reason for a class to change.
译文:永远不应该有多于一个原因来改变某个类。
理解:对于一个类而言,应该仅有一个引起它变化的原因。说白了就是,不同的类具备不同的职责,各施其责。这就好比一个团队,大家分工协作,互不影响,各做各的事情。
应用:当我们做系统设计时,如果发现有一个类拥有了两种的职责,那就问自己一个问题:可以将这个类分成两个类吗?如果真的有必要,那就分吧。千万不要让一个类干的事情太多!

2. 开放封闭原则(Open Closed Principle - OCP)

原文:Software entities like classes, modules and functions should be open for extension but closed for modifications.
译文:软件实体,如:类、模块与函数,对于扩展应该是开放的,但对于修改应该是封闭的。
理解:简言之,对扩展开放,对修改封闭。换句话说,可以去扩展类,但不要去修改类。
应用:当需求有改动,要修改代码了,此时您要做的是,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能够确保对整体架构不会产生任何影响,那么也没必要搞得那么复杂了,直接改这个类吧。

3. 里氏替换原则(Liskov Substitution Principle - LSP)

原文:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
译文:使用基类的指针或引用的函数,必须是在不知情的情况下,能够使用派生类的对象。
理解:父类能够替换子类,但子类不一定能替换父类。也就是说,在代码中可以将父类全部替换为子类,程序不会报错,也不会在运行时出现任何异常,但反过来却不一定成立。
应用:在继承类时,务必重写(Override)父类中所有的方法,尤其需要注意父类的 protected 方法(它们往往是让您重写的),子类尽量不要暴露自己的 public 方法供外界调用。

该原则由麻省理工学院的 Barbara Liskov 女士提出,她是美国第一位获取计算机博士学位的女性,曾经也获得过计算机图灵奖。

4. 最少知识原则(Least Knowledge Principle - LKP)

原文:Only talk to you immediate friends.
译文:只与你最直接的朋友交流。
理解:尽量减少对象之间的交互,从而减小类之间的耦合。简言之,一定要做到:低耦合,高内聚。
应用:在做系统设计时,不要让一个类依赖于太多的其他类,需尽量减小依赖关系,否则,您死都不知道自己怎么死的。

该原则也称为“迪米特法则(Law of Demeter)”,由 Ian Holland 提出。这个人不太愿意和陌生人说话,只和他走得最近的朋友们交流。

5. 接口隔离原则(Interface Segregation Principle - ISP)

原文:The dependency of one class to another one should depend on the smallest possible interface.
译文:一个类与另一个类之间的依赖性,应该依赖于尽可能小的接口。
理解:不要对外暴露没有实际意义的接口。也就是说,接口是给别人调用的,那就不要去为难别人了,尽可能保证接口的实用性吧。她好,我也好。
应用:当需要对外暴露接口时,需要再三斟酌,如果真的没有必要对外提供的,就删了吧。一旦您提供了,就意味着,您将来要多做一件事情,何苦要给自己找事做呢。

6. 依赖倒置原则(Dependence Inversion Principle - DIP)

原文:High level modules should not depends upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.
译文:高层模块不应该依赖于低层模块,它们应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
理解:应该面向接口编程,不应该面向实现类编程。面向实现类编程,相当于就是论事,那是正向依赖(正常人思维);面向接口编程,相当于通过事物表象来看本质,那是反向依赖,即依赖倒置(程序员思维)。
应用:并不是说,所有的类都要有一个对应的接口,而是说,如果有接口,那就尽量使用接口来编程吧。

将以上六大原则的英文首字母拼在一起就是 SOLID(稳定的),所以也称之为 SOLID 原则。

只有满足了这六大原则,才能设计出稳定的软件架构!但它们毕竟只是原则,有些时候我们还是要学会灵活应变,千万不要生搬硬套,否则只会把简单问题复杂化,切记!

  • 补充设计原则

1. 组合 / 聚合复用原则(Composition/Aggregation Reuse Principle - CARP)

当要扩展类的功能时,优先考虑使用组合,而不是继承。这条原则在 23 种经典设计模式中频繁使用,如:代理模式、装饰模式、适配器模式等。可见江湖地位非常之高!

2. 无环依赖原则(Acyclic Dependencies Principle - ADP)

当 A 模块依赖于 B 模块,B 模块依赖于 C 模块,C 依赖于 A 模块,此时将出现循环依赖。在设计中应该避免这个问题,可通过引入“中介者模式”解决该问题。

3. 共同封装原则(Common Closure Principle - CCP)

应该将易变的类放在同一个包里,将变化隔离出来。该原则是“开放 - 封闭原则”的延生。

4. 共同重用原则(Common Reuse Principle - CRP)

如果重用了包中的一个类,那么也就相当于重用了包中的所有类,我们要尽可能减小包的大小。

5. 好莱坞原则(Hollywood Principle - HP)

好莱坞明星的经纪人一般都很忙,他们不想被打扰,往往会说:Don’t call me, I’ll call you. 翻译为:不要联系我,我会联系你。对应于软件设计而言,最著名的就是“控制反转”(或称为“依赖注入”),我们不需要在代码中主动的创建对象,而是由容器帮我们来创建并管理这些对象。

  • 其他设计原则

1. 不要重复你自己(Don’t repeat yourself - DRY)

不要让重复的代码到处都是,要让它们足够的重用,所以要尽可能地封装。

2. 保持它简单与傻瓜(Keep it simple and stupid - KISS)

不要让系统变得复杂,界面简洁,功能实用,操作方便,要让它足够的简单,足够的傻瓜。

3. 高内聚与低耦合(High Cohesion and Low Coupling - HCLC)

模块内部需要做到内聚度高,模块之间需要做到耦合度低。

4. 惯例优于配置(Convention over Configuration - COC)

尽量让惯例来减少配置,这样才能提高开发效率,尽量做到“零配置”。很多开发框架都是这样做的。

5. 命令查询分离(Command Query Separation - CQS)

在定义接口时,要做到哪些是命令,哪些是查询,要将它们分离,而不要揉到一起。

6. 关注点分离(Separation of Concerns - SOC)

将一个复杂的问题分离为多个简单的问题,然后逐个解决这些简单的问题,那么这个复杂的问题就解决了。难就难在如何进行分离。

7. 契约式设计(Design by Contract - DBC)

模块或系统之间的交互,都是基于契约(接口或抽象)的,而不要依赖于具体实现。该原则建议我们要面向契约编程。

8. 你不需要它(You aren’t gonna need it - YAGNI)

不要一开始就把系统设计得非常复杂,不要陷入“过度设计”的深渊。应该让系统足够的简单,而却又不失扩展性,这是其中的难点。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
技术文件 技术文件名称:系统总体设计方案 版本:v0.1 软件系统整体设计方案全文共25页,当前为第1页。 软件系统整体设计方案全文共25页,当前为第1页。 拟制 绿网天下(福建)网络科技股份有限公司 修改记录 文件编号 版本号 拟制人/ 修改人 拟制/ 修改日期 更改理由 主要更改内容 (写要点即可) V1.0 蔡顺德 2016.01.12 初稿 注:文件第一次拟制时,"更改理由"、"主要更改内容"栏写"无"。 软件系统整体设计方案全文共25页,当前为第2页。 目录 软件系统整体设计方案全文共25页,当前为第2页。 1. 编写目的 5 2. 设计依据 5 3. 术语、定义和缩略语 6 3.1. 术语、定义 6 3.2. 缩略语 6 4. 概述 7 4.1. 系统目标 7 4.2. 设计原则 8 4.3. 演进规划 --待补充 8 5. 整体方案 9 5.1. 技术架构 9 5.2. 功能架构 11 5.3. 运行流程 12 5.4. 部署架构 13 5.5. 性能设计 14 6. 功能详述 15 6.1. 管理平台 15 6.1.1. 软件列表 15 6.1.2. 推荐排行 15 软件系统整体设计方案全文共25页,当前为第3页。6.1.3. 热门搜索 16 软件系统整体设计方案全文共25页,当前为第3页。 6.1.4. 用户管理 16 6.1.5. 用户标签 17 6.1.6. 数据统计 17 6.1.7. 软件审核 18 6.2. 客户端应用 18 6.2.1. APP应用 18 6.2.2. 搜索 19 6.2.3. 个人中心 19 7. 接口说明 20 7.1. 内部接口 --待补充 20 7.2. 外部接口 21 8. 开发和运行环境 21 8.1. 硬件环境 21 8.2. 软件环境 21 软件系统整体设计方案全文共25页,当前为第4页。 软件系统整体设计方案全文共25页,当前为第4页。 编写目的 本文件阐述了绿网市场系统的软件总体设计、系统运行配置与应用方式以及使用的关键技术等。 本文件适用于绿网市场系统的开发研制工作。 设计依据 依据产品部输出的《绿网市场1.0.rp》文档中阐述的产品功能,进行对应的技术方案输出。 参考业内主流WEB系统架构方案,结合公司产品实际业务情况、功能演进规划,进行技术架构设计和演进规划。 软件系统整体设计方案全文共25页,当前为第5页。 软件系统整体设计方案全文共25页,当前为第5页。 术语、定义和缩略语 术语、定义 名词 解释 SeaJS 一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制 JQuery 轻量级的Javascript库 ECharts 百度开源的可视化图表工具 ImageLoader Android开源组件,图片异步加载库 pulltorefresh Android开源组件,下拉刷新控件 NavigationDraw Android开源组件,导航组件 软件系统整体设计方案全文共25页,当前为第6页。 软件系统整体设计方案全文共25页,当前为第6页。 缩略语 本文件应用了以下缩略语: 缩写 英文全称 中文全称 APP mobile application 手机应用程序 概述 系统目标 用户基数:1-N年用户数达到XXX万,市场占有率达到XX% 用户体验:尽量贴近用户操作习惯,化繁为简 应用库规模:逐步积累自己的应用库,初期先使用第三方应用库 智能推荐: 能够较为精准的推送给用户感兴趣的应用 行为分析: 分析用户使用APP的类型和频次,分析用户会感兴趣的事物 线下互动: 定期组织同一圈子用户的线下互动活动,与线上的行为分析 互相补充 软件系统整体设计方案全文共25页,当前为第7页。 软件系统整体设计方案全文共25页,当前为第7页。 设计原则 快速响应:快速发布、快速响应业务变化 方便扩展:响应新业务无需推倒重来 稳定运行: 通过弹性伸缩和便捷的容灾恢复来保障稳定性(参考阿里云解决方案) 高效运维:提高运维效率、减少运维成本 演进规划 --待补充 软件系统整体设计方案全文共25页,当前为第8页。 软件系统整体设计方案全文共25页,当前为第8页。 整体方案 技术架构 用户使用层 支持在android手机、pad电脑、PC电脑等终端上的使用 应用服务层 软件系统整体设计方案全文共25页,当前为第9页。系统基于业内主流WEB框架LAMP进行应用的开发(LAMP框架具有Web资源丰富、轻量、快速开发等特点) 软件系统整体设计方案全文共25页,当前为第9页。 系统WEB前端使用主流的模块加载框架SeaJS,轻量级的js库JQuery, 百度开源图表组件ECharts以及引入来自Twitter的 CSS框架bootst
冀中能源股份有限公司 JIZHONG ENERGY RESOURCES CO., LTD. 业务综合管控项目全面预算系统 技术方案介绍 2012-02 普联架构设计技术方案全文共28页,当前为第1页。 二、软件开发平台方案 普联软件开发平台概念 数据存储原理 业务模型及业务搭建原理 指标模型及指标搭建原理 分析模型及分析方法 业务流程管理 BIS平台及开发平台外延 普联架构设计技术方案全文共28页,当前为第2页。 1、开发平台概念—技术路线 UNIX、LINUX、WINDOWS 采取B/S结构实现 体系结构 采用JAVA开发遵循J2EE标准 技术标准 ORACLE 10g 数据库 服务器操作系统 J2EE Application Server 中间件 数据库服务器 应用服务器 http http http 各级单位 Internet/ Intranet/ VPN/ Wireless ….. Windows+IE6.0以上 客户端 普联架构设计技术方案全文共28页,当前为第3页。 1、开发平台概念—平台设计原则 基于模型驱动 业务模型、数据模型、软件模型 基于接口实现 业务接口、软件接口 基于灵活开放框架 技术框架、应用框架 清晰的层次结构 数据层次、软件层次 普联架构设计技术方案全文共28页,当前为第4页。 企业应用模型 元数据管理 字典 事实表 关系 表单 报表 流程 配置 视图 过程 权限 安全 主数据管理 编码维护 数据关系 编码申请 编码发布 缓存管理 编码同步 编码权限 业务模型管理    指标模型管理 分析模型管理 模型管理 转换设置 指标管理 口径管理 维度度量 企业应用服务 主数据服务 表单服务 流程服务 分析服务 文档服务 门户服务 Windows/Linux/AIX/Solaris/… Websphere/Tomcat… Oracle/*Sybase/*DB2 应用集成环境 定时任务 消息服务 缓存服务 转换服务 定制服务 服务组件 服务插件 外部服务 WebService RMI BIS/ESB 功 能 菜 单 流程任务 系统消息 工作日历 应用门户 定制工具 设计工具 Menu Designer Form Designer Service Designer Flow Designer Report Designer Query Designer Print Designer Analyze Designer Document Designer Portal Designer Rich Client – Swing *Thin Client – GWT/HTML System Monitor Object Manager Dictionary Manager Fact Manager Model Manager Cached Manager Security Manager Offline Manager Convert Manager 安全服务 脚本服务 查询服务 监控服务 Swing Framework Swing Component Bean Shell Scripts GWT/HTML Framework JS Components AJAX 待办事项 *Rich Client – Flex Flex Framework Flex Component Action Scripts 交易数据管理 事实表管理 分区管理 立方体 ESP Framework 1、开发平台概念—平台体系结构图 普联架构设计技术方案全文共28页,当前为第5页。 Class Loader Registry Update J2EE Adapter Active Object Framework Lookup Plug-in DB Express Node Action View Window Package Node Node Builder Explorer View Prepare Node Action/Action Object Action Provider Action Toolbar/Comp Action Menu/Popup Client Class Loader Server Class Loader Signature Package(n).xml Registry.xml webComponent(n).xml JSON Security Application Update Applet Update Server Update JEnterprise.xml/Start.xml EAIServlet Flex Service Convert GWT Service WebService DOF DAL
XX-XXXX型 XXXX软件详细设计方案 文件编号:XX-XXXX-1101FA 编 制: 审 核: 标 准 化: 批 准: *************公司 年 月 文件历史记录 "文件编号 "XX-XXXX-1101FA " "文件标题 "XX-XXXX型XXXX软件详细设计方案 " "文件履历 " "版本 "编制 "日期 "更改内容(条款) " "A "XXX "XXXX-XX-XX "首发 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 目 录 1 范围 1 2 软件总体架构 1 3 界面设计 (SDP-0001) 1 4 输出报表设计 (SDP-0002) 1 5 数据库设计 (SDP-0003) 1 6 xxxx模块设计方案 (SDP-0004) 1 6.1 模块概述 1 6.2 模块结构 2 6.3 软件流程 2 6.4 软件算法 2 6.5 数据结构 2 6.6 模块关键指标 2 6.7 异常处理 2 XX-XXXX型XXXX软件详细设计方案 范围 本方案适用于xxx系列xxx软件的xxx项目,输出软件版本号为:xxxx。 软件总体架构 描述软件总体上的架构。 界面设计 (SDP-0001) 【必须】简要说明系统遵循的界面设计的所采用的原则。 【必须】详细列出关键业务模块的各个用户界面设计示意图及操作使用步骤(以及操 作流程)说明。 【可选】如果该部分内容较多,可以另附文档详细描述。 输出报表设计 (SDP-0002) 描述所设计的各报表的名称、用途、内容、格式等。 数据库设计 (SDP-0003) 【必须】给出系统、关键功能模块所涉及的数据库表、视图之间的实体关系图(E- R图)。 【必须】给出上述各个数据库实体名称及关系的说明。 【必须】给出每一个新增表、视图的字段结构,包括:字段名称、标识、数据类型、 格式、主外键关系、数据值的有效范围、数据值的输出转换等。 【必须】给出新增关键函数、存储过程、触发器的处理流程图,若使用触发器必须提 供采用触发器而不采用函数或存储过程的理由。 【必须】对于多数据库设计必须说明不同数据库之间数据类型或脚本之间的转换关系 。 【可选】不推荐在数据库中使用触发器。 【可选】如果该部分内容较多,可以另附文档详细描述。 xxxx模块设计方案 (SDP-0004) 【必须】每个图表都需要辅以文字描述说明。 【必选】面向对象设计使用UML建模,可以使用Visio、Rose、Power Designer作为建模工具。 【必须】同一设计文档仅使用一个建模工具。 1 模块概述 【必选】描述该模块的功能(做什么)、输入、输出,是否已存在相似的模块可复用 (如有,应描述它们的区别)。 【可选】提供必要的系统实现说明,各模块部件之间的整体和局部关系可采用(构件 图、部署图)。 【可选】描述该模块是否可以被复用,以及复用的方式。 面向对象设计: 【可选】提供关键功能及用户间的用例图(若需求文档中没有详细描述时)。 2 模块结构 面向对象设计: 【必选】提供关键类图、包图、对象图。 面向过程设计: 【必选】提供子模块的划分及关系结构图。 3 软件流程 面向对象设计: 【必须】提供类(或对象)间的交互图(顺序图、协作图); 【必须】提供关键类(或对象)的状态图、活动图。 面向过程设计: 【必须】提供关键业务模块的控制流程图。 4 软件算法 【必须】提供关键技术、主要算法。 5 数据结构 【必须】包括对输入数据、输出数据、内部数据的数据结构描述。 6 模块关键指标 【必须】提供满足关键指标所采取的必要措施。 7 异常处理 【必须】出错、异常、故障时的处理 ----------------------- 软件详细设计方案全文共5页,当前为第1页。 软件详细设计方案全文共5页,当前为第2页。 软件详细设计方案全文共5页,当前为第3页。 软件详细设计方案全文共5页,当前为第4页。 软件详细设计方案全文共5页,当前为第5页。 ----------------------- 密级 机密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值