如何重构这类包含多层if-else语句的代码?
重构多层if-else的思路分享
嘿,我来帮你梳理下这段代码的重构方向~首先先拆解下原代码的核心逻辑:
- 先获取值
a - 如果用户之前登录过,就获取
b,然后根据a和b的关系选择验证a或b - 如果没登录,直接验证
a
原代码的问题在于重复调用了Validate方法,多层嵌套的if-else也会让可读性下降。下面是几种可行的重构方式:
方式1:用变量统一存储待验证值(最直观)
把要验证的值先默认设为a,再根据条件调整,最后只调用一次Validate,去掉重复代码:
var a = DoSomethingToGetA(); string valueToValidate = a; if (UserPreviouslySignedIn) { var b = DoSomethingToGetB(); // 只有当a和b相等且a不为空时,才保留验证a,否则验证b if (!(a == b && !string.IsNullOrWhiteSpace(a))) { valueToValidate = b; } } Validate(valueToValidate);
方式2:结合三元运算符简化分支
如果逻辑不算太复杂,可以用三元运算符进一步压缩分支,但要注意不要过度压缩影响可读性:
var a = DoSomethingToGetA(); string valueToValidate = a; if (UserPreviouslySignedIn) { var b = DoSomethingToGetB(); valueToValidate = (a == b && !string.IsNullOrWhiteSpace(a)) ? a : b; } Validate(valueToValidate);
这里先把b存起来,避免重复调用DoSomethingToGetB()(如果这个方法有性能开销或副作用的话很重要),然后用三元一行搞定分支判断。
方式3:提取独立方法封装逻辑(最利于维护)
如果这段验证逻辑后续可能修改,或者在多个地方用到,把它封装成单独的方法会让主代码更干净:
var a = DoSomethingToGetA(); var valueToValidate = GetValueToValidate(a, UserPreviouslySignedIn); Validate(valueToValidate); // 单独提取的方法,负责处理验证值的逻辑 private string GetValueToValidate(string baseValue, bool userWasSignedIn) { if (!userWasSignedIn) return baseValue; var comparisonValue = DoSomethingToGetB(); return (baseValue == comparisonValue && !string.IsNullOrWhiteSpace(baseValue)) ? baseValue : comparisonValue; }
这样主代码只需要关注“获取值→确定验证目标→执行验证”的流程,具体的判断逻辑都封装在方法里,后续修改逻辑只需要动这个方法就行,可读性和可维护性拉满。
总的来说,重构的核心就是减少重复代码、扁平化分支结构,让代码逻辑一眼就能看明白~
内容的提问来源于stack exchange,提问作者Noelia
相关产品推荐
相关产品推荐

