首页 > 其他分享 >代码重构技巧

代码重构技巧

时间:2024-01-24 21:33:07浏览次数:23  
标签:重构 技巧 parameters 代码 long final void private public

1、面向对象类封装性,避免属性直接赋值,而应该使用方法暴露

#1 改造前
public void approve(final long bookId) {
...
book.setReviewStatus(ReviewStatus.APPROVED);
...
}

#2 改造后
public void approve(final long bookId) {
...
book.approve();
...
}

2、复数命名:不使用List,Set,Map这种,直接使用s结尾

3、函数参数:

a、长度不超过2个,超过2个包装类

b、如果调用时需要计算,先使用变量算出来,再放入参数列表中

c、不要企图使用函数参数控制if-else逻辑,试图封装不同的函数

      这里会破坏单一职责原则和接口隔离原则

public void buyCourse(long userId, long courseId, boolean isVip);

// 将其拆分成两个函数
public void buyCourse(long userId, long courseId);
public void buyCourseForVip(long userId, long courseId);

4、模型封装:一个模型的封装应该以行为为基础

改造前
--------------------------
public void createBook(final NewBookParamters parameters) {
...
Book book = Book.builder
.title(parameters.getTitle())
.introduction(parameters.getIntroduction())
.coverUrl(parameters.getCoverUrl())
.type(parameters.getType())
.channel(parameters.getChannel())
.protagonists(parameters.getProtagonists())
.tags(parameters.getTags())
.completed(parameters.isCompleted())
.build();

this.repository.save(book);
}

改造后
--------------------------
public class NewBookParamters {
private String title;
private String introduction;
private URL coverUrl;
private BookType type;
private BookChannel channel;
private String protagonists;
private String tags;
private boolean completed;

public Book newBook() {
return Book.builder
.title(title)
.introduction(introduction)
.coverUrl(coverUrl)
.type(type)
.channel(channel)
.protagonists(protagonists)
.tags(tags)
.completed(completed)
.build();
}
}

public void createBook(final NewBookParamters parameters) {
...
Book book = parameters.newBook();
this.repository.save(book);
}

5、动静分离:分离关注点,静态不变的数据可以成为类的一个字段,而不应该通过参数传递

--------------------------
public void getChapters(final long bookId,
final HttpClient httpClient,
final ChapterProcessor processor) {
HttpUriRequest request = createChapterRequest(bookId);
HttpResponse response = httpClient.execute(request);
List<Chapter> chapters = toChapters(response);
processor.process(chapters);
}

改造后
--------------------------
public void getChapters(final long bookId) {
HttpUriRequest request = createChapterRequest(bookId);
HttpResponse response = this.httpClient.execute(request);
List<Chapter> chapters = toChapters(response);
this.processor.process(chapters);
}

6、for优化:内部提炼单个函数

7、else消除:尽早返回

8、swith优化:封装策略模式

9、基本类型偏执: 不应该暴露业务方更多业务代码逻辑

      改造前:String name = book.getAuthor().getName();

     改造后     String name= book.getAuthorName();  //依赖委托实现

 

标签:重构,技巧,parameters,代码,long,final,void,private,public
From: https://www.cnblogs.com/binfirechen/p/17985899

相关文章

  • Voxel R-CNN 代码解析
    1.网络主体架构以voxel_rcnn_car.yaml为例。主要包括:VFE(体素编码网络),这里采用下MeanVFE;BACKBONE_3D,这里采用VoxelBackBone8x;MAP_TO_BEV,这里采用HeightCompression,NUM_BEV_FEATURES为256;BACKBONE_2D,这里采用BaseBEVBackbone;DENSE_HEAD,这里采用AnchorHeadSingle;ROI_H......
  • cprimerplus代码相关汇总
    第一章初识C语言重点内容起源:1972,贝尔实验室。继承B语言。特点:功能强大,应用范围广泛。设计步骤:1.定义程序目标2.设计程序3.编写代码4.编译5.运行程序6.测试和调试程序7.维护和修改程序本章小结C是强大而简洁的编程语言。它之所以流行,在于自身提供大量的实用编程工具,能很好......
  • [代码随想录] 第十三天
    226.翻转二叉树[https://leetcode.cn/problems/invert-binary-tree/description/]递归:递归三部曲:①确定递归函数的参数和返回值②确定终止条件③确定单层递归的逻辑/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*T......
  • 代码随想录 day29 非递减子序列 全排列 全排列 II
    非递减子序列cpp就业还是太难了还是转java吧好歹这个对双非还友好一些尝试写java的第一天本题关键是理解非递减子序列判断条件需要额外一个数组记录当前元素是否在本树层使用过记录在这个数组就说明用过了全排列本题系统的演示了怎么写全排列和最基本的组合问题的......
  • Java抛出异常且没有被捕捉的情况下,后面的代码还能运行吗?
    Java有try-catch-finally的异常处理机制,包括以下几种情况:1、不抛出异常,try里面的代码、finally里面的代码、finally以后的代码都将正常执行,而catch里面的代码不会执行。2、抛出异常且被catch捕获,try里面的代码部分执行,catch里面的代码、finally里面的代码、finally以后的代码都将......
  • 精通 VS 调试技巧,学习与工作效率翻倍!
    ​✨✨欢迎大家来到贝蒂大讲堂✨✨​......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html简单的二分查找法,核心是认识区间的意义,注意以下几点:middle=low+(low+high)/2;这种写法可以防止溢出。注意low和high的循环条件判断,如果是左闭右闭......
  • day25 代码随想录算法训练营 216. 组合总和 III
    题目:216.组合总和III我的感悟:还是按照之前的套路来。多了一个参数path_sum应该是有两处剪枝,1处横线剪枝,1处纵向剪枝?或者说1处求和剪枝?1处范围剪枝?【疑问】理解难点:不剪枝的已经模的差不多了,剪枝的再看看 自己听了一遍写的:[未剪枝]classSolution:defcombina......
  • Git提交代码注释规范
    feat(新功能):新增代码文件:新功能相关的代码文件、模块等。更新测试文件:添加新功能的测试用例。fix(修复):修改代码文件:包含有问题代码的文件。更新测试文件:修复问题的测试用例。docs(文档):Markdown文件:更新项目文档、README、帮助文件等。注释:更新代码中的注释,提供更详......
  • html 禁止f12调试代码 debugger
    setInterval(()=>{(function(a){return(function(a){return(Function('Function(arguments[0]+"'+a+'")()'))})(a)})('bugger')('de',0,0,(0,0));},1000);js代码放到HTMLscrip标签块中即可......