【发布时间】:2017-12-18 10:47:42
【问题描述】:
我对编码还很陌生,我希望尽早改掉坏习惯,开始编写干净高效的代码。我正在开发一个引用 API 的控制台应用程序,并且我有一系列深度嵌套的 'if's(点深度可达 10 级!)。
commonLogic forQuote = new commonLogic();
if (countryRes == CountryDes)
{
//staying in country
try2:
//display reasons for travel
Console.WriteLine("What Best Describes Your Reason For Traveling?");
Console.WriteLine(" ");
Console.WriteLine("1. United States Resident traveling Inside the U.S.");
Console.WriteLine("2. Visiting United States For Business or Pleasure.");
Console.WriteLine("3. Immigrating to The Unites States.");
Console.WriteLine("4. Student, Faculty Member or Scholar With a J-1, F-1, H-3, M-1, or Q-1 Visa.");
Console.WriteLine(" ");
var x = Console.ReadLine();
Console.Clear();
if (x == "1")
{
//US resident
//first print
forQuote.gatherUserData();
}
else if (x == "2")
{
try3:
//visiting the US
Console.WriteLine("What Type of Coverage Do You Need?");
Console.WriteLine(" ");
Console.WriteLine("1. Medical voerage");
Console.WriteLine("2. Trip Cancellation");
var r = Console.ReadLine();
Console.WriteLine(" ");
Console.Clear();
if (r == "1")
{
//medical coverage
Console.WriteLine("What Type of Medical Coverage Do You Want?");
Console.WriteLine(" ");
Console.WriteLine("1. Scheduled benifits");
Console.WriteLine("2. Comprehensive Benifits");
var s = Console.ReadLine();
Console.WriteLine(" ");
Console.Clear();
if (s == "1")
{
//second print
forQuote.gatherUserData();
}
else if (s == "2")
{
//comprehensive benifits
//third print
forQuote.gatherUserData();
}
else
{
//first else
Console.WriteLine("Invalid Input. Please Try Again");
}
}
else if (r == "2")
{
//trip canccelation
//fourth print
forQuote.gatherUserData();
}
else
{
//secondelse
Console.WriteLine("Invalid Input. Please Try Again");
goto try3;
}
}
else if (x == "3")
{
//immigration
//fithprint
forQuote.gatherUserData();
}
else if (x == "4")
{
//students...
//sixthprint
forQuote.gatherUserData();
}
else
{
//thirdelse
Console.WriteLine("Invalid Input. Please try Again");
goto try2;
}
}
这只是ifs 这个总巢的一小部分。我已经做了很多关于清理这个问题的研究,并且很难理解/使用我找到的答案。
我在重构中遇到的最大问题是,if 之后的每个if 都直接依赖于它之前的if。
我还为每个if 所需的输入制作了一个逻辑表。如果有帮助,我会把它放在这里:
Excel table showing if paths
我非常感谢您的帮助,并且解释为什么您的答案会提高可读性和效率也会非常好。
【问题讨论】:
-
我知道你才刚刚开始,所以我不会因为使用
goto而对你大吼大叫,但是不要使用 goto -
我可以用一句话给你的最大提示是永远不要使用“goto”。该语句总是可以用某种循环替换。了解循环的“break”和“continue”关键字。此外,始终有意义地命名类和方法。 “loop.loops1”是无用且令人困惑的。
-
@maccettura 我有 goto,因此如果使用了无效输入,它会将您带回到循环的开头。我知道这是不好的做法,但我不知道更好的方法。
-
您还可以将其中一些操作分解为处理每个“菜单”的无效方法。这样,您的代码就不会一团糟,而是模块化且整洁的。
-
@RaptorJesus 如果您知道这是不好的做法,那么您应该花更多时间在教程上,然后退后一步看看其他方法来解决这个问题。永远不要做不好的事情,因为你想不出更好的方法。找到更好的方法!走下坡路就是我之前说的。将您的变量和方法命名为更具描述性的名称,将您的逻辑分解为多个部分并重新组织。让每个方法负责一件事(比如导航一个菜单)。
标签: c# if-statement nested-loops