今天看到圈复杂度为 41的代码, 缺少必要的说明性注释, 感觉, 一头雾水, 难以接收.
什么是好的代码:
1.清晰明了, 必要适当的宏定义, 替代(数字/字母/特殊符号).
如:#define REDIS_EL "/r/n"
#define NOT_EXIST (-2)
#define TCP_PACKAGE_LEN 5120
#define REDIS_DEFAULT_HOST "cache.12345678.com"
#define REDIS_DEFAULT_PORT 6379
例子, 如果你在代码中看到, return -2, 好呢, 还是, return NOT_EXIST 好呢??
清晰的宏定义, 可以是代码方便阅读, 清晰易懂, 容易接手.
2.圈复杂度 小于 15.
将适当的代码功能提取, 做到, 高耦合, 低内聚.
3.适当的换行和空格
redis的代码举例:
static int vmWriteObjectOnSwap(robj *o, off_t page) {
if (server.vm_enabled) pthread_mutex_lock(&server.io_swapfile_mutex);
if (fseeko(server.vm_fp,page*server.vm_page_size,SEEK_SET) == -1) {
if (server.vm_enabled) pthread_mutex_unlock(&server.io_swapfile_mutex);
redisLog(REDIS_WARNING,
"Critical VM problem in vmWriteObjectOnSwap(): can't seek: %s",
strerror(errno));
return REDIS_ERR;
}
rdbSaveObject(server.vm_fp,o);
fflush(server.vm_fp);
if (server.vm_enabled) pthread_mutex_unlock(&server.io_swapfile_mutex);
return REDIS_OK;
}
如果改成如下, 你看了, 会有怎样的感觉呢?
static int vmWriteObjectOnSwap(robj *o, off_t page)
{
if (server.vm_enabled)
{
pthread_mutex_lock(&server.io_swapfile_mutex);
}
if (fseeko(server.vm_fp,page*server.vm_page_size,SEEK_SET) == -1)
{
if (server.vm_enabled)
{
pthread_mutex_unlock(&server.io_swapfile_mutex);
}
redisLog(REDIS_WARNING,
"Critical VM problem in vmWriteObjectOnSwap(): can't seek: %s",
strerror(errno));
return REDIS_ERR;
}
}
rdbSaveObject(server.vm_fp,o);
fflush(server.vm_fp);
if (server.vm_enabled)
{
pthread_mutex_unlock(&server.io_swapfile_mutex);
}
return REDIS_OK;
}
3.适当的明确注释
利人利己,
亲身经历, 自己写的代码, 时间长了, 就不知道, 是做什么的
注释无论中文, 英文, 简单明了
总结:
简单明了, 清晰, 易于接手的代码才是好代码, 才是好程序员写的代码!
晦涩难懂, 挡住了别人, 也为自己埋下了陷阱. 别人难维护, 自己也难维护.
PS: 没有批评redis开源源代码的意思! 只是说明, 有些源代码太晦涩难懂了! 当然, redis 如今的成就, 鄙人难以到达的.