代码整洁之道第3章-函数

2024-05-07 13:12
文章标签 代码 函数 整洁 之道

本文主要是介绍代码整洁之道第3章-函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

五一假期结束了, 今天继续读一下第三章:函数的相关内容, 其实函数的相关内容设计到的东西很多, 想把一个函数写好也是很难的; 还是按照之前的样子, 先总结一下本章内容, 然后聊一下相关的话题

内容总结

  • 函数应该尽量小

    ​ 在从业生涯中我见过最长的一个函数是几千行, 那简直就是程序员的噩梦, 所有的逻辑耦合在一起, 想要搞明白这个函数都干了什么还真要费一番功夫。更有甚者, 连原作者有时候都得重新梳理一下。造成这种情况的原因就是对函数没有整体的规划, 对于函数我们不能像写作文那样, 直抒胸臆, 挥毫泼墨; 要明确抽象的层次, 比如造飞机这个函数来说, 应该把机头啊, 机翼啊这些的创建放在第一层函数内, 细节下沉, 逐步细化, 这样才对。造成这种的原因我认为和软件设计思想有关, 没有整体的规划与设计, 上来就是一梭子, 想到哪写到哪肯定会有这样的问题啊!

    ​ 关于函数到底多小算小, 书中作者说的是嵌套的层次不能大于1, 其实只要按照上面的思想进行设计, 具体的量化标准, 我感觉没那么重要;

  • 函数参数尽量少

    ​ 参数多了会让人产生混乱, 很难对应起来, 复杂度就上来了。 尽量减少参数, 作者的说法是控制在1-2个参数, 尽量不写3个参数的函数; 如果参数太多可以封装成一个对象, 然后传入。

  • 函数命名尽量详尽

    ​ 这一点和上一章的命名相关的东西能呼应上, 就不做过多补充了

上面是内容总结, 书中其实有好多条目性的内容, 我只是进行了归纳性的总结, 当然可能有总结不到位的地方。但我实在不想对书中的内容进行复述, 那样违背了写博文的初衷。大家觉得哪里理解的有问题, 可以在评论区沟通交流!

下面我们还是聊几个相关的话题

几个相关的原则

  • 单一职责原则

    单一职责原则想必大家并不陌生吧, 甚至有的同学都背的滚瓜烂熟了, 但是这个原则实践起来并不容易; 我之前的一篇介绍设计模式的文章中也提到过。

    而函数要实现尽可能小离不开这个原则, 换句话说, 如果函数违背了这个原则, 你有义务把他拆开。

  • 开闭原则

    开闭原则大家也不陌生, 这个原则最终也是服务于让函数尽可能小, 关于这个原则我也不过多展开了, 有兴趣的可以去看看我之前的讲设计模式的那篇文章

  • DRY原则

    写代码的时候应该经常会遇到这个问题, 就是相近的代码逻辑会出现在不同的函数中, 改动就得改动多处, 这就违反了DRY原则, 当然也就导致了函数会变长

  • CQRS原则

    命令查询分离原则, 这个原则意思是修改和查询要分开, 乍一看大家肯定觉得, 谁写的函数不是这样的? 但确实有一些这样的反例, 例如作者书中提到的, 修改某个键的值, 如果修改成功就返回true, 如果不存在就返回false, 大家仔细体会体会这样的是不是存在问题。当然这个CQRS原则在宏观上还指导着架构设计, 如读写分离本身也是这个原则的衍生物。

if/else和switch语句的优化

一个函数中如果充斥这大量的if/else或者switch语句, 想短也短不了啊。那么if/else和swith语句这种应该怎么优化呢? 最通用的方案是工厂模式+策略模式, 当然怎么实现还是有很多技巧的, 具体的就不过多展开了。这里提一下, 如果因为使用工厂模式导致类爆炸的情况可以使用装饰者模式适配器模式进行优化。

模板模式

优化函数, 模板模式也是常用的方法。准确地说, 模版模式就是抽象层次的封装, 与本章中函数尽量小的优化思路, 非常吻合; 模版模式的使用也比较简单, 就不展开了。

责任链模式

优化函数, 责任链模式也很有用, 在一个函数内, 本身逻辑就是顺序的, 既然是顺序的就有前后相关性, 这本身就能串成一条链; 如果在代码中还有一些if/else的判断啊, 那么就可以动态配置责任链的节点来实现。

源码中经常出现的Context类

之前我最早看源码的时候, 会经常看到xxxContext类, 最让我理解不了的是什么是上下文, 这个名字听着怎么这么抽象呢? 好了, 具象一点, 函数的上下文就是函数执行过程中用到的变量(包括参数和成员变量), 而依据函数参数尽量少来说, 如果参数太多可以都封装到一个类中, 这个类就可以命名为xxxContext

这篇关于代码整洁之道第3章-函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967444

相关文章

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87