[请益] 程式的命名与coding style讨论

楼主: allenwang15 (艾伦王十五)   2018-05-08 10:18:21
大家好,有一些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
作者: t64141 (榕树)   2018-05-08 10:35:00
我是直接参考微软的: 开发类别库的设计方针
作者: johnny94 (32767)   2018-05-08 12:06:00
准备鸡排先
作者: v9290026 (CH)   2018-05-08 12:29:00
作者: xji4m3 (哈囉你好吗)   2018-05-08 12:36:00
中间有个小错字deadline 唷
作者: del680202 (HANA)   2018-05-08 12:42:00
你菜虫掉到地上了
作者: b81314 (有点贵)   2018-05-08 12:51:00
公司不是都会规范吗
作者: evan176 (clown)   2018-05-08 12:54:00
作者: stfang925 (司马铃薯)   2018-05-08 13:00:00
作者: ap954212 (death is like the wings)   2018-05-08 13:03:00
推推
作者: Masakiad (Masaki)   2018-05-08 13:19:00
回楼上 公司规范跟知道订规范后面的原因是两件事啊
作者: Argos (Big doge is watching u)   2018-05-08 13:32:00
勒布朗OP
作者: hazih (Justin X 煞气腾)   2018-05-08 14:34:00
推 不过iPhone用JPTT编辑很猛耶
作者: a926 (Aaron)   2018-05-08 14:44:00
用中文没烦恼(误
作者: AmosYang (泛用人型编码器)   2018-05-08 15:11:00
Re: 动词,可参考我这篇 #1Qi4OxGH (Soft_Job) 里的参考资料: “微软 PowerShell 指令动词列表”
作者: qqkerk (江雨)   2018-05-08 15:33:00
居然还没战起来@@
作者: menshuei (红茶)   2018-05-08 15:41:00
很不错收起来了
作者: NCUking (中大王)   2018-05-08 16:26:00
code complete 有一整个章节在讲这种
作者: jay123peter (萧瑟风雅)   2018-05-08 16:52:00
作者: oas (GTr)   2018-05-08 17:53:00
推推~
作者: crazybad   2018-05-08 18:08:00
作者: x51811danny (人)   2018-05-08 18:35:00
补充动词:parse
作者: paulshain04 (paulshain04)   2018-05-08 19:29:00
bindEvents()
作者: eva19452002 (^^)   2018-05-08 19:39:00
我都用匈牙利命名法而coding style则采用java style(我会被oracle告吗?)
作者: mikejhou (Mike)   2018-05-08 19:49:00
有同事之前被雕function不懂 然后他不爽就下次命名打FuckyouXXX XXX是function
作者: O187 (187cm)   2018-05-08 20:09:00
我的原则就是命名越短越好
作者: louis70109 (Nijiayu)   2018-05-08 21:00:00
作者: tom19830924 (Tom Hsu)   2018-05-08 21:06:00
如果是写Objective-C的话这蛮自然就会了 有些人会觉得这样很囉说 但我是觉得方法名称念起来就想在念一段英文 还蛮直觉的
作者: shiauji (消極)   2018-05-08 22:00:00
推 整理的好文
作者: pigcat1315 (还是朋友?)   2018-05-08 22:30:00
isMan 以前有人跟我说如果要省时就别先判断XD
作者: ymcheung (ymc)   2018-05-08 22:32:00
推好文!
作者: yupog2003 (屁股)   2018-05-08 22:36:00
推好文
作者: bill0205 (善良的小孩没人爱)   2018-05-08 22:40:00
推 \
作者: y3k (激流を制するは静水)   2018-05-08 22:53:00
匈牙利命名法是mUser这种吗... 说实在我不太懂为什么这样不干
作者: bill0205 (善良的小孩没人爱)   2018-05-08 22:54:00
我比较想问各位 变量命名时候 假使是英文单字过长通常大家都怎么缩写...比较常有这困扰
作者: y3k (激流を制するは静水)   2018-05-08 22:55:00
脆取user算了=..=
作者: ymcheung (ymc)   2018-05-08 22:58:00
之前 CSS 用缩写,隔个星期就会忘记那是三小了后来都不缩
作者: e920528 (Evis)   2018-05-08 23:00:00
作者: rollr (衛生紙的心情)   2018-05-08 23:15:00
很不错
作者: yupog2003 (屁股)   2018-05-08 23:19:00
英文单字过长就宣告的旁边加个注解?我是这样拉一样缩写就是了
作者: akai1024 (阿楷)   2018-05-08 23:35:00
第8点,直接在user写一个isMan()的函式即可
作者: ID3238 (默默)   2018-05-08 23:36:00
推分享
作者: tailau0 (台劳)   2018-05-08 23:37:00
可参考 Google Java style guide: https://goo.gl/z2SrCQ
作者: hiJackylin (安安我是新手)   2018-05-08 23:44:00
推用心
作者: pigcat1315 (还是朋友?)   2018-05-09 00:03:00
其实不用刻意缩写阿 真的很容易看不懂
作者: vi000246 (Vi)   2018-05-09 01:18:00
过长就过长啊 我自己是喜欢在单字前加上型别虽然clean code说别这样用 但是用自动完成很方便就算要改型别 直接右键重构就好了或是一些控件 combobox用cb开头 textbox用tb开头
作者: CaLeLu (苦逼人生1.0)   2018-05-09 03:13:00
先推+收藏XD
作者: wanlinlin (wanlinlin)   2018-05-09 07:54:00
作者: dm33   2018-05-09 09:21:00
作者: ppppman (4pman)   2018-05-09 09:34:00
作者: wilson85771 (HOW)   2018-05-09 09:44:00
作者: enthos (影斯作业系统)   2018-05-09 10:01:00
我喜欢推文就放得下的程式码,这是multi-switch \ m s --: mmatch >r ( swap [email protected] swap s:search null? if 2dropdrop else drop swap w:exec then ) m:each drop rdrop ;
作者: DingDang827 (叮叮当)   2018-05-09 10:30:00
作者: dogalan (Emotion)   2018-05-09 11:14:00
作者: tz5514 (屁安)   2018-05-09 18:12:00
作者: AvatarH (Avatar Hsieh)   2018-05-09 21:48:00
变量活不过一页的用小写和底线串,活不过一个函数范围的,用驼峰式命名法。全域变量用底线当开头,全域静态变量用全大写。简单的说看变量长怎样,就知道这个变量的存活范围。至于命名方法看规定,上面的方法都有可能碰到。
作者: wifirts (WiFi RTS)   2018-05-09 22:46:00
实用推
作者: pardo (pardo)   2018-05-10 00:22:00
作者: Raymond0710 (雷门)   2018-05-10 09:12:00
感觉是从The art of readable code这本书整理的, 谢原po整理
作者: CRPKT (crpkt)   2018-05-12 00:15:00
一个概念只用一个字满重要的,我有时候会从同义字典里挑如果还是无法让别人一眼就了解概念就再加注解另外也可以 google 一下别人都用哪个字来表达同样的概念
作者: overhead (overhead)   2018-05-12 13:10:00
作者: chendkkkk (Dennis)   2018-05-12 22:17:00
作者: moon2519 (~X~X~)   2018-05-13 10:06:00
作者: Ghamu (猫丸)   2018-05-14 01:36:00
我遇到真的本身太长的英文单字都会Google abbreviation以前也爱用handle 可最近想想handle 这字什么意思也没说所以如果按钮是要show dialog我就用shoeDialog 不会用handleClick
作者: ChoDino (Dino)   2018-05-14 21:21:00
最后一题,命名是跟着你的英文字汇量改变的,而不是定几个每次都拿来套用,单字认识多,就会找到最适合的语意。

Links booklink

Contact Us: admin [ a t ] ucptt.com