rom*_*zor 6 c# design-patterns
我正在寻找一种重构日志的方法,如果/ 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 ...)
}
Run Code Online (Sandbox Code Playgroud)
我阅读了一些文章/可能适用的各种模式/实践的帖子,但代码的依赖关系让我对应用概念有点复杂化.我现在对代码的关注程度有点过了一段时间没有任何帮助,因此很难从微观管理中脱颖而出.
您可以将大范围块分解为单独的函数.
if(IsHardWrappedCandy(thing))
ValidateHardWrappedCandy(thing);
else if (IsChocolateCandy(thing))
ValidateChocolateCandy(thing);
Run Code Online (Sandbox Code Playgroud)
还有interitance,你可以创建糖果类和封装行为:
public abstract class CandyBase
{
public abstract void Validate();
}
public class HardWrappedCandy : CandyBase
{
public override void Validate()
{
// TODO: Validation logic
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的代码将是:
foreach(var candy in candies)
candy.Validate();
Run Code Online (Sandbox Code Playgroud)
当然,你需要标准化参数等,但你明白了.
阅读"清洁代码"一书,它有很多关于如何重构的好主意.http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882