大家好,有一些coding style的议题想跟各位分享与讨论
勒布朗克法则(LeBlanc’s Law)说:Later equals Never
你心想着待会儿再回来整理程式,但其实永远不会再回头改的
最近想要整理出一些guideline跟同仁分享,
想说这样大家的程式可读性提升,对团队的合作会更好,
不过我想先抛砖引玉,分享一些我整理出来的心得,
希望大大们可以分享一下自己的coding style
或是有更好或更多的撰写程式的规范跟原则。
======================================
下方先是我整理的资料分享,欢迎大家也分享自己的coding style
1. Boolean变量或function的命名方式
Boolean变量或function的开头必须使用is, can, has, should,
但如果本身是形容就不需要,像是enabled, done就无需用is开头
2. 用介系词(of,for,from,on…)来组变量名称
这件事情但起来单纯,但很多时候大家都会忽视介系词硬组变量名称,
像是daysUntilDeadline就有可能被命名成DeadlineDays,如易造成误解,
以下是我找到一些不错的范例
var daysSinceModification = 3; // 在修改已过了3天
var workDaysPerWeek = 5; // 每周工作5天
var daysUntilDeadline = 10; // deadline前还剩10天
3.使用更具体的单位
delayedTime代表的是delay的时间,但其实单位是秒数,
所以命名上最好使用更具体的单位来优化这个命名,改写成delayedSeconds会更好
4.舍弃i,j,k,使用更好的Iterator
一般for循环中我们都会使用到i, j, k,这其实不是不行,
但是如果i, j, k分别代表parent, children, toy,
那就可以用pi, ci, ti来取代i, j, k,这样程式码不会变长太多,
可读性提高也较容易debug
5.Function Name的prefix都是动词
基本上function名称全都是“动词”
开头但如果像是getCellSize()或calcCellSize(),可以直接省略开头的动词,
直接使用cellSize()即可,不过也有人坚持不能用名词开头,基本上团队统一即可。
6.缩写真的方便但并不是最好
因为不想打太长的变量或函数名称,大家总是在缩写,
但是有些缩写很容易让人搞混,对于原本就在维护这份程式的工程师或许还好,
但新进工程师会很容易困惑。
使用像是dns,url这些众所皆知的词没问题,只有自己团队才看得懂的缩写,
除非必要,不然尽量避免使用。
不过我觉得这个看情况而定,重点是一定要有一份解释缩写的文件比较好。
7.如何写注解
*在档案的最前头写上整个程式档案大致是如何运作的档案注解
*除了解释程式运作的原理外,还可以描述为什么要用这样子的写法来写,
可能是效能上的需求之类的
*使用 TODO FIXME 等注解标签,TODO可以标记尚未制作或是需要优化的部分,
FIXME是不能运作需要修复的部分,其实我知道还有HACK, XXX 等标签,
不过我觉得好像都归类在TODO比较方便,不知道大家的习惯是如何?
*在设定常数的时候给予注解其实也能帮助理解,让开发者更有概念,
像是下面程式注解说明为什么要设定为1000的理由
// 加上合理的限制 - 没有人能读那么多文章
const int MAX_RSS_SUBSCRIPTIONS = 1000;
8.封装条件
如果if()里面有超长一串的判断式,可读性会超差,
所以可以把这个判断式用boolean变量装起来再判断
boolean isMan = (user.age >= 18 && user.gender == ‘male’);
if (isMan){
// 做一位男人该做的事 >///<
}
======================================
其中最想请教大家的是function前方动词的分类
Clean Code这本书上有说
Pick one word for one abstract concept and stick with it.
不过比较没人整理出较为通用的词库对应表,
我知道这个本来就没官方解答,但是我想听听看各位的经验,
整理出我自己的一套词库,以下是我目前整里的词库
fetch:从远端(透过API)获取资料,例如:fetchUsers()
load:从本地端加载资料,例如:loadFile()
calculate/calc:通过计算获取资料,例如:calcBMI()
show:显示物件,如showModal()、showDialog()
remove:将资料之间的关系移除,资料本身还是会存在
delete/destroy:将资料删除,资料将会不存在
on:定义event的时候使用,像是onClick,onChange
handle:当onClick之类的event发生时所触发的function,
例如:handleClick,如果click后面有受词的话,
这将受词移到click前方* 例如:handleButtonClick
剩下还有哪些词是大家常用的呢?还请各位大大不吝分享,
我在下面放一些可能会用到的词,大家是怎么给这些词定义他专属的concept,
或是有哪些没提到的也可以补充一下,麻烦大家给点意见了XD
get/set
create: insert append add append
edit: modify update
complete: finish done end
send: deliver, dispatch, announce, distribute, route
find: search, extract, locate, recover
start: launch, create, begin, open
make: create, set upm build, genernate, compose, add, new