《重构:改善既有代码的筹划,2024年最新程序人生

守听  金牌会员 | 2024-6-21 13:22:43 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

函数对某个class的爱好高过对自己所处之 class的爱好。无数次经验里,我们看到某个函数 为了计算某值,从另一个对象那儿调用几乎半打的取值函数。
影响:数据和举动不在一处,修改不可控。
办理方案:让数据和举动在一起,通过 Extract Method(提炼函数)和Move Method(搬移函数)的方法来处理,这函数到该去的地方。
例子:参考一个优秀博主提供的例子
https://blog.csdn.net/wxr0323/article/details/7884168
优化思路

1、函数全部数据来自别的一个类
做法:将数据提炼到一个独立函数中  Move method。
2、函数部分数据来自别的一个类
做法:将“部分数据”提炼到一个函数中 Move method。
3、函数的数据来自差别类
做法:将数据分类,分别提炼各自的独立的函数,在将这些函数移到各自属于的类中。
Data Clumps(数据泥团)
=====================
数据泥团指的是经常一起出现的数据,比如每个方法的参数几乎相同,处理方式与过长参数列的处理方式相同,用_Introduce Parameter Object(引入参数对象)将参数封装成对象。_
优化思路

1、观察经常一起出现的数据;
2、通过提炼类的方法,放到属于他们的对象中;
3、用对象来取代这些数据;
4、编译测试。
eg:未优化代码
例子参考一个优秀博主提供的例子
https://blog.csdn.net/geniusxi/article/details/78581542
public class Car{
// 奔驰
public void printBenz(String brand, String model, Integer price, double power) {
printBasicInfo(brand, model, price, power);
getTax(power, price);
}
// 宝马
public void printBmw(String brand, String model, Integer price, double power) {
printBasicInfo(brand, model, price, power);
getTax(power, price);
}
// 提炼打印根本信息方法
private void printBasicInfo(String brand, String model, Integer price, double power) {
System.out.println(“品牌” + brand);
System.out.println(“型号:” + model);
System.out.println(“动力:” + power);
System.out.println(“价格:” + price);
}
// 提炼计算税费的方法
private double getTax(double power, Integer price){
double salePrice = price;
if (price > 200000) {
salePrice = price * 0.98;
}
if (power <= 1.6) {
return salePrice * 0.05;
} else {
return salePrice * 0.1;
}
}
}
优化1,2步骤
上面代码方法中,我们发现方法的参数大致相同,这时候我们可以用参数对象化来处理。
public class CarEntity {
private String brand;
private String model;
private Integer price;
private Double power;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Double getPower() {
return power;
}
public void setPower(Double power) {
this.power = power;
}
}
优化3,4步骤
// 奔驰
public void printBenz(CarEntity carEntity) {
printBasicInfo(carEntity);
// 计算税费
getTax(carEntity);
}
// 宝马
public void printBmw(CarEntity carEntity) {
printBasicInfo(carEntity);
getTax(carEntity);
}
private void printBasicInfo(CarEntity carEntity) {
System.out.println(“品牌” + carEntity.getBrand());
System.out.println(“型号:” + carEntity.getModel());
System.out.println(“动力:” + carEntity.getPower());
System.out.println(“价格:” + carEntity.getPrice());
}
// 计算税费
private double getTax(CarEntity carEntity) {
// 打折后价格
double salePrice = carEntity.getPrice();
if (carEntity.getPrice() > 200000) {
salePrice = carEntity.getPrice() * 0.98;
}
if (carEntity.getPower() <= 1.6) {
return salePrice * 0.05;
} else {
return salePrice * 0.1;
}
}
经过以上的优化,代码就更加健壮了。
Primitive Obsession(根本型别偏执)
===============================
写代码时总喜欢用根本类型来当参数,而不喜欢用对象。当要修改需求和扩展功能时,复杂度就增长了。
优化思路

1、假如你有一组应该总是被放在一起的属性或参数,可以用提炼类的方式来处理;
2、假如你在参数列中看到多个根本型数据,可以引用参数对象;
3、假如你发现自己正从array中挑选数据,可以用对象取代数组。
优化步骤1和2之前的例子说明白很多次,不再重复。
优化步骤3
用对象取代数组:你有一个数组(array),此中的元素各自代表差别的东西。就可以用对象来表示数组。
eg:
String[] row = new String[3];
row [0] = “Liverpool”;
row [1] = “15”;
//对象取代数组
Performance row = new Performance();
row.setName(“Liverpool”);
row.setWins(“15”);
Performance 对象里包含name属性和wins属性,且这两个属性被界说为private ,同时拥有get方法和set方法。
Switch Statements(switch惊悚现身)
=================================
面向对象程序的一个最明显特性就是:少用switch (或case)语句。从本质上说, switch语句的问题在于重复(duplication)。
优化思路

这种情况我们可以引用工厂 + 策略模式。用工厂把重复的switch提炼到一起构建成一个工厂类,策略模式把switch分支中执行的动作提炼成单独的类。
例子参考一个优秀博主提供的例子
https://blog.csdn.net/geniusxi/article/details/78581542
更多精彩内容,请等候后续更新。
文章也同步到了博客园:https://www.cnblogs.com/zenghw/p/9114428.html
自我先容一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己探索发展大概是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学结果低效又漫长,而且极易遇到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够资助到想自学提升又不知道该从何学起的朋侪,同时减轻各人的负担。






既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,根本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目次大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
假如你以为这些内容对你有资助,可以添加V获取:vip1024b (备注Java)

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思索。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以万万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定实用于全部人,信任经过一些面试,各人都会有这些感触。
**别的本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对各人有所资助。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎扫码参加我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思索。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以万万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定实用于全部人,信任经过一些面试,各人都会有这些感触。
**别的本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对各人有所资助。
[外链图片转存中…(img-AaPcT0ts-1712785960447)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎扫码参加我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
[外链图片转存中…(img-mTQeiTCq-1712785960447)]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表