代码整洁之道第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

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

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

相关文章

AI绘画ComfyUI工作流安装教程,新手入门安装部署教程

ComfyUI 是专为 Stable Diffusion 打造的图形用户界面(GUI),采用了基于节点的操作方式。用户可以通过连接不同的模块(即节点)来创建复杂的图像生成流程。这些节点涵盖了多样的功能,包括加载检查点模型、输入…

慧天卓特干旱监测系统:2023年云南最强冬春连旱分析

2023年开春以来,由于高温少雨,土壤失墒快,我国西南的云贵川渝等地区出现连续快速干旱,云南地区的干旱尤为严重。 2023年1月下旬至6月18日,云南平均降水量197.7毫米,为1961年以来历史同期最少,气…

生成requirements.txt文件

前言 对于Python项目,生成和使用requirements.txt是十分必要的。通过requirements.txt可以一次性保存和安装项目所需要的所有库。尤其是在复现github上的实验代码时。 方法1 常用的命令 pip freeze > requirements.txt然而这种方法并不好用,有时会…

什么是泛域名证书?与普通SSL证书有什么区别

随着互联网的发展,越来越多的网站开始使用SSL证书来保护用户的隐私和安全。在SSL证书中,泛域名SSL证书和普通域名证书是两种常见的类型。那么,什么是泛域名SSL证书,与普通域名证书有什么区别呢? 首先,我们来…

ChatGPT变懒原因:正在给自己放寒假!已被网友测出

ChatGPT近期偷懒严重,有了一种听起来很离谱的解释: 模仿人类,自己给自己放寒假了~ 有测试为证,网友Rob Lynch用GPT-4 turbo API设置了两个系统提示: 一个告诉它现在是5月,另一个告诉它现在是1…

基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法(GA)原理 4.2 BP神经网络原理 4.3 遗传优化BP神经网络结合应用 4.4 遗传算法简要改进 5.完整程序 1.程序功能描述 基于改进遗传优化的BP神经网络金融…

什么是影响力?HR招聘测评,如何考察候选人的影响力?

什么是影响力? 影响力也即是说服别人同你的观点,或者是潜移默化的改变他人,从而形成自我凝聚力,影响力可以推动某一个事务的进行。影响力尤其在管理型岗位上具有重要作用。 在百科中有如下定义:影响力是用别人乐于接受…

Python类方法探秘:从单例模式到版本控制

引言: 在Python编程中,类方法作为一种特殊的实例方法,以其独特的魅力在众多编程范式中脱颖而出。它们不仅提供了无需实例即可调用的便捷性,还在设计模式、版本控制等方面发挥着重要作用。本文将通过几个生动的示例,带您…

大厂常见算法50题-最小栈

专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法! 文章目录 题目解法一 遍历找最小值(不要求时间复杂度情况下)解法二 辅助栈总结 题目 解法一 遍历找最小值(不要求时间复杂度情况下&#xff0…

艾体宝方案 | 加密USB金融解决方案

在现代金融行业中,保护敏感数据和合规性已成为至关重要的任务。为了帮助金融公司应对移动性风险和合规挑战,我们提供了一种高效的加密USB解决方案。 一、为什么金融公司需要加密USB解决方案 1、降低移动性风险 金融服务公司正在迅速过渡到一种模式&a…

《深入理解kafka-核心设计与实践原理》

本文是对于《深入理解kafka-核心设计与实践原理》的笔记和提纲整理 主要用于复习和知识点快速复习 第一章:概念 链接:《深入理解kafka-核心设计与实践原理》第一章:概念 第一章:概念 [1.1] 基本概念 [1.1.1] 基本角色与概念[1.1.…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广,还是国外的餐厅运营、参加国际展会,或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码,你都可以在QR Tiger去制作您需要的二维码! 一、认识QR Tiger 二…

SpringBoot+Redission实现排行榜功能

SpringBootRedission实现排行榜功能 demo地址:ranking-demo: 排行榜DEMO (gitee.com) 一、业务需求 实现一个排行榜,要求按照分数和达成这个分数的时间排序,即相同分数下,时间早的在上面 二、Redis中的zSet(有序集合) 1.简介 …

Flutter 中的 @immutable:深入解析与最佳实践

在 Flutter 开发中,immutable 注释扮演着至关重要的角色,用于标记不可变类。不可变类顾名思义,其状态一旦创建便不可更改,这与可变类截然不同。后者允许在创建后对实例进行修改。 immutable 的利好 引入不可变类可以带来诸多优势…

GO日志打印添加goroutineid

今天想给日志添加一个前缀,以区分不同goroutine的日志,方便做并发问题的排查,做日志跟踪。 为了解决goroutineid,网上各出奇招,有的使用runtime包未公开的方法获取: func Goid() int {defer func() {if e…

如何在Windows 11中查找产品密钥?这里提供两种办法

Windows 11使用产品密钥来确保你的操作系统是正版的,换句话说,不是盗版的。你可以在你的电脑上找到正在使用的产品密钥,如果你自己购买了Windows并需要重新安装,该密钥特别有用。 什么是Windows产品密钥 产品密钥是微软确保所使用的Windows副本是正版的方法。当激活Windo…

docker容器 怎么查看运行日志

在Docker中,查看容器的运行日志可以使用docker logs命令。该命令允许你获取容器的日志输出,这对于调试和监控容器的状态非常有用。 以下是docker logs命令的一些常用用法: 基本用法 docker logs [OPTIONS] CONTAINERCONTAINER 是容器的ID或…

【Pytorch】3.Transforms的运用

什么是Transforms 在PyTorch中,transforms是用于对数据进行预处理、增强和变换的操作集合。transforms通常用于数据载入和训练过程中,可以包括数据的归一化、裁剪、翻转、旋转、缩放等操作,以及将数据转换成PyTorch可以处理的Tensor格式。 Tr…

leetcode---岛屿数量

. - 力扣(LeetCode) 代码: //岛屿题目的思想:二维矩阵图的DFS就是,上下左右遍历如果是0或者出界的话就return //规定的是陆地上下左右是水的话它就是岛屿。当遍历矩阵图中每一个点, //在调用递归算法之前…

高频次的低价监测如何实现

品牌在做控价的过程中,需要对渠道中的低价数据进行监测,但价格数据变化快,涉及的促销信息也很多,如何将这些变化的数据监测到位,同时对于低价的凭证还要截图留证,以便有效的进行渠道治理,这就需…