首页 > 编程语言 >自《编程的逻辑》一书关于类设计原证的思考

自《编程的逻辑》一书关于类设计原证的思考

时间:2023-03-24 23:45:30浏览次数:34  
标签:一书 原则 子类 编程 SRP 抽象类 父类 交互 原证

类设计常归于SOLIP原则,虽然早有耳闻,但是一直未曾探其究竟,最近看这本书看到了作者相关的理解,遂加上自己的理解做为笔记。

 

1、S-SRP 单一职责原则

书中关于此原则讲解

①具象化概念为“职责”,比如快递员的工作职责有分包、快递、收款、开会,是从公司、部门等更上级单位定义而来;(这一点跟面向对象开发的抽象思想差不多)。

②“一个类只负责一组相关的事情”,一个类有多个方法,且这些方法是相关的。

③适用于基础类,而不适用于聚合类;比如办公一体机包含的模块打印机、复印机、扫描仪、传真机,虽说办公一体机是一个整体,但是模块之间并没什么关联,也就不适用此原则了。

 

笔者理解

①小作坊公司对于设计原则其实并不会太在意,说出这个名词也没几个人懂,但是有一定开发经验的人,其实都会一定程度的遵循此原则做类设计;

如果类的定义不明确,新人接手维护、读代码都会很困难,就算是作者,时间久了也会忘了某个方法在哪,所以类划分的清晰就是便人便己。

②常规业务系统开发其实不太适用,业务系统面向的是各种业务流程,或者第三方接口的共享扩展;

在此场景下,习惯性是将一类业务属性相近、或者隶属同一个模块的方法放到一个类,类里面的方法都没什么相关。

③此原则在实际工作中比较适用于共享接口的整合类,比如一个电子证照需要经过创建、签发、归档的3个基本流程,封装成证照签发类的方法,就比较合适了;或者就是对单表、单数据源的简单维护,CURD工作。

 

2、O-OCP 开闭原则

书中关于此原则讲解

①对提供者扩展开放,对使用者修改封闭。前辈的通俗化:不修改代码就可以增加新功能!

②所谓的增加新功能,并是增加一个全新的功能,而是说能完全替代现有功能。比如说赛车游戏中的player类,当传参car供驾驶的时候,这个car可以是卡车、跑车、家用车,只要他们的功能都是一样的加速、刹车、转向,就能兼容。

③适用于接口完全不变的情况,包括函数名、函数参数、函数返回值等。当有任何一个变化,则无法应用。

④此概念也可用于系统交互,类之间用interface交互,系统与系统、模块与模块之间通过HTTP、SOAP等协议交互。

 

笔者理解

①核心逻辑其实是使用一个抽象类作为入参,然后对这个类进行派生,实现兼容,这样子使用者无需考虑兼容问题。

②类似概念的应用主要用于一个查询结果聚合类,多个来源、不同格式的数据查询,抽象出关键信息,记录查询日志用作数据分析、审计,需要抽象类的逻辑大部分都会适用。

③这个概念更适用于类交互、模块交互、系统交互;比如通过interface做类交互适用于团队开发,这样子大家互不干扰,也不担心代码没写完这边就进行不下去,或是通过Http做系统交互,对于前后端分离时基于Http做Json串的交互,也就能实现互不干扰。

 

3、L-LSP 里氏替换原则

书中关于此原则讲解

①简单概括:子类必须能替换成它们的父类。

从实现的角度就是子类必须实现或者继承父类所有的公有方法,且子类的方法入参要与父类一致,方法的输出要多于等于父类的输出,此输出包括返回值、修改全局变量、插入数据库、发送网络数据等。

②父类与子类的区别在于内部的处理过程。比如有个数据抓取的父类,可以派生成从XML获取数据,从数据库获取数据,入参都是查询条件,输出都是相同格式的查询结果。

③判断子类是否符合LSP,可对父类、子类进行同一个单元测试,如果输出结果一致,则说明符合LSP。

 

笔者理解

①总体跟OCP概念没什么区别,还是那句“对提供者扩展开放,对使用者修改封闭”。可以不调整原有代码,把有特殊需求的方法的入参类,从父类修改为特定的子类。

 

4、I-ISP 接口隔离原则

书中关于此原则讲解

①客户端不应该被强迫去依赖它们并不需要的接口。

②ISP应用的场景是某些类不满足SRP,但使用这些类的客户端(即调用类)应该根据父类来使用它们,而不是直接使用它们。如第一个SRP原则中的矛盾类“办公一体机”。

 

笔者理解

①简单来说就是当类不适用SRP,类内部不能只有相关的基础方法时适用这个原则。

②感觉就是圆一下SRP设计模式,毕竟那个模式太理想了,具体原因可以看下笔者对于SRP的理解。

 

5、D-DIP 依赖反转原则

书中关于此原则讲解

①高层模块不应该直接依赖低层模块,两者都应该抽象层。

②抽象不能依赖细节,细节必须依赖抽象。

 

笔者理解

①这个模式比较出名,从我理解来说就是软件开发分个层;

高层就是各个抽象类,比如常见的数据库操作抽象类、日志抽象类;

低层就是各个调用类,这些类的入参就是高层的抽象类,接收到入参后再实例化抽象成所需的派生类,这样子可以实现入口的统一,并且不用依赖高层代码必须实现就可以先进行开发。

②这个概念最清晰,且最接地气,本文读者看下真正的项目代码应该都能看到类似痕迹,就算不是刻意应用这个原则,实现出来也是差不多意思。

 

引用下书中的关于各个原则的场景总结:

①SRP:用于类的设计

②OCP:总的指导思想

③LSP:用于指导类继承的设计

④ISP:用于指导接口的设计

⑤DIP:用于指导如何抽象

⑥NOP:不要过度设计原则

 

再加上笔者的总结,最有用的就是DIP跟NOP,DIP是实实在在解决团队开发问题,NOP也是实实在在的帮助公司赚钱~

标签:一书,原则,子类,编程,SRP,抽象类,父类,交互,原证
From: https://www.cnblogs.com/PoliElena/p/17251212.html

相关文章

  • Java学习笔记(九)网络编程
    网络编程概述计算机网络:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和......
  • Shell 编程:Bash空格的那点事
     空格,一个看不见的字符,很不起眼,也正由于不起眼,很多人经常忽略它,导致代码出错,却还找不着北。这里,我们来聊聊bash中空格的那点事。先了解下bash中什么时候该用空格,什么时......
  • Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用a
    场景Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124157296参......
  • javascript 高级编程系列 - Set集合与Map集合
    ES6中新增的Set集合类型是一种有序列表,其中含有一些相互独立的非重复值,通过Set集合可以快速访问其中的数据,更有效地追踪各种离散值。1.创建Set集合并添加元素调用newS......
  • JAVA异步编程之Callbacks与Futures模型
    JAVA异步编程之Callbacks与Futures模型一:Callbacks模型​该模型的异步方法,在异步任务完成之后调用,主线程没有异步线程的结果。经典模型如Swing’sEventListener......
  • 异步编程解决方案 Promise
    1.回调地狱2.Promise的使用3.Promise的状态4.Promise的结果5.Promise的then方法6.Promise的catch方法7.回调地狱的解决方案1.回调地狱回调地狱:在......
  • 使用C#&.NET Core编程实现获取所有Windows服务列表及对Windows服务(Windows Service)
    使用C#&.NETCore编程实现获取所有Windows服务列表及对Windows服务(WindowsService)的启动/停止/重启的方法原文链接:https://codedefault.com/p/start-stop-restart-inst......
  • ChatGPT编程秀-1:从一个爬虫开始
    思考问题域我要写一个爬虫,把ChatGPT上我的数据都爬下来,首先想想我们的问题域,我想到几个问题:不能用HTTP请求去爬,如果我直接用HTTP请求去抓的话,一个我要花太多精力在登录上了,......
  • 网络编程
    网络编程1.什么是网络编程在网络通信协议下,不同计算机上运行的程序,可以进行数据传输2.网络通信的两大模式(C/S和B/S)客户端服务器模式(C/S)优点:界面炫酷,可以使......
  • Go语言并发编程(2):channel 通道介绍和使用
    一、简介channel不仅可以用于goroutine间进行安全通信,还可以用于同步内存访问。而且Go社区强烈推荐使用channel通道实现goroutine之间的通信,不要通过共享内存......