框架

简单说一说如何提高代码的可读性:变量与函数

Spread the love

项目开发当中,很多道理大家都很明白,但是因为各种各样的原因却无法实现,

美术当中或许是在项目立项之时的美术规范,而程序则是整洁的代码。

正如《代码简洁之道》这本书开头所描述的一样,衡量代码唯一的标准就是别人在阅读代码的时候抱怨的次数。

好的代码易于维护,而糟糕的代码或许只是开发者图一时之快而造成后续一系列维护的麻烦。

虽然这些道理大家或多或少都知道,但是还是要时不时拉出来扯一扯。

当然也有很多书对代码整洁以及规范做出了很好的建议,例如《重构》、《代码简洁之道》、如果是C#的话还有《Effective C#》,相对应的Java就有《Effecttive Java》。

很多人都知道重构是为了项目的长期出发而对项目的短期整理,如果重构带来的收益小于一直进行开发带来的进度的话重构是不必要的。

但是我觉得,代码在设计之初就尽可能得思考未来可能发生的变化,而不能期许开发一段时间之后的重构来提高项目的整体开发效率。

我们要做的应该是自始至终都让代码保持整洁。

 

这几天阅读项目代码,发现这方面的问题确实很大,所以又想把这一块拉出来提一提。

原本想写一写代码简洁之道,但是切入口太大,无从下手,所以就简单聊聊代码可读性中变量与函数的部分吧。

 

1、自解释的代码风格

说到可读性,大家可能会想到自解释的代码,顾名思义也就是不需要注释也能轻松从代码中了解到作者意图。

这是提高代码可读性的基础,如果代码中的一个变量、一个函数,根本无法从名字当中得到其存在的意图,那所有的一切解耦等等,那就无从谈起,简单地说就是,你连自己的代码复杂度都无法控制,即使通过解耦隐藏了别人的代码细节也毫无用处。

 

所以命名也就是老生常谈的问题,从初学编程谭浩强教程当中的abc变量,到现在接触到项目快速阅读项目框架,大家肯定已经了解到命名的重要性了。

 

变量名需要名副其实,让人一眼就能看出是什么,而不是使用大量的注释。对于同一样事物要使用同一个词,避免产生不必要的误导。

有些项目喜欢用匈牙利命名法来约束程序编写规范,但是从目前看来其实并没有太大必要,因为现在的IDE以及编辑器的自动提示功能早就完全替代了匈牙利命名法中前缀带来的作用了。

变量命名的时候最好还能考虑到是否便于搜索,而不会与别的变量冲突,减少阅读项目时的成本。

当然魔数之类的硬编码肯定也不能出现,否则依赖部分一多,重构就变成了噩梦。

函数名也是同样的道理。

命名其实都是大家都非常注意的地方,但是这是代码可读性的基石,如果没有好的命名就什么也无从谈起。

 

2、函数的调用

除了命名以外,自解释的函数也非常重要。

一个函数的名字,往往代表了它要做并且只做什么事情。也就是尽量减少函数带来的副作用。

函数尽可能简短,就算只调用一次,但是如果能用函数名来说明其做了什么工作就可以为调用它的函数减少复杂度。

如图所示,如果一个函数FuncA包含了4个过程,那我或许要读整整400行的代码。

但是如果经过函数的封装,我可以只了解其使用的方法,而对其中的过程视而不见,从而了解整个函数大致的功能。

这大大提高了阅读代码的效率。

注意,不要采用链式的函数调用,同一抽象层级的函数应该被写在同一个层级上。

否则读代码的人就像是在读流水账一样。

但是一个不好的函数则则可能在调用中带来副作用。

如上图所示,Add函数既获得了两个数字的和也为otherNumber设置了值。

有一个比较好的说法是,一个函数只能是取值或者是写值,要不就是返回一个结果,要不就是对上下文变量产生影响。

例如这里的Add就可以拆分成两个函数。

健康的函数调用应该像一棵树,每个树节点有着自己明确且唯一的目标。

错误定位的时候则只需要由上而下进行Debug,越往下,任务的细粒度越小,也就更容易定位到错误。

反之,糟糕的函数调用有很多种,

例如整个函数包办了整个过程:

这种情况下我们需要阅读所有细节才能明白这个函数在做什么。

链式调用:

这种情况下,我们也同样需要阅读大部分细节,定位的时候我们需要逐函数定位,而不能直接命中错误部分。

 

上述的这些所有,都是简洁代码编写当中的一小部分,但是却经常会出现在代码的编写当中,类的耦合则在《设计模式》这本书中被说得差不多了。

有时间的话还是或许还会针对这部分写一篇文章吧。

 

对于简洁代码,并不是三言两语就可以说完的东西,更多的时候还是在于平时编码时候习惯的迭代,

发现自己的某一个工作流出现了问题就及时进行解决,这样才能更好地让我们可持续地迭代与维护一个项目。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.