代码整洁之道一些小小的总结,有总结不到位地方欢迎大佬指出
一、什么是整洁代码
0、态度-认真,重视
1、在意,整洁的代码看起来就像特别在意它的人写的
2、最小分割单位--尽量小
3、不受外部影响
4、没有重复代码
5、有意义的命名--见名知意--后续细讲
6、统一命名方式-类、接口、常量、变量
7、读写比例超过10:1
8、借用美国童子军军规--让营地比你来时更干净
二、有意义的命名--变量、函数、参数、类、包
1、名副其实 int d;// 消逝的时间 -- int elapsedTimeInDays;
2、避免误导 int[] demoList;// 会误导为1组List -- List<> demoList;
3、数字1和大写字母I 数字0和字母O慎用
4、有意义的区分--money和moneyAmount没区别,customerInfo和customer没有区别
5、弃用单字母名称,尽量使用可搜索名称(短方法如for循环内除外)-- 作用 修改字段后便于全文搜索进行统一修改,避免遗漏
6、方面名应该是动词或动词短语 如:save
7、添加有意义语境 -- 如 person、和 address 很容易联系到person是收货人 如果独立拿出来 person只能代表人,添加addrPerson更能明确
三、函数
1、短小-- 复用、便于理解 -- 函数不应该长于一屏 -- 100行*150个字符,函数小于20行最好
2、只做一件事 做好一件事 -- 判断,查看函数能否再拆;函数的语句要在同一抽象层级上
3、函数参数尽量避免三个以上参数--参数过多封装为类处理
4、函数只做一件事 错误处理就是一件事
5、别重复自己--不要重复代码
四、注释 -- 更新不及时,阐述错误容易误导--程序员不能坚持维护注释
1、注释的恰当用法是弥补我们再用代码表述意图时遭遇的失败,注释会撒谎
2、创建一个函数与注释的描述相同来替代注释
3、注释用于法律信息解释、对意图的解释、可读性阐述、警示
4、TODO 注释 认为应该做 但是还没有做 解释为什么该函数没有具体的实现
5、归属与签名--方便查找出处
6、不用的代码千万别注释掉,除非后续要用,否则会导致很多垃圾代码产生
五、格式与返回
1、格式:适当的空白行良好的缩进和括号有助于代码阅读,推荐使用阿里巴巴代码规约扫描
2、格式每行代码宽度:100字符左右,屏占没有滚动条最佳;换行时逗号","留在行末,对象的某个字段或字符串拼接等
的"."换行至下一行行首
public class HelloWorld {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("这是代码整洁之道中的代码格式的阐述2").append("这是代码整洁之道中的代码格式的阐述2").append("这是代码整洁之道中的代码格式的阐述3")
.append("这是代码整洁之道中的代码格式的阐述4");
System.out.println(stringBuilder.toString());
}
}
六、类
1、遵循Java约定,类应该从一组变量列表开始。顺序:公共静态变量,私有静态变量,私有实体变量,基本不出现公共变量,公共函数
2、类的两条规则:①类应该短小,②类应该更短小
3、系统应该由许多短小的类而不是少量巨大的类组成。每个小类封装一个权责,只有一个修改原因,并与少数其他类一起协同达成期望的系统边界
七、系统
1、将系统的构造与使用分开,大厦创建需要起重机和升降机,大厦创建好之后起重机和升降机消失
2、实现分离构造与使用--依赖注入。
关于控制反转与依赖注入:
参与者:对象、IOC/DI容器、某个对象的外部资源;
依赖:对象依赖于IOC/DI的容器;
为什么依赖: 对象需要IOC/DI容器来提供对象需要的外部资源
注入:IOC/DI容器注入某个对象,注入的是某个对象需要的外部资源
控制:IOC/DI容器控制对象, 控制对象的创建
反转:反转相对正向,正向:A中使用C,直接创建C对象,也就是说A类中主动获取所需要的外部资源C。反向:A类不再主动获取C,而是被动等待,等待IOC/DI容器去获取一个C的实例,然后注入到A类中。
依赖注入和控制反转是对同一件事情的不同描述
简述 依赖注入:应用程序依赖容器创建并注入它所需要的外部资源;控制反转:容器控制应用程序,由容器反向的向应用程序注入应用所需要的外部资源
3、 微服务--多个服务整合便于扩展和扩容
八、并发
1、限制数据作用域,避免数据共享
2、线程尽可能独立
3、线程执行模型:
限定资源:并发环境中有着固定尺寸或数量的资源,例如数据库连接和固定尺寸读写缓存 如生产者、消费者
互斥:每一时刻仅有一个线程能访问共享数据或共享资源
线程饥饿:如果线程因为其他线程占用所有CPU时而得不到执行就称为“饥饿”线程 读者-作者模型
死锁:两个或多个线程互相等待执行结束,每个线程都拥有其他线程需要的资源,永远在互相等待的进程称为死锁进程。发生条件:互斥、请求和保持、不剥夺、环路等待
活锁:两个线程都可以使用资源但互相等待另一方线程先使用资源 -- 宴席哲学家,一群哲学家围绕在大圆桌,大圆桌中间有很多菜品,每个哲学家右手边只有一支筷子,需要一双筷子🥢才能正常进食,部分放弃可部分使用,使用完成后放回原位
4、避免共享对象的方法
基于客户端锁定:客户端在调用第一个方法前锁定服务端,确保锁的范围覆盖调用最后一个方法的代码
基于服务端锁定:在服务端创建锁定方法,调用所有方法然后解锁。然客户端代码调用新方法
适配服务端:创建执行锁定中间层,这是一种基于服务端锁定的例子,但不修改原始服务端代码
5、保持同步区域微小
6、使用waie(),sleep(),yield()和priority()调用来测试代码
网友评论