2010-09-25 4 views
0

У меня есть следующий код, который, очевидно, имеет некоторое дублирование. Я уверен, что это может быть удалено с помощью делегата или Action, но не может его полностью понять.Удалить дублированный код - с помощью действия

у кого есть идеи?

public void DealStartingCards() 
     { 
      for (int i = 0; i < 3; i++) 
      { 
       foreach (var player in Players) 
       { 
        if (player.Hand.FaceDownCards.Count < 3) 
        { 
         if (Deck.Count > 0) 
         player.Hand.FaceDownCards.Add(Deck.TakeTopCard()); 
        } 
       } 
      } 

      for (int i = 0; i < 3; i++) 
      { 
       foreach (var player in Players) 
       { 
        if (player.Hand.FaceUpCards.Count < 3) 
        { 
         if (Deck.Count > 0) 
         player.Hand.FaceUpCards.Add(Deck.TakeTopCard()); 
        } 
       } 
      } 

      for (int i = 0; i < 3; i++) 
      { 
       foreach (var player in Players) 
       { 
        if (player.Hand.InHandCards.Count < 3) 
        { 
         if (Deck.Count > 0) 
         player.Hand.InHandCards.Add(Deck.TakeTopCard()); 
        } 
       } 
      } 
     } 

InHandCards, FaceUpCards и FaceDownCards все типа List<Card>

+0

Почему все условия 'if' необходимы? Разве вы не начинаете с полной колоды и пустые руки для всех игроков? – Ani

+0

Да, но можно снять все карты, если игроков достаточно, поэтому нужно проверить, пуста ли колода. угадайте, что эта проверка может быть лучше помещена в объект колоды – ChrisCa

ответ

4

Принимая решение Оскара и изменить его немного:

private void DealCards(Func<Hand, List<Card>> handProjection) 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     foreach (var player in Players) 
     { 
      List<Card> cards = handProjection(player.Hand); 
      if (cards.Count < 3) 
      { 
       if (Deck.Count > 0) 
       { 
        cards.Add(Deck.TakeTopCard()); 
       } 
      } 
     } 
    } 
} 

public void DealStartingCards() 
{ 
    DealCards(hand => hand.FaceDownCards); 
    DealCards(hand => hand.FaceUpCards); 
    DealCards(hand => hand.InHandCards); 
} 

(Это предполагает, что тип player.Hand является Hand - внести соответствующие коррективы в противном случае, конечно.)

+0

Мне это нравится. Не знал, что вы можете использовать такие методы :) –

+0

Это то, чем я был. Мне просто нужно понять, что сейчас. Я был убежден, что действие было тем, что требовалось, потому что не было бы возвратной стоимости. Просто выполняйте какое-либо действие по каждой из частей руки. – ChrisCa

+0

@ Кристо: Ну, для каждой из частей руки вам нужно проверить счетчик * и * добавить к нему. Проще просто вернуть эту часть руки в виде списка. Вы * можете * делать это другими способами, но я думаю, что это самое простое. –

Смежные вопросы