架构师应如何考虑重构

news/2024/12/23 20:56:22 标签: 重构

目录

重构的目的、时机、难点

 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  {

    @Override
    public 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.niftyadmin.cn/n/5796992.html

相关文章

SpringBoot3+Vue3开发在线考试系统

项目介绍 项目分为3种角色&#xff0c;分别为&#xff1a;超级管理员、老师、学生。超级管理员&#xff0c;负责系统的设置、角色的创建、菜单的管理、老师的管理等功能&#xff0c;也可以叫做系统管理员&#xff1b;老师角色&#xff0c;负责系统业务的管理&#xff0c;包括学…

安全算法基础(一)

安全算法是算法的分支之一&#xff0c;还的依靠大量的数学基础进行计算&#xff0c;本文参照兜哥的AI安全样本对抗&#xff0c;做一个简单的算法安全概括&#xff0c;从零学习。 最新的安全算法对于我们常规的攻击样本检测&#xff0c;效果是不理想的&#xff0c;为了探究其原…

如何正确计算显示器带宽需求

1. 对显示器的基本认识 一个显示器的参数主要有这些&#xff1a; 分辨率&#xff1a;显示器屏幕上像素点的总数&#xff0c;通常用横向像素和纵向像素的数量来表示&#xff0c;比如19201080&#xff08;即1080p&#xff09;。 刷新率&#xff1a;显示器每秒钟画面更新的次数&…

upload-labs-master第21关超详细教程

目录 环境配置解题思路利用漏洞 操作演示 环境配置 需要的东西 phpstudy-2018 链接&#xff1a; phpstudy-2018 提取码&#xff1a;0278 32 位 vc 9 和 11 运行库 链接&#xff1a; 运行库 提取码&#xff1a;0278 upload-labs-master 靶场 链接&#xff1a; upload-lasb-ma…

python多线程爬取药品信息

多线程爬取药品信息 利用多线程来获取药品信息可以实现高效的爬取&#xff0c;方便我们自己对药品的名称、价格以及功效进行了解和掌握 导入需要使用到的包 from concurrent.futures.thread import ThreadPoolExecutor from lxml import etree import requests import rando…

C++面试八股文:指针与引用的区别

引言 这也是一道C开发工程师在面试中经常被问到的题目&#xff0c;本文将从指针和引用的几方面区别和各自的常用用途展开讲解&#xff0c;助力各位在面试中大放异彩。 指针和引用的区别 1、指针是一个变量&#xff0c;储存的是一个地址&#xff0c;通过该地址可以操作内存中…

List反转的方法

1.list循环 List<String> strsnew ArrayList<>();for (int i 0; i <100 ; i) {strs.add("a"i);}List<String> fzstrsnew ArrayList<>();for (int i strs.size()-1; i >0 ; i--) {fzstrs.add(strs.get(i));}System.out.println(fzstr…

微服务详细教程之nacos和sentinel实战

前言 上一篇文章中已经介绍了java的高并发编程中的问题&#xff0c;现在主要介绍微服相关的问题&#xff0c;其中在网上面经中经常出现的几个微服问题。这也是我们工作中经常遇到的几个问题。 一.微服务有哪些好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东…