重构方法并移除额外的局部变量(移除绑定)
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);
此解决方案更为理想,因为进行检查的 needUpdateName
和 needUpdateAge
函数仅被调用一次!
【讨论】:
我没有投反对票,但对我来说它看起来比原始版本差。你什么也没做,只是引入了额外的复杂性(而不是笨拙的 if,我们现在有它们 and 方法,and 复杂的条件将同样增长且无法维持地变大)跨度> @AndrewTobilko 要求能够通过重构删除保持状态needUpdate
的局部变量。这就是提供的解决方案,我已经解释了利弊。
另外,如果 OP 将函数 needUpdateName
合并到 updateNameIfNeeded
中,那么最后只有一个函数仍然是 updateNameIfNeeded
,这将是满足 IMO 要求的最佳解决方案以上是关于重构方法并移除额外的局部变量(移除绑定)的主要内容,如果未能解决你的问题,请参考以下文章