架构师应如何考虑重构

devtools/2024/12/25 23:46:53/

目录

重构的目的、时机、难点

 1.1重构的目的

1.2何时重构

    1.2.1 添加新功能的时候对周边历史进行小型重构

   1.2.2 cide review 时

  1.2.3 有计划有目的的重构

 1.2.5 何时不该重构

1.3、重构的难点

  1.3.1 保证重构前后行为一致。

1.3.2 减少出现问题带来的影响

1.4 常见的重构场景与方式

 1.4.1 策略模式取代条件表达式


重构的目的、时机、难点

 1.1重构的目的

   ① 优化代码结构、提高可读性

   ② 提高扩展效率

   ③降低修改代码的风险

1.2何时重构

       第一次做某件事的时候只管去做,第二次做类似的事情的时候会反感,但无论如何还是可以去做,第三次再做类似的事情,你应该去重构,正如老话说的:事不过三,三则重构

    1.2.1 添加新功能的时候对周边历史进行小型重构

     ① 当差不多代码赋值粘贴了3-5遍的时候

     ② 比如方法提炼、变量提炼、优化方法参数、消除重复逻辑

     ③ 当然也要取舍,对于简单影响小的可以立即重构,如果比较复杂的有风险的可以先做几路,完成当前任务后或者另找时间重构

   1.2.2 cide review 时

    让有经验的同学把知识传递给编写代码的同学,从而给予改进的灵感(老同学对业务更加熟悉,也更了解业务的变化点有助于作出合理的设计)

  1.2.3 有计划有目的的重构

   对于中小型重构通常在需求中见缝插针进行重构就可以了,但对于大型重构难度和影响相对要大一些,所以就要做好设计,确定影响范围,这通常需要安排整块时间。

  1.2.4 出现线上问题

      发生线上问题可以暴露出一些问题,这也是改进的好时机,比如上下游系统出现故障影响到你的系统,就可以思考耦合性太强了能不能解耦。

 1.2.5 何时不该重构

     ① 重写比重构还容易(到这种程度重构的风险非常高)

     ② 隐藏在某个接口下运行稳定且极少修改的丑陋代码(难以看到收益)

1.3、重构的难点

  1.3.1 保证重构前后行为一致。

     ① 使用IDEA 重构功能进行安全重构

     ② 单元测试

     ③功能测试

     ④回归测试后

1.3.2 减少出现问题带来的影响

   ① 灰度并且 开关

   ② 监控报警快速发现问题

1.4 常见的重构场景与方式

 1.4.1 策略模式取代条件表达式

    增加策略类,用于一些更复杂的场景。

   

public class AccessChecker {public static String checkAccess(String role) {if("admin".equals(role)) {return "管理原可以访问所有功能";} else if("user".equals(role)) {return "普通用户只能访问部分功能";} else if("guest".equals(role)) {return "访客仅能浏览首页";} else {return "未知角色,请联系管理员";}}}

使用策略模式 + 工厂模式优化

// 定义策略接口
public interface AccessStrategy {String checkAccess();}// 实现策略类
public class AdminAccessStrategy implements AccessStrategy  {@Overridepublic String checkAccess() {return "管理员可以访问所有功能" } }public class UserAccessStrategy implements AccessStrategy {@Override public String checkAccess() {return "普通用户只能访问部分功能";}}// 创建工厂类
public class AccessStrategyFactory {public static AccessStrategy getStrategy(String role) {switch(role) {case "admin":return new AdminAccessStrategy();case "user":return new UserAccessStrategy();default:throw new IllegalArgumentException("Unknown role:" + role);} }
}//应用策略
public class AccessManager {public String getAccessLevel(String role) {return AccessStrategyFactory.getStrategy(role).checkAccess();}
}

或者

public  enum UserRole {ADMIN("admin", new AdminAccessStrategy()),USER("user", new UserAccessStrategy()),GUEST("guest", new GuestAccessStrategy());private final String code;private final AccessStrategy strategy;UserRole(String code, AccessStrategy strategy) {this.code =code;this.strategy = strategy;}public String getCode() {return code;}public AccessStrategy getStrategy() {return strategy;}// 惊天方法,根据code 枚举对象public static UserRole getByCode(String code) {for(UserRole role : values()) {if(role.getCode().equalsIgnoreCase(code)) {return role;}}throw new IllegalArgumentException("Unknown role code:"  +code);}}

或者Spring 的依赖注入

@Autowired
private Map<String, AccessStrategy> strategies;public AccessStrategy getStrategy(String roleCode) {return strategies.get(roleCode.toLowerCase()+"strategy"));}

 


http://www.ppmy.cn/devtools/145393.html

相关文章

React中常用的钩子

在当今&#xff0c;React的钩子写法已经逐渐成为了一种主流开发模式&#xff0c;本文将介绍几种在React中常用的钩子 useState 可以用来双向绑定&#xff0c;创建需要监听变化并且使用的数据 使用该钩子定义时&#xff0c;参数可以是一个直接定义好的变量&#xff0c;也可以是…

力扣-图论-19【算法学习day.69】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

乐乐音乐Flutter版

简介 乐乐音乐Flutter版主要是基于Flutter Desktop框架开发的音乐播放器&#xff0c;它支持lrc歌词和动感歌词(ksc歌词、krc歌词、trc歌词、zrce歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 编译环境 Flutter:ideaIU-2024.1.4 参考地址 多…

k8s创建单例redis设置密码

在 Kubernetes (k8s) 中创建一个带密码的单例 Redis 部署&#xff0c;你可以通过定义一个包含 Redis 容器、服务(Service)以及必要配置(如密码设置)的 YAML 文件来实现。以下是一个基本的示例&#xff0c;展示了如何配置这些组件。 1. 创建 Redis 部署(Deployment) 首先&#x…

vivado 覆盖ip核默认生成的xdc约束

目录 简介 默认绑定管脚的IP核 总结 简介 本文介绍了解决Vivado中PCIe IP核自动生成的只读xdc文件与用户自定义xdc文件冲突的问题。通过设置空位置约束来覆盖原有的IP核引脚分配,实现了自定义的引脚绑定。并给出了适用于AX7103开发板的具体配置实例。 默认绑定管脚的IP核 …

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1&#xff1a;打包的过程中不断提示 &#xff1a;codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决&#xff1a;打开钥匙串&#xff0c;点击证书---显示简介---信任----改为始终信任 &#xff08;记住 &#xff1a;不能只修改钥匙的显示简介的…

workman服务端开发模式-应用开发-gateway长链接端工作原理

一、长链接的工作原理 Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址&#xff0c;Gateway进程和BusinessWorker通过Register进程得到通讯地址后&#xff0c;就可以建立起连接并通讯了。而Gateway进程…

【Ubuntu】如何轻松设置80和443端口的防火墙

说到 UFW&#xff08;也就是 Uncomplicated Firewall&#xff09;&#xff0c;这可是基于 Ubuntu 的 Linux 系统里自带的安全小能手。通常情况下它是被禁用的&#xff0c;但在服务器系统上它可能会处于激活并运行的状态。这就有可能阻止我们访问像 Apache 和 Nginx 这样的服务器…