天翼云代理,天翼云代理商,北京代理商
天翼云折扣专线:400-150-1900(全国市话)

了解这些软件设计思想,你的思维至少上升一个段位

2022-02-15 04:09:33

一、介绍

在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:规划形式 - 可复用的面向对象软件元素) 的书,该书初次提到了软件开发中规划形式的概念,四位作者合称 GOF(全拼 Gang of Four),简称四人帮!

书中共提到 23 种规划形式,这些形式能够分为三大类:创立型形式(Creational Patterns)、结构型形式(Structural Patterns)、行为型形式(Behavioral Patterns)。

当然,随着软件的快速开展,还呈现另一类咱们所熟知的规划形式:J2EE 规划形式

首先要跟咱们阐明的是,规划形式其实不是一项新技术,而是许多软件开发人员通过适当长的一段时刻的试用和试错总结出来的一套软件规划开发实践方案,学习这些常识有助于经验不足的开发人员通过一种简略快捷的方法来学习软件规划。

也不BB了,下面咱们就一起来深入了解一下大神们总结的这套办法论!

二、办法论

2.1、单一责任准则

单一责任准则,顾名思义,一个类担任一个功用的处理,比方咱们在代码中经常会涉及到调用第三方的接口,一般咱们往往会将一个接口恳求办法封装成一个http恳求的工具类,这样其他的调用方能十分便利的进行调用。

单一责任准则,首要的意图是将一个功用划分到适宜的粒度,让这些各自履行单一责任的类,各司其职。

还有咱们常常说的mvc形式,将数据操作与事务逻辑处理进行别离,也是归于单一责任准则的一种。

2.2、开闭准则

开闭准则,指的是:对扩展开放,对修正关闭

这儿的意思是在添加新功用的时分,能不改代码就尽量不要改,假设只添加代码就完结了新功用,那是最好的

下面我举个简略的例子,咱们或许就懂了。

在实践的项目开发过程中,特别是与第三方公司进行接口对接的时分,例如 a 公司,他的接口协议要求选用rsa加密;b 公司,他的接口协议选用aes加密,c公司,他的接口协议要求选用md5就能够了...

在一开始的时分,或许你没有想那么多,想象一切其他公司跟你对接的时分,全部选用rsa加密,那么当第二家公司来了时分,要求选用aes,这个时分,你必须得改代码才干支持这种功用,假设又来了其他公司呢?

在这种情况下,咱们能够选用面向接口编程的思想,界说一个笼统的办法,然后针对不同的加密算法,编写不同的完结类,当新来了一家公司要求选用不同的加密算法时,咱们只需要扩展一个新的完结类,在逻辑处理层进行路由即可快速完结开发和对接!

完结开闭准则的首要步骤便是将事务办法里边的逻辑进行笼统化,从而完结逻辑层面代码的解耦。

2.3、里氏代换准则

里氏替换准则,通俗的说便是:子类能够扩展父类的功用,但不能改变父类原有的功用。

也便是说:子类承继父类时,除添加新的办法完结新增功用外,尽量不要重写父类的办法

当子类在重写父类的办法时,假设运用不当,很或许会改变父类办法中的逻辑语义,进而形成逻辑处理紊乱。

在实践的事务开发中,特别是咱们在运用类承继操作时,应当慎重重新父类办法,办法界说的时分,称号也尽量不要产生重名。

同时,应该注意类过多的承继,例如 A 类承继自 B 类,B 类 承继自 C 类,C 类承继 D 类,这种场景下,榜首:逻辑很或许十分复杂,代码可读性或许很差,第二种或许会呈现办法名或许特点名冲突。

我从前修正一个老项目 bug 的时分,就呈现过这种情况,一个实体类呈现三层联系的承继,当我把子类进行序列化成json的时分,突然报错,原因便是因为里边有个特点,在基类里边也界说了,可是类型却不一样,也便是说在这个子类里边有两个相同的特点,仅仅字段类型不同罢了,从而导致这个序列化报错。

因而,咱们在运用类承继操作时,一定要慎重处理,最好的情况下是一层联系承继,这样即便呈现问题了,也好排查,规模可控;承继联系多了,反而代码变的十分复杂,每个办法逻辑都需要一一梳理清楚,你才敢去下手,这种情况下,反而为难了自己!

2.4、依靠倒转准则

依靠倒转准则,简略的说便是面向接口编程,依靠于笼统而不依靠于详细,他是完结开闭准则的一个途径。

依靠倒转准则首要有以下几点:

  • 高层的模块不应该依靠于低层的模块,这两者都应该依靠于其笼统
  • 笼统不应该依靠细节
  • 细节应该依靠笼统

换句话说,便是将详细类里边的办法进行逻辑笼统化,提升到接口或许笼统类里边,由详细的完结类去完结详细的事务逻辑,笼统层不重视细节。

也便是咱们俗称的,不论遇到啥事情,先看全局,在看小点。

举个例子,例如咱们常常运用的MVC框架,在Service层一般会先编写接口类,然后在编写服务完结类,这便是典型的面向接口编程,这种方案有哪些好处呢?

  • 能够减少研制人员并行开发引起的危险
  • 能够明显提高代码的可读性和可维护性
  • 能够下降类间的耦合性

当一个大项目开发的时分,试想一下,假设2个以上研制人员在编写同一个类的同一个办法,没有界说接口的情况下,随着时刻的消逝,这个类大概率会十分紊乱,同时,里边的办法估计阅读起来也很困难,一眼望去基本上不知道这个办法是干嘛的,特别是重载办法许多的时分,特别困难。

当咱们引进接口之后,将一切的中心办法全部笼统界说,当咱们对其进行二次开发的时,也会能快速定位到以前的和谐办法,然后进行快速定位和维护。

面向接口编程,还有一个很大的好处,便是能够下降类之间的耦合度。

2.5、接口阻隔准则

接口阻隔准则的意思是:尽量将一个接口拆的更细,运用多个阻隔的接口,比运用单个接口要好

这个准则基本上是从大型软件架构出发、便于升级和维护的思想诞生出来的。

比方,一个第三方保险服务体系里边,假设是小项目,你能够在一个接口里边界说投保办法、撤销办法、退保办法、理赔办法、保单办法这5种办法。

当你只跟一家保险公司协作的时分,这套接口界说是没问题的,可是假设现在公司的事务开展的十分快,现已引进10几家保险公司了,你会发现这个接口基本上顶不住了,在此有两种办法能够解决这种技术难题:

  • 1、针对不同的保险公司,又重新界说一个接口,然后仍是里边的5种办法
  • 2、针对不同的操作行为,比方投保,单独界说一套接口,然后针对不同的保险公司编写不同的完结类

这两种其实实质都是将一个接口,拆成多个颗粒度更细的接口,然后从行为上,让各种的完结类愈加独立,进而下降类之间的耦合度,开发起来层次明晰,有利于体系的稳定!

2.6、组合/聚合复用准则

合成复用准则的意思便是:尽量运用组合/聚合的方法,而不是运用承继

所谓组合/聚合的方法,其实便是咱们在springMVC里边运用的ioc依靠注入方法,

@Component public class AService {  /**  * ioc依靠注入  */  @Autowired  private BService bService;  //事务代码... }

AService类调用BService类,有两种方法能够完结,榜首种便是通过承继方法,能够直接调用;第二种方法便是通过ioc依靠注入的方法,在类里边进行组合操作,然后进行调用。

很明显,第二种方法,咱们运用的爱不释手

这种方法有个好处便是,代码层次明晰,编写高雅,用上之后简单上瘾,引荐运用!

2.7、迪米特规律

迪米特规律,又称最少知道准则,意思便是说:一个实体应当尽量少地与其他实体之间产生相互作用,使得体系功用模块相对独立

类似单一准则的思想,例如咱们编写实体类的时分,基本上便是特点称号,加get/set。

public class User {  /**  * 用户id  */  private Long userId;  /**  * 用户姓名  */  private String userName;  public Long getUserId(){  return this.userId;  }  public void setUserId(Long userId){  this.userId = userId;  }  public String getUserName(){  return this.userName;  }  public void setUserName(String userName){  this.userName = userName;  } }

当一个实体里边呈现跟自己没太大联系的代码时,例如数据运算逻辑处理,这个时分应当将这部分代码全部整理出去,交由事务处理层来出来。

从实体类的界说来说,它首要的功用便是承担数据展现,当多个事务处理层在运用这个实体类的时分,假设你们嵌套了许多的数据运算逻辑,或许在返回的时分,客户端得到的实体类的特点值,并不是正确的结果!

三、小结

上面一共介绍了 7 种规划准则,基本上都是大神们通过许屡次血的教训,总结出来的一套办法论。

这些规划准则,能够给同行在实践的软件规划过程中,供给一些思路,详细的应用,还需要结合实践的事务场景进一步考虑,怎么让体系变的愈加牢靠,开发更佳迅速,代码阅读起来更佳轻松,关键在于灵活运用!

12年经验 · 提供上云保障

服务热线:132-6161-6125(手机) 400-150-1900(全国市话)

站内导航: 天翼云服务器价格| 天翼云购买流程| 天翼云代理| 北京天翼云代理商| 杭州天翼云代理| 深圳天翼云代理商| 钉钉代理商| 阿里云代理| 公司官网

我公司收款账号| 天翼云备案系统

CopyRight © 2019 天翼云代理商. All Rights Reserved 京ICP备11011846号-15 管理-北京志远天辰科技有限公司