如何使这个C#代码很小或重构此代码
问题描述:
我是新的编码和我最近阅读关于代码重构的文章。所以我做了一个控制台应用程序来预订船上的房间。我认为在我的项目中只有2个部分需要重构,如下所示。 一个是if else语句。如何使这个C#代码很小或重构此代码
ship1 = new Ship("Olympic Countess");
ArrayList groupA = new ArrayList();
for (int i = 0; i < 10; i++)
{
groupA.Add(new room(5000, "A" + (i + 1)));
}
ArrayList groupB = new ArrayList();
for (int i = 0; i < 10; i++)
{
groupB.Add(new room(4000, "B" + (i + 1)));
}
ArrayList groupC = new ArrayList();
for (int i = 0; i < 30; i++)
{
groupC.Add(new room(3500, "C" + (i + 1)));
}
ArrayList groupD = new ArrayList();
for (int i = 0; i < 36; i++)
{
groupD.Add(new room(3400, "D" + (i + 1)));
}
ArrayList groupE = new ArrayList();
for (int i = 0; i < 40; i++)
{
groupE.Add(new room(3300, "E" + (i + 1)));
}
ArrayList groupF = new ArrayList();
for (int i = 0; i < 30; i++)
{
groupF.Add(new room(3400, "F" + (i + 1)));
}
ArrayList groupG = new ArrayList();
for (int i = 0; i < 36; i++)
{
groupG.Add(new room(3300, "G" + (i + 1)));
}
ArrayList groupH = new ArrayList();
for (int i = 0; i < 40; i++)
{
groupH.Add(new room(3200, "H" + (i + 1)));
}
ship1.addDeck("Balcony Suite", groupA);
ship1.addDeck("Suite", groupB);
ship1.addDeck("Deck 3 - Outside Twin", groupC);
ship1.addDeck("Deck 2 - Outside Twin", groupD);
ship1.addDeck("Deck 1 - Outside Twin", groupE);
ship1.addDeck("Deck 3 - Inside Twin", groupF);
ship1.addDeck("Deck 2 - Inside Twin", groupG);
ship1.addDeck("Deck 1 - Inside Twin", groupH);
}
,另一种是,如果else语句如下
public Reservation bookPassage(String cabinclass, Customer booker, int number)
{
ArrayList cabins;
if (cabinclass.Equals("a", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Balcony Suite");
else if (cabinclass.Equals("b", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Suite");
else if (cabinclass.Equals("c", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Deck 3 - Outside Twin");
else if (cabinclass.Equals("d", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Deck 2 - Outside Twin");
else if (cabinclass.Equals("e", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Deck 1 - Outside Twin");
else if (cabinclass.Equals("f", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Deck 3 - Inside Twin");
else if (cabinclass.Equals("g", StringComparison.OrdinalIgnoreCase))
cabins = ship1.getDeck("Deck 2 - Inside Twin");
else
cabins = ship1.getDeck("Deck 1 - Inside Twin");
我不明白的是我的参数是两条逻辑改变。 那么当我的舱舱每次都在变化时,我怎么能为这个逻辑做一个单独的方法?
答
您所有的迭代可以结合在一起,因此在这样一个运行中执行:
ArrayList groupA = new ArrayList();
ArrayList groupB = new ArrayList();
ArrayList groupC = new ArrayList();
ArrayList groupD = new ArrayList();
ArrayList groupE = new ArrayList();
ArrayList groupF = new ArrayList();
ArrayList groupG = new ArrayList();
ArrayList groupH = new ArrayList();
for (int i = 0; i < 40; i++)
{
if (i < 10)
{
groupA.Add(new room(5000, "A" + (i + 1)));
groupB.Add(new room(4000, "B" + (i + 1)));
}
if (i < 30)
{
groupF.Add(new room(3400, "F" + (i + 1)));
groupC.Add(new room(3500, "C" + (i + 1)));
}
if (i < 40)
{
groupE.Add(new room(3300, "E" + (i + 1)));
groupH.Add(new room(3200, "H" + (i + 1)));
}
if (i < 36)
{
groupD.Add(new room(3400, "D" + (i + 1)));
groupG.Add(new room(3300, "G" + (i + 1)));
}
}
ship1.addDeck("Balcony Suite", groupA);
ship1.addDeck("Suite", groupB);
ship1.addDeck("Deck 3 - Outside Twin", groupC);
ship1.addDeck("Deck 2 - Outside Twin", groupD);
ship1.addDeck("Deck 1 - Outside Twin", groupE);
ship1.addDeck("Deck 3 - Inside Twin", groupF);
ship1.addDeck("Deck 2 - Inside Twin", groupG);
ship1.addDeck("Deck 1 - Inside Twin", groupH);
和相互排斥的一群IFS可以在CSE LIK被加入:
switch (cabinclass.ToLower())
{
case "a":
cabins = ship1.getDeck("Balcony Suite");
break;
case "b":
cabins = ship1.getDeck("Suite");
break;
case "c":
cabins = ship1.getDeck("Deck 3 - Outside Twin");
break;
case "d":
cabins = ship1.getDeck("Deck 2 - Outside Twin");
break;
case "e":
cabins = ship1.getDeck("Deck 1 - Outside Twin");
break;
case "f":
cabins = ship1.getDeck("Deck 3 - Inside Twin");
break;
case "g":
cabins = ship1.getDeck("Deck 2 - Inside Twin");
break;
default:
cabins = ship1.getDeck("Deck 1 - Inside Twin");
break;
}
答
使用参数化函数。
E.g. in
ArrayList groupC = new ArrayList();
for (int i = 0; i < 30; i++)
{
groupC.Add(new room(3500, "C" + (i + 1)));
}
项目不同的是:groupC,30,3500和“C”。
使用上述项目作为参数,并为每个片段调用具有正确参数的方法。
答
看看这段代码,应该(或可能)重构代码中最有可能有更多部分。
让我们开始提取常量。只需将每个常量字符串(如“甲板1 - 内部双胞胎”)放入常量中。如果您尝试重新命名任何套牌,这将有助于您。
那么你应该坚持常见的编码习惯。 C#中的类名始终以大写字母开头(将room
重命名为Room
)。
然后你可以从
new ArrayList();
for (int i = 0; i < 30; i++)
{
groupC.Add(new room(3500, "C" + (i + 1)));
}
然后,而不是提取方法的if语句,你可以使用一个类似于提取正确的甲板,这只会删除if-then-else的Dictionary
什么的。
可能很多更可以重构使你的代码更好:)
你应该问这对http://codereview.stackexchange.com/ – GolfWolf 2014-08-27 08:30:03
如果你的代码工作,你的问题可能是一个更好的˚F它用于[代码评论](http://codereview.stackexchange.com/)。 – nvoigt 2014-08-27 08:30:10