《代码精进之路:从码农到工匠》笔记

读书进度:在阅读了书籍的1、2、3章之后,我发现自己无法理解的地方越来越多,所以决定先放下。2020/11/9
节选1:不管你们有多敬业,加多少班,在面对烂系统时,你仍然会寸步难行,因为你大部分的精力不是在应对开发需求,而是在应对混乱。
节选2:就像Kent Beck说的:“我不是一个伟大的程序员,只是习惯比较好而已。”只有养成精益求精、追求卓越的习惯,才能保持精进,写出好的代码。
一、术语:
1、COLA:整洁面向对象分层架构。(控制代码复杂度的方法)
2、SRP:单一职责原则
3、EDM:邮件营销
4、pipeline:管线,流水线
5、NOF:空指针
二、本书的结构:
技艺部分、思想部分和实践部分。
本书例子所用语言为JAVA。
三、技艺部分之命名
1、 名字不影响程序的执行,但对代码的表达力和可读性有着重要的影响;
名字要把要义浓缩在一到两个词中;
代码即文档,可读性好的代码应该有一定的自明性,也就是不借助注释和文档, 代码本身就能显性化地表达开发者的意图;
名字要具有可搜索性;
名字要保持一致性,每个概念一个词,例如,fetch、retrieve、get、find和query都可以表示查询的意思,如果不加约定地给多个类中的同种查询方法命名,你怎么记得是哪个类中的哪个方法呢?同样,在一段代码中,同时存在manager、controller和handler,会令人感到困惑。为保持命名的一致性,可制定约定,保持命名的一致性。
使用对仗词,add/remove increment/decrement open/close begin/end insert/delete show/hide create/destory lock/unlock source/target first/last min/max start/stop get/set next/previous up/down old/new
后置限定词:限定词有total sum average max min等,为变量赋予主要含义的部分应位于最前面,这样可以突出显示且被首先阅读到,限定词约定后置。比如revenueToatal(总收入)、expenseTotal(总支出)、revenueAverage(平均收入)、costomerCount(客户总数)、customerId(客户的编号)。
好的代码是最好的文档;
使用中间代码让代码更加自明;

变量名 应该是名词,能够正确地描述业务,有表达力,妖让读者很容易知道变量的含义。
函数命 名要具体,空泛的命名没有意义;函数名要体现做什么,而不是怎么做。
类名:类是一组对象和操作的封装,类分为实体类和辅助类;实体类承载了核心业务数据和核心业务逻辑,其命名要充分体现业务语义,并在团队内形成共识,如customer、bank和employee等。辅助类是辅佐实体类一起完成业务逻辑的,其命名要能够通过后缀来体现功能。例如,用来为Customer做控制路由的控制类CustomerController、提供Customer服务的服务类CustomerService、获取数据存储的仓储类CustomerRepository。对于辅助类,尽量不要用Helper、Util之类的后缀,因为其含义太过笼统,容易破坏SRP(单一职责原则)。
包名:包package代表了一组有关系的类的组合,起到分类组合和命名空间的作用;包应该能够反映一组类在更高抽象层次上的联系,比如把一组类Apple,pear,orage放在一个包里,命名为fruit;包的命名要适中,不能太抽象,也不能太具体。
模块名:module模块名就是一个坐标,一方面模块名保证了模块在仓库中的唯一性,另一方面,模块名反映模块在系统中的职责。

例子:
变量 int d; 不如 int elapasedTimeInDays; 两者都表示过去的天数
函数名 processData() 不如 validateUserCredentials()或者eliminate
假如我们将雇员信息存储在一个栈中,现在要从栈中获取最近存储的一个雇员信息,那么getLatestEmployee()就比popRecord()要好。
数字86400用常量SECONDS_PER_DAY来表达;每页显示10行记录的,10应该用PAGE_SIZE来表达。辅助类是辅佐核心业务和数据和核心业务逻辑,其命名要能够通过后缀来体现功能。
2、注释
好的代码阐释代码背后的意图,坏的注释复述代码的功能;注释弥补代码的表达能力,当写注释时思考是否是自己在表达能力上存在不足,思考如何提升代码的表达力,真正的高手尽量不写注释。
四、技艺部分之规范
3、事情的复杂程度在很大程度上取决于其有序程度,减少无序能在一定程度上降低复杂度,这正是规范的价值所在。通过规范,把无序的混沌控制在一个能够理解的范围内,从而帮助我们减少认知成本,降低对事物认知的复杂度。
4、认知成本
发现共同抽象和机制可以在很大程度上帮助我们理解复杂系统;对事物系统地记忆和认知能够减少认知成本,所以要建立个人知识体系或者系统地学习知识。
5、代码格式
代码格式需要遵守一定的规范,包括缩进、水平对齐、注释格式等;
6、空行规范
对于同样的内容,空行分出小段落比大段文字具有更好的可读性。
空行在代码中起到概念区隔的作用。
将概念相关的代码放在一起:相关性越强,彼此之间的距离应该越短。
7、命名规范
Java语言的命名规范
·类名采用“大驼峰”形式,即首字母大写的驼峰,例如Object、StringBuffer、FileInputStream。
·方法名采用“小驼峰”形式,即首字母小写的驼峰,方法名一般为动词,与参数组成动宾结构,例如Thread的sleep(long millis)、StringBuffer的append(String str)。
·常量命名的字母全部大写,单词之间用下划线连接,例如TOTAL_COUNT、PAGE_SIZE等。
·枚举类以Enum或Type结尾,枚举类成员名称需要全大写,单词间用下划线连接,例如SexEnum.MALE、SexEnum.FEMALE。
·抽象类名使用Abstract开头;异常类使用Exception结尾;实现类以impl结尾;测试类以它要测试的类名开始,以Test结尾。
·包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一使用单数形式。通常以com或org开头,加上公司名,再加上组件或者功能模块名,例如org.springframework.beans
8、日志规范
日志输出的级别
ERROR:表示不能自己恢复的错误,需要立即被关注和解决
WARN:可预知的业务问题
INFO:用于记录系统的基本运行过程和运行状态
DEBUG:输出调试信息
9、异常规范
在业务系统中设定两个异常,分别是BizException(业务异常)和SysException(系统异常),两个异常都应该是Unchecked Exception,而不是Checked Exception
错误码:编号错误码(文档+编号)和显性化错误码(类型+场景+自定义标识)
10、埋点规范
数据处理的5个阶段:数据采集---数据传输(实时/批量)-数据建模/存储--数据统计/分析/挖掘--数据可视化/反馈。
埋点规范的价值在于确保被采集上来的数据能够被统计分析,类似协议的作用,埋点规范不是可有可无的选项,而是必须遵守的协议。阿里巴巴的SPM就是埋点规范的一个例子。
11、架构规范
12、防止破窗
破窗效应:环境中的不良现象如果被放任存在,就会诱使人们效仿,甚至变本加厉。
四、技艺部分之函数
1、函数的定义:函数是一组代码的集合,是程序中最小的功能模块,一次函数调用包括接受参数输入、数据处理、返回结果。同一个函数可以被一个或多个函数调用任意多次。
2、封装判断
3、一般参数越少越好
4、函数要短小
5、函数的职责要单一SRP ,一次只做一件事
6、精简辅助代码:辅助代码是程序中必不可少的代码,但又不是处理业务逻辑的核心代码,比如判空、打印日志、鉴权、降级和缓冲检查等,这些代码往往在多个函数中重复冗余。
7、优化判空
判空代码多了会影响代码的流畅性。
8、优化缓冲判断
9、组合函数模式
10、抽象一致性SLAP:组合函数要求将一个大函数拆分成多个子函数的组合,而SLAP要求函数体中的内容必须在同一抽象层次上。
11、函数式编程
五、技艺部分之设计原则
SRP
OCP
LSP
ISP
DIP
六、设计模式

你可能感兴趣的:(《代码精进之路:从码农到工匠》笔记)