A Philosophy of Software Design读书笔记——分or合

news2025/8/4 1:19:45

软件设计中有个很重要的问题:两个功能,是分成两部分实现,还是合在一部分实现呢

合or分的目的是减少系统复杂度,但是拆分有带来一些复杂度,比如:

1、组件个数增加复杂性,难以追踪每个组件,同时接口也变多

2、模块会变多,对于类来说,需要分别考虑他们的生命周期等

3、相邻的部分可能分散在不同的组件中,开发者很难同时意识到他们的存在,增加学习成本

4、分解可能带来重复

如果两个功能是紧密相关的,最好把他们放到一个组件中,如果是不相干的,可以把他们拆开实现。哪些表现为相关呢:

1、需要依赖相同的信息

2、他们一般都是被同时使用,一个功能被使用时,另一个功能也被调用

3、两个功能相关联,被一个更高层次的模块一起包含

4、但看一个功能的代码难以理解,必须看另一个功能的代码

本章主要介绍如何合并or拆分代码功能块

如果共享信息,那么要合并模块

在httpserver的例子中,读取和解析socket,这两个模块都需要感知http协议的格式,那么需要合并在同一个模块实现,而不是拆分。

如果能简化接口,那么要合并模块

如果两个模块合并后,对外提供的接口更简单了,同时实现起来也更简单了。这通常发生在两个模块时为了解决一个问题的不同部分。

如果能减少重复,那么要合并模块

如果发现代码在多处重复,那么需要合并。

一种方式是把重复的代码抽象成一个函数,这种方式比较适合于重复的代码比较长,如果重复的代码很短,比如就2、3行,那么就不需要抽象,而且抽象成函数时,如果参数较长(经常发生这种情况),那么也不需要抽象。

另一种方式进行重构,然后将重复的代码在一处执行,比如C++中的RAII机制来清理现场

分离专用模块的代码和通用模块的代码

如果一个模块可以实现多种功能,那么就要被抽象为一个通用的机制,而不应该包含哪些专用的代码,也不应该包含其他通用代码(单一职责原则)。一个好的方式是,专用模块通过接口形式提供出来,然后在实现专用模块时,用上通用模块。

一般情况下,越底层,代码应该越通用,越顶层,代码应该越专用,所以,拆分通用模块和专用模块的方式是抽象底层为通用模块,上层为专用模块提供接口

拆分or合并方法

方法太长,会不易懂,所以业界一般建议拆分过长的方法,比如“超过20行的方法就应该拆解”,但是作者认为根据方法行数来判断是否拆分方法是不客观的,方法太多意味着接口太多,会增加复杂度,如果一个方法的各个部分相关联,那么拆分之后,各个子方法更加难读,是否拆分方法还是看是否能够简化复杂度。

在设计方法时,最重要的是提供简单清晰的抽象,每个方法制作一件事而且要把这件事做干净,接口要简单,实现要深,这样的方法就是好方法,而不是看方法的代码行数。

那么什么时候拆分方法呢?能够简化抽象,比如下面这种方法拆分,a是好的;如果要拆分,可以把通用模块抽象成子方法,如b所示,这个子方法在其他模块也可以用到,但是如果在阅读代码的时候,如果为了理解方法,需要在子方法和父方法之间来回跳转,那么这种就没必要拆分;c勉强可以,如果拆分成的两个字方法之间基本没有关联,使得接口更加清晰,而且拆分之后,两个子方法的接口比原来方法的接口更加简单清晰,但是如果每次实现该功能的时候,调用都要同时调用这两个方法,那么拆分没必要;d是错误的拆分方法

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Foxit PDF SDK for Linux (C++ Library) 8.4.1 Crack

适用于Linux平台的行业优秀的PDF技术 Foxit PDF SDK Linux版本,一款提供给Linux平台开发人员的强大的PDF库。它提供了简单易用的C接口和Java接口,允许开发人员将PDF显示、导航、创建、搜索、注释、保护、PDF文本提取、图片转换、表单数据收集和编辑功能…

JavaScript代码是怎么在浏览器里面运行起来的?

JavaScript代码是怎么在浏览器里面运行的?下面简单探索一下 浏览器内核 浏览器内核(Rendering Engine),常见的叫法如:排版引擎、解释引擎、渲染引擎,现在流行称为浏览器内核。 浏览器内核说明IETridentIE…

3415: 【提高】小 X 的佛光

3415: 【提高】小 X 的佛光 时间限制: 1.000 Sec 内存限制: 128 MB 提交: 14 解决: 7 [命题人:][下载数据: 110] 提交状态报告 题目描述 题目背景】 小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水。 【题目描述】 小 X 所在的城市 X 城是一个含有 N…

XSS-labs靶场实战(二)——第4-6关

今天继续给大家介绍渗透测试相关知识,本文主要内容是XSS-labs靶场实战第4-6关。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未…

Qt ARM+Linux平台调用一个库的时候,报错“Bus error”

Qt ARMLinux平台调用一个库的时候,报错“Bus error” 文章目录Qt ARMLinux平台调用一个库的时候,报错“Bus error”摘要1 字节对齐问题2内存溢出问题关键字: Bus error、 Qt、 Arm、 Linux、 Debian内容背景: 最近项目终于切到Li…

如何实现高效地扩展5G毫米波段?

如今的高频信号标准使用的是比以往更高的频率和更宽的带宽,经过多年的研究和测试,5G无线网络正在世界各地进行部署。5G利用比以前使用的频带高得多的频段和毫米波频率,实现了高速、宽带宽、低时延和极高的容量。 然而,这些高频信号…

赋能型细分定位该不该选择?—— FB推广

赋能型细分定位的作用: 赋能型细分定位可以使系统覆盖到比您在细分定位选项中定义的用户更为广阔的用户群体,从而帮助改善广告表现。(如果了解谷歌的话,可以理解为搜索网络合作伙伴) 如果您希望我们面向更多可能助您…

Nginx源码:内存池的实现

文章目录1、数据结构2、接口函数2.1、创建内存池2.2、内存分配2.2.1、小块内存分配2.2.2、大块内存分配2.3、内存释放2.3.1、大块内存释放2.3.2、内存池释放4、参考为什么需要对内存管理? 避免频繁的系统调用带来的开销。减少了频繁分配和释放小块内存产生的内存碎…

LeetCode刷题(python版)——Topic72. 编辑距离

一、题设 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1: 输入:word1 "horse", word2 &q…

回溯算法的应用

基本思想: 回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,同时也成为当前的扩展结点。在当前扩展结点处,搜索向纵深方向移至一个新结点。这个新结点成为新的活结点,开成为当前扩展结点。如果在当前扩展结点处不能再向纵深方…

大数据技术基础实验十五:Storm实验——实时WordCountTopology

大数据技术基础实验十五:Storm实验——实时WordCountTopology 文章目录大数据技术基础实验十五:Storm实验——实时WordCountTopology一、前言二、实验目的三、实验要求四、实验原理1、Topologies2、Spouts3、Bolts五、实验步骤1、导入依赖jar包2、编写代…

ffmpeg编译so

1.第一个坑:/bin/bash^M: bad interpreter: No such file or directory shell脚本报错/bin/bash^M: bad interpreter: No such file or directory,通过查阅资料得知,shell脚本格式必须是unix才行,但我这个脚本是在windows上编写完…

如何批量创建word文档并重命名?

如何批量创建word文档并重命名?大家请注意,我这里抛出的问题是批量创建word文档并重命名,重点在批量,并不是我们平时遇到的单纯创建一个或者几个word文档,而是批量创建几十上百个甚至几百上千个word文档。创建几个word…

英国博士后招聘|约克大学—核磁共振监测催化

英国约克大学博士后职位—核磁共振监测催化 约克大学(University of York),建于1963年,是一所位于英国英格兰约克的研究型公立大学,英国罗素大学集团、世界大学联盟、N8大学联盟、白玫瑰大学联盟和江苏—英国高水平大学…

【开发心得】Java ftp开发注意事项

前言: 虽说已经2022年了,但是ftp上传方式还是有一定使用场景的,关于java的ftp上传下载实现,基本都指向了apache commont net 库。 代码实现可以参考:https://blog.csdn.net/tianshan2010/article/details/103690940 或者其他类似的文章&…

云服务--漏洞修复

1、Spring Security 身份认证绕过漏洞(CVE-2022-22978) Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 Spring Security存在身份认证绕过漏洞 ,当Spring Security中使用RegexRequestMatcher进行权限配置&#…

汽车云算力“竞速”,个性化进阶成新风向

配图来自Canva可画 随着产业互联网的持续推进,云服务逐渐深入各行各业,云服务厂商也专门推出各种面向特定行业的专属云,比如金融云、零售云、政务云等等。如今云服务厂商正把焦点深入到汽车领域,围绕“汽车云”展开新的角逐。 今…

LeetCode[662]二叉树的最大宽度

难度:中等 题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 描述: 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长…

麦子-linux驱动策略与框架

一、linux内核同步和互斥 信号量(进程与进程) 当进程A执行共享资源先加锁执行down表示占用资源,进程B想执行就会被dowm,导致陷入睡眠 当进程A行完了就会up释放资源,我们其他线程执行这个共享资源就不会被dowm睡眠 自旋…

蓝桥杯入门即劝退(十)反转链表

----------持续更新蓝桥杯入门系列算法实例------------ 如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流! 你的点赞、关注、评论、是我创作的动力! -------希望我的文章对你有所帮助-------- 前言:如果有一定链表基础&#…