代码整洁之道-函数

什么是一个好的函数或者叫方法,只要能让函数明确的表达其意图,让读者能够一眼看出是一个怎样的函数,其接收什么参数,返回什么结果,做了什么事情。能做到这,大概就能算作一个好的函数了,看上去很简单。那么问题来了,如果做到这点呢?

1. 短小

想象一下,一个击败航的复杂函数和一个只有十几行的函数,哪一个能够让人一眼看出其意图并理解其行为呢?显然是后者。当然,现在大多数语言完全可以将几百行代码写到一行,那样毫无格式的代码只会让人难以理解。

2.代码块和缩进

对于if、else等语句来说,其中包含的代码块最好只有一行,而这一行应该是一个函数调用语句,让读者可以一看看出其意图

3.函数名

一个好的函数名十分重要,如何定义一个好的函数名呢?只可意会。如果一个函数,你仅看函数名,就能明白他是做了什么,返回什么,那它就是一个好的函数名了。

4.只做一件事

函数应该只做一件事,并且做好这一件事足矣。这个大家都承认吧,并且已经是一个共识了,但是说起来容易,做起来却并没有那么简单。那么如何确保函数只做一件事呢?我们可以尝试这在函数中再拆出一个函数来,当然,拆出的函数不能仅仅是将代码搬过去,它应该有自己的责任,能够对新的函数起一个好的函数名。如果不能再拆出这样的函数,那么他应该可以了。

5. 函数参数

最理想的参数数量是0,其次递增,3个参数就已经很多了。

就函数测试而言,没有参数的函数测试简直小菜一碟,若有了一个参数,就需要测试很多种组合,之后每多一个参数,测试的组合数量都是指数级增长。

就调用者而言,没有参数的函数直接调用即可,而有了参数就需要理解每一个参数是什么,也增加了调用者的时间。

如果函数的参数中存在布尔值,不好意思,并不推荐这样做,因为它明确的告诉调用者如果为true就会这样做,如果为false就会那样做。更好的做法是其拆分成两个函数。

同时,如果一个函数需要三个以上的参数,就可以考虑将其中的一些参数封装成类了。比如描绘笛卡尔坐标的x、y。

6.无副作用

副作用是函数的一个谎言,函数名承诺只做这一件事,但是他偷偷的做了其他事情。

比如,一个checkOrderStatus函数,明显它是在检查订单状态,但是如果它在检查的同时对状态进行了修改,就会让人很困惑,甚至在排查错误的时候,看到这样一个函数都不会点进去看。更好的做法是将其拆成两个函数。

7. 每个函数一个抽象层级

说起来很简单,我们在阅读代码时,往往采用自顶向下的顺序来看,如果每个函数都只处理自己所在层级的逻辑,阅读和维护就很舒服了。

这个虽然我觉得很有道理,但是我没看懂啊。

。。。等等


那么问题来了,如何写出符合这样规范的代码呢?

其实没有必要再一开始写的时候就按照规则来写,那样很容易打乱思路,甚至事倍功半。完全可以在写完后在返回来认真打磨、拆解函数、修改名称、消除重复代码等.

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

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

相关文章

代码整洁之道-格式

对于代码的格式,每个人都有不同的代码风格,这没什么。但是对于一个团队来说,最好能够统一代码风格,在同一个项目中,如果到处充斥着不同的代码风格,相比读起来并不是那么让人舒适,比如在什么地方…

代码整洁之道-对象和数据结构

现在,有一个计算面积的需求,其中一种实现如下: class Square{public $side; } class Geometry{public function area($shape){if($shape instanceof Square){return $shape->side * $shape->side;}return 0;} }有人看了,你…

代码整洁之道-类

在面向对象的编程中,类是其中的基本单位,就像面向过程中的函数一样。所以在说类时,可以借鉴一下前面的函数,不如只做一件事,也就是所说的单一职责。 函数应该短小,对于类来说,也是这样。函数的…

Deepin nginx lumen配置

Deepin nginx lumen配置 正常安装 sudo apt install nginx sudo apt install php-fpm 启动后将 /etc/nginx/sites-enabled/default 配置文件 copy一份到 /etc/nginx/conf.d/lumen_demo.conf 然后按照该配置文件改改,修改后的配置文件如下: server {lis…

代码整洁之道小结

以下总结一些不好的代码规范, 借此警示自己不要犯这种错误 注释 1.不恰当的注释 注释应该仅用来描述有关代码和设计的技术性信息。像修改历史等信息不应出现在注释中 2.废弃的注释 过时、无关或错误的注释就是废弃的注释,不要写这种注释&#xff0c…

PHP的stdClass

概述 以下是百度百科对php中的 stdClass的描述: stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。**stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL.**凡是用new stdClass()的…

浮点数的运算精度丢失

引出 打开Python编译器,输入 0.10.2, 期待的结果是0.3,但是输出为: 0.30000000000000004 有点小尴尬,这是为什么呢? 解惑 其实这设计到了计算机的浮点数存储是以二进制进行存储的。 说二进制不太形象&a…

补码到底是个什么东西

概述 先引入一个前提,在计算机中数字是以二进制进行存储的,也就是我们看到的2,在计算机中存储的是10。我们进行的加法运算 213 在计算机中是这样的(这里先假设计算机存储的是4位二进制数字) 001000010011 很容以看的…

揭开HTTPS的神秘面纱

在说HTTP前,一定要先介绍一下HTTP,这家伙应该不用过多说明了,大家每天都在用,每一次HTTP请求,都是一次TCP连接。遗憾的是,请求的内容在TCP报文中是明文传输的,任何人截取到请求都可以读取其中的…

递归函数两种方式的区别

概述 递归函数都不陌生&#xff0c;比如计算n的阶乘&#xff1a; function f($n){if($n < 1) return 1;return $n * f($n-1); } 当然&#xff0c;有人可能会这么写&#xff1a; function f($n, $result){if($n < 1) return $result;return f($n-1, $n*$result); } 上…

Trie树

概述 在Google中随意搜索&#xff0c;如下所示&#xff1a; 他会自动显示相关的搜索&#xff0c;不知道有没有想过这个功能是如何实现的呢&#xff1f;面对海量的数据&#xff0c;它怎么能在我输入的同时&#xff0c;如此快速的检索到相关内容呢&#xff1f;当我查找资料后&am…

Python元组是什么

引出 在使用Python过程中&#xff0c;列表、集合和字典是比较常用的数据结构。 列表简单说就是数组&#xff0c;不对&#xff0c;它就是数组 集合就是去重的元素结构&#xff0c;和JAVA中的set一样 字典就是一个key-value的键值对&#xff0c;和JAVA中的HashTable一样 但是…

B+树

引言 时隔一年&#xff0c;我又想起当初看数据库时&#xff0c;看到的B树&#xff0c;就是数据库的索引使用的数据结构。再整理一下&#xff0c;看看自己没有忘记很多吧。 概述 B树之前&#xff0c;先来看一下二叉查找树&#xff08;1,2,3,4,5,6,7&#xff09; 恩&#xff0…

关于相对性的思考

换位思考是一直都在倡导的做法。也就是说&#xff0c;在考虑问题时&#xff0c;不光要站在自己的角度来思考&#xff0c;还要站在他人的角度来思考。不光要站在一个角度思考&#xff0c;要尝试多个角度来思考问题。 下面一则小故事&#xff1a; 熊大&#xff1a;熊二&#xff…

Python导入运行的当前模块报错

引言 今天遇到了一个奇怪的现象&#xff0c;简单举个栗子&#xff1a; 文件结构如下&#xff1a; 其中tt.py文件中定义了一个方法&#xff1a; def tt():print(tt) 我现在要在test.py中使用tt(), 代码如下&#xff1a; from test.tt import tt ​ if __name__ __main__:t…

Python中的+=

引出 今天在运行之前写的一个Python脚本时&#xff0c;发生了一个奇怪的现象&#xff08;我怎么老遇到奇怪的现象&#xff5e;&#xff5e;&#xff09;。当时的代码大概长这样&#xff1a; a [1, 2, 3] b [4, 5, 6] # ...一大段逻辑 c a c b # ...一大段逻辑 # 在这里&a…

网络带宽是什么

引出 最近有盆友在购买云服务器&#xff0c;问我带宽选多大的比较合适&#xff1f;当时我说&#xff0c;就你这小网站&#xff0c;整个1M妥妥的。 也罢&#xff0c;就简单介绍一下带宽吧。 概述 其实简单的说&#xff0c;可以比作网速&#xff08;当然还是有区别的&#xf…

js new Date 创建时间默认是8点

起因 最近在写一个页面&#xff0c;需要用到时间控制。然后我通过new Date()传入日期字符串创建了一个对象&#xff0c;并与当前时间做时间戳比较&#xff0c;结果12点刚过&#xff0c;就出问题了。举个栗子&#xff1a; // 假设当前时间是2019年12月22日0点20分 new Date(20…

js解决客户端与服务器时间不一致的问题

引出 最近在写一个项目时&#xff0c;要根据时间进行不同的展示&#xff0c;直接用new Date().getTime()获取当前时间&#xff0c;结果就出问题了。有些用户擅自修改自己的本地时间&#xff0c;导致获取到的时间并不是当前时间&#xff0c;尴尬。 思路 既然如此&#xff0c;…

Python实现cmd命令连续执行

之前是想写一个微信控制程序&#xff0c;通过登录网页微信&#xff0c;可以直接执行命令行代码。也不用ssh登录了&#xff0c;想法很方便。 但是现实很残酷&#xff0c;微信登录这块基本没有问题&#xff0c;已经有大佬写好了&#xff0c;但是命令行执行遇到问题了。 运行cmd…