重构方法并移除额外的局部变量(移除绑定)

Posted

技术标签:

【中文标题】重构方法并移除额外的局部变量(移除绑定)【英文标题】:Refactor method and remove extra local variable(remove binding) 【发布时间】:2022-01-22 09:59:41 【问题描述】:

我有这门课:

public class User 
    private String name;
    private int age;
    //getters setters

我有一个更新用户对象的方法:

public void foo(User user)  
    boolean needUpdate = false;
    
    if(needUpdateName(user.getName())) 
        user.setName("new name"); 
        needUpdate = true;
    
    
    if(needUpdateAge(user.getAge())) 
        user.setAge(42);
        needUpdate = true; 
    
    
    if(needUpdate) 
        userRepository.update(user);
     

这是一个简单的例子,仅作为示例。如何重构此代码并删除 needUpdate 变量?

【问题讨论】:

您可以列出“更新者”(每个都返回他们是否做了某事)并将其缩减为boolean 【参考方案1】:

如果你想删除局部变量,你会失去你所拥有的状态,所以你将不得不调用 2 次方法 needUpdateName()needUpdateAge()

public void foo(User user)  
    
    if(needUpdateName(user.getName()) || needUpdateAge(user.getAge()) ) 

       if(needUpdateName(user.getName())) 
         user.setName("new name"); 
       
       
       if(needUpdateAge(user.getAge())) 
         user.setAge(42); 
       
       userRepository.update(user);
     

另一种更优化的方法是引入 2 种新方法

boolean updateNameIfNeeded(User user, String newName) boolean updateAgeIfNeeded(User user, Integer newAge)

所以他们会是这样的

private boolean updateNameIfNeeded(User user, String newName) 
        if (needUpdateName(user.getName()))
           user.setName(newName);
           return true;
         else 
           return false;
        

年龄相同

 private boolean updateAgeIfNeeded(User user, Integer newAge) 
        if (needUpdateAge(user.getAge()))
           user.setAge(newAge);
           return true;
         else 
           return false;
        

那么你的主要方法就会变成

public void foo(User user)  

  if(updateNameIfNeeded(user, "new Name") || updateAgeIfNeeded(user, 42) ) 
      userRepository.update(user);
   

此解决方案更为理想,因为进行检查的 needUpdateNameneedUpdateAge 函数仅被调用一次!

【讨论】:

我没有投反对票,但对我来说它看起来比原始版本差。你什么也没做,只是引入了额外的复杂性(而不是笨拙的 if,我们现在有它们 and 方法,and 复杂的条件将同样增长且无法维持地变大)跨度> @AndrewTobilko 要求能够通过重构删除保持状态needUpdate 的局部变量。这就是提供的解决方案,我已经解释了利弊。 另外,如果 OP 将函数 needUpdateName 合并到 updateNameIfNeeded 中,那么最后只有一个函数仍然是 updateNameIfNeeded,这将是满足 IMO 要求的最佳解决方案

以上是关于重构方法并移除额外的局部变量(移除绑定)的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse CDT 的额外重构

为啥方法局部静态变量绑定到类而不是实例?

Java学习之理解递归

Junit设置局部变量

Python中的非局部变量

JDK10 新特性