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

函数对某个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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

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

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

在这里插入图片描述

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

总结

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

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

[外链图片转存中…(img-AaPcT0ts-1712785960447)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-mTQeiTCq-1712785960447)]

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值