2014-08-27 62 views
-6

我是新的编码和我最近阅读关于代码重构的文章。所以我做了一个控制台应用程序来预订船上的房间。我认为在我的项目中只有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"); 

我不明白的是我的参数是两条逻辑改变。 那么当我的舱舱每次都在变化时,我怎么能为这个逻辑做一个单独的方法?

+1

你应该问这对http://codereview.stackexchange.com/ – GolfWolf 2014-08-27 08:30:03

+0

如果你的代码工作,你的问题可能是一个更好的˚F它用于[代码评论](http://codereview.stackexchange.com/)。 – nvoigt 2014-08-27 08:30:10

回答

1

您所有的迭代可以结合在一起,因此在这样一个运行中执行:

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;    
} 
+1

不错,你甚至可以减少if语句的数量,方法是反向添加到列表中并将它们分组在一起(即小于40首先添加e和h,然后小于36秒以添加d和g) – Sayse 2014-08-27 08:46:06

+0

@sayse已编辑。 .. – mg30rg 2014-08-27 09:01:41

+1

谢谢@sayse和其他人回答我认为我有一些它,我会尝试实现它现在再次感谢你 – 2014-08-27 13:59:14

0

使用参数化函数。

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

看看这段代码,应该(或可能)重构代码中最有可能有更多部分。

让我们开始提取常量。只需将每个常量字符串(如“甲板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什么的。

可能很多更可以重构使你的代码更好:)