【问题标题】: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

标签: java methods refactoring


【解决方案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 要求的最佳解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多