以下是根据本鲁码农自己的经验,绝大部份参考Clean Code这本书,我自己是将这本书奉为
圭臬,不过我也知道很多人反对书里的一些看法,所以听听就好
首先一个最大的原则就是程式码必须好懂,因为它同时是写给机器跟人看的,好懂是可扩充
性跟可维护性的必要,是程式码无比重要的基石
推文有人说程式码没有注解的话十年后的自己会无法理解,实际上根据我自己的经验如果我
写出一段不好读的程式码,几天、几个小时甚至几分钟之后我就会痛恨之前的自己了
那么注解是必要的吗?我认为注解有其必要,但应该越少越好
为什么越少越好呢?首先,程式码应该要可以自己描述自己,来看一个简单的范例:
float multi(float a, float b) {
return a*b;
}
很容易就能看出这是一个做乘法的方法,但他的用处是什么?没人看得出来
float convertUsdToNtd(float usd, float converRatio) {
return usd * convertRatio;
}
这样就一目了然了,这是一个把美金转换成新台币的方法,如此就不需要注解了。在实务上
,尤其是在有复杂的业务逻辑的时候,变量跟方法名称可能会长到恼人的地步,但为了可读
性,这是必要的牺牲。
我们还能继续扩充这个方法,例如说加入即时汇率,让他可以将转换币值这件事做的更好
float convertUsdToNtd(float usd, FinaceService financeService) {
return usd * finaceService.getUsdToNtdRatio; // Multiply usd and ratio.
}
上面的程式码有一行注解,但不难看出这个注解是一句废话,因为他只是描述了该句程式码
做了什么。好的注解应该从抽象、高层次的方向来解释程式码的用意、为什么要这么写:
float convertUsdToNtd(float usd, FinaceService financeService) {
// Fetch ratio from finance service for real time
return usd * finaceService.getUsdToNtdRatio;
}
上面的程式码解释了为什么要从finance service 获得汇率,因为必须要获得当下即时的汇
率
但注解并不总是好的,有时候他可能是有害的。假设我今天修改了这个方法,让他不再是根
据即时汇率,而是某一天的平均汇率:
float convertUsdToNtdByDate(float usd, Date date, FinaceService financeService)
{
// Fetch ratio from finance service for real time
return usd * finaceService.getUsdToNtdRatioByDate(date);
}
程式码更改但是注解忘了更新的情况下,这行注解就是错的。错误的注解会造成混乱,低效
,甚至错误!程式码本身的可读性重要性应该永远高于注解,因为程式码描述的就是事实,
你没办法写出一行程式码做的事情和他看起来的不同(Well, 通常没办法)但是注解可以!
跟注解不同的是,我认为文件(document)是有必要而且多一点较好的,文件是写在方法前
面的注解,用来描述这个方法做了什么:
/*
Convert USD to NTD by ratio from a specific date.
*/
float convertUsdToNtdByDate(float usd, Date date, FinaceService financeService)
{
return usd * finaceService.getUsdToNtdRatioByDate(date);
}
文件是让下一份阅读程式码的人(通常就是你自己)快速理解这个方法是做什么,他会输入
什么,他会回传什么最好的方式。文件只会从最抽象的层次描述方法,不会包含任何的实作
细节,除非这个细节有必要让使用者知道(例如说,某些情况下的算法和其时间复杂度)
。而且我认为应该要采用文件导向的方式-当你创建新的方法时,你应该先编写文件修改时
亦同
※ 引述《ianlin1216 (伊恩可可)》之铭言
: 饿死抬头
: https://i.imgur.com/3QcIsVN.jpeg
: 本鲁不是资工系的啦
: 所以不知道写程式不加注解会有多严重
: 想请问相关从业的乡民
: 实务上遇到这种情况真的很赌烂吗
: 干五西恰