我正在寻找一种重构日志的方法,如果/ else if / else语句也有一些嵌套.这些块也使用了很多常见的对象.我的目标是将代码分解为提取到不同类的可管理单元,并使其可插拔,以防我需要覆盖新的条件.
这里有一些虚拟代码来说明:
List<ValidationResult> validationResults = new ...; Inspector inspector = commonInspector; bool additionalOp = commonFlag; HashSet<Thing> thingstocheck = theThings; foreach (var thing in thingstocheck) { if (IsCandy(thing) && thing.IsWrapped && thing.IsHard) { var inspected = inspector.Inspect(thing.Value); if (inspected != thing.Value) { validationResults.Add(new ...); if (additionalOp) { thing.Taste(); } } } else if (IsChocolate(thing)) { var sweet = (Sweet)thing; List<BadCalories> badCalories; while (var calorie in sweet.Calories) { if (calorie.IsGood) continue; badCalories.Add(calorie); } foreach (var badCal in badCalories) { var inspected = inspector.Inspect(badCal.Value); if (inspected != badCal.Value) { validationResults.Add(new ...); if (additionalOp) { badCal.Taste(); } } } } else { if(thing ...) else if (thing ...) }
我阅读了一些文章/可能适用的各种模式/实践的帖子,但代码的依赖关系让我对应用概念有点复杂化.我现在对代码的关注程度有点过了一段时间没有任何帮助,因此很难从微观管理中脱颖而出.
解决方法
您可以将大范围块分解为单独的函数.
if(IsHardWrappedCandy(thing)) ValidateHardWrappedCandy(thing); else if (IsChocolateCandy(thing)) ValidateChocolateCandy(thing);
还有interitance,你可以创建糖果类和封装行为:
public abstract class CandyBase { public abstract void Validate(); } public class HardWrappedCandy : CandyBase { public override void Validate() { // TODO: Validation logic } }
然后你的代码将是:
foreach(var candy in candies) candy.Validate();
当然,你需要标准化参数等,但你明白了.
阅读“清洁代码”一书,它有很多关于如何重构的好主意. http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882