Удалить дублированный код - с помощью действия - PullRequest
0 голосов
/ 25 сентября 2010

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

у кого-нибудь есть какие-нибудь идеи?

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>

1 Ответ

4 голосов
/ 25 сентября 2010

Взяв решение Оскара и слегка его изменив:

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 - отрегулируйте соответственно в противном случае, конечно.)

...