我想知道重构代码的最佳做法是什么:
应该在哪里设置退出标准以及最佳做法是什么
private static bool Foo()
{
bool result = false;
if (DoMehod1())
{
if (DoMehod2())
{
if (DoMethod3())
{
result = true;
}
else
{
Console.WriteLine("DoMethod3 Failed");
}
}
else
{
Console.WriteLine("DoMethod2 Failed");
}
}
else
{
Console.WriteLine("DoMethod1 Failed");
}
return result;
}
由于
答案 0 :(得分:11)
该代码的最佳结构而不改变它的作用是:
private static bool Foo()
{
if (!DoMethod1())
{
Console.WriteLine("DoMethod1 Failed");
return false;
}
if (!DoMethod2())
{
Console.WriteLine("DoMethod2 Failed");
return false;
}
if (!DoMethod3())
{
Console.WriteLine("DoMethod3 Failed");
return false;
}
return true;
}
答案 1 :(得分:4)
我认为最佳做法应该是:
private static void Foo()
{
DoMehod1();
DoMehod2();
DoMehod3();
}
// ...
try
{
Foo();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
throw;
}
当你无法通过基于动词的名字保留DoMethod()
所暗示的承诺时抛出异常。
如果您绝对不想抛出异常,请使用the method suggested by mquander,并将方法重命名为TryDoMethod1
等。
如果您需要确保它们全部运行(您在原始代码中没有这样做),您可以尝试以下方法之一:
try
/ catch
内置到循环中的这些方法,并use an AggregateException
to combine them all the sub-exceptions for one final throw
。答案 2 :(得分:3)
阅读这篇关于“箭头代码”http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html的经典文章,了解如何通过尽快返回错误来“扁平化”。
“箭头代码”的“代码完成”部分位于:http://c2.com/cgi/wiki?ArrowAntiPattern
@mquander的答案是理想的。
关键是要摆脱单点退出的习惯,在代码中需要管理你的记忆,因为你需要一个地方来解除分配(类似于你的方式)可以使用finally
块)。由于.NET管理你的内存,你可以尽快离开这个方法而不用担心内存泄漏并使你的方法更具可读性。
答案 3 :(得分:1)
出了什么问题:
return (DoMethod1() && DoMethod2() && DoMethod3())
...在调用代码中完全取消Foo方法
答案 4 :(得分:0)
我认为#1目标应该是易于理解的代码。如果不了解底层功能并正确命名,很难说代码的最佳结构是什么。
没有一个适合所有人的最佳代码结构恕我直言,这完全取决于你试图用你的代码判断的故事。
答案 5 :(得分:0)
您可以在此处尝试Transaction模式。