Clean Code 第三章 函数 总结

  • 函数的名称

         函数名称最好不要使用一些很迷惑的缩写,例如说如果写了一个函数用于删除vector中的一系列连续的元素,将其命名成了remove。在之后的编写扩充过程中又写了一个新的函数,删去其中所有的奇数位元素,并且命名成rSValue,那么在这种情况下,写代码的人觉得既然有一个常用的函数叫remove,那么r缩写开头自然而然不就是连接上remove吗,但是阅读代码的人就可能要猜了,而且没有什么证据能证明他能把r和remove连接上,或许这样的缩写的连接的猜法只是写代码的人的一厢情愿罢了,那么就需要去阅读代码来理解它,这样无形之中就提高了阅读成本。

        与之对应的,如果写下的名称是removeSinglePlaceElem(Elem也没有写全成Elements,因为它很明确,这里的缩写主要针对的是缩写到一两个字母的形式的缩写),情况可能就要好转一些,因为阅读代码的人多半能够猜到是什么意思了,不再需要阅读源码或者注释,根据上下意能顺利的读下去。如果首字母就是缩写,那么按下r的那一下,便有了所有r开头的函数,这一点也容易引起误会(譬如说有另外的一个函数叫reverse用于反转,那如果通过r来看其他函数,并从其他函数得到信息的人,到底是把r联想成remove,还是reverse呢,不得而知,毕竟,在此例中两者解释似乎都是可以实现的)。

        其次,何必让注释来解释你的函数名称呢?

        //return the designated tree structure’s all nodes’ info

        string dsTreeTCName(Tree);

        此函数想要返回一个指定的树的所有孩子节点的信息,但是函数名本身缩写了,其信息却不是和函数绑定在一起的(你只能查阅的时候才能看到这一注释)。

        所以为什么不写成:dsTreeGetAllNodesInfo呢,在现代的IDE中,我们经常享受到自动补全的便利,我们没有必要再去缩写函数名称到一个很迷惑的地步(当然,有些缩写还是很明确的,没必要对缩写这件事草木皆兵),那样很容易让未来的自己和其他读者有所疑惑。

  • 函数的实现、使用

        (注:我个人不太认同一个函数只做一件事这个思想)

        一个函数,应当只做一件事情。如果一个函数能再拆出一个函数,那么它就不是单纯的实现这一个事情。

        CC作者的想法,我认为是将函数的层次区分开来,比如一件事,我们可能要先分配资源,获得资源,利用资源,得到结果。在这种思想下,我们应该把他分离成四个函数,但是我认为这样坚决的贯彻这一思想,往往会产生一些“一次性函数”,也就是只用了那一次的函数,因为它做的那件事情是与另一件事捆绑的,这种时候两个事件就算是可以分开的,那也是一种毫无意义的举动,因为其无法复用,也就无法提供给其他模块使用。

        其次,如果要确保一个函数只做了一件事,那么所有语句都要在一个抽象层级上,也就是说一个函数的代码它只在一层事件上做事,比如上文中提到的四步:分配资源,获得资源,利用资源,得到结果,就是四层事件。这种想法就好比搭房子,从底层到高层,每一层由一个函数来堆,且不能跨层的堆叠。

        最后,最好不要让一个函数带有副作用,除非很明确。所谓的副作用就是当使用引用或是指针传递参数的时候,函数内部很可能会把参数的值改变了,而导致一些隐晦的错误。针对类似的问题,在C++中的const用法中就有不允许一个成员函数内部对类成员有任何改变的用法。

  • 参数数量

        参数的数量应当尽量的少,只有一个或两个,当参数的数量再增加的时候,理解它的难度也会随之直线上升。这一点,和上面的函数只做一件事我认为也有一定的联系,因为只有当函数分离的很彻底的时候,其参数的个数才会降低很多(往往就是一个函数要做很多事的时候,它的参数会变得很多)。

        其次,我们可以采用对象来减少函数参数的个数,例如有一个函数它接受三个参数,其中前两个是一个点的x,y坐标,可以利用一个对象Point(毕竟,Point按照常理来思考就是一个x,y点),并且以Point对象为参数,以此来减少参数的个数。

  • 切勿写出重复代码

        让函数来做重复的事。

转载于:https://www.cnblogs.com/HotPants/p/11349881.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值