《代码整洁之道》读书笔记六
有意义的命名
1.一旦发现有更好的名称,就换掉旧的
2.名副其实
如果名称需要注释来补充,就不是名副其实
3.避免误导
做有意义的区分
使用读得出来的名称
使用可搜索的名称
如:MAX_CLASSES_PRE_STUDENT
4.类名
类名和对象名应该是名词或名词短语,如Customer WikiPage Account
AddressParser
不应该是动词
5.方法名
应该是动词或动词短语,如postPayment deletePage save
属性访问器、修改器、断言,应该根据其命名前加上get、set、is前缀
函数
1.短小是函数的第一规则
2.只做一件事,做好这件事
3.每个函数一个抽象层级
如 getHtml() 高
PathParser.render(pagePath) 中
.append("\n") 低
函数中混杂不同的抽象层级,会让人迷惑
自顶向下读代码:向下规则
4.函数参数
最理想的参数是零(零参数函数),其次是一,尽量避免三个参数及以上的函数
从测试角度,参数越多越难测
5.转换结果的函数应该体现在返回值
6.应该尽量将二元函数转换为一元函数(元:参数个数)
7.参数对象
如果函数看来需要三个或以上参数,说明其中一些参数应该封闭为类
如:
Circle makeCircle(double x, double y, double radius);
|
Circle makeCircle(Point center, double radius);
从参数创建对象,从而减少参数数量,当一组参数被共同传递,往往就是该有自己名称的某个概念的一部分
8.动词与关键词
给函数取好名字,能较好地解释函数的意图,以及参数的顺序和意图
如一元函数 writeFile(name) 动词/名词
将参数的名称编码成函数名,如
assertEqual->assertExceptedEqualsActual(excepted, actual)
9.避免使用输出参数,如果函数必须修改某种状态,就修改所属对象的状态
面向对象语言中对输出参数的大部分需要已经消失,因为this也有输出参数的意味
10.分隔指令与询问
public boolean set(String attribute, String value);
if(set("username", "unclebob"))...
上述为指令与询问都在set函数中,应该改为
if(attributeExists("username")) {
setAttribute("username", "unclebob")
}
11.使用异常替代返回错误码
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}catch (Exception e) {
logger.log(e.getMessage())
}
完美的隔离(try catch 代码块主体抽离 )
public void delete(Page page) {
try{
deletePageAndAllReferences(page);
}catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deltePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e)
{
logger.log(e.getMessage());
}
12.错误处理就是一件事
如上述代码,如果关键词try在某个函数中存在,它就是该函数的第一个单词,而且在catch/finally代码块后面也不该有
其他的内容
13.依赖磁铁
public enum Error {
OK,
INVALID,
NO_SUCH,
LOCKED;
}
使用异常替代错误码,新异常就可以从异常类派生出来,无需重新编译或重新部署
14.重复可能是软件中一切邪恶的根源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-11-30 2020/11/30 刘一辰的JAVA随笔