я нарушил D.R.Y. Помоги мне, пожалуйста?

Я делаю симулятор блэкджека и хочу раздавать карты, как в казино,

т. е. всем игрокам раздается карта, дилер получает одну карту лицевой стороной вниз, игроки получают еще одну карту, дилер получает одну лицевой стороной вверх.

НО СМОТРИТЕ Я НАРУШИЛ СУХОЙ :( Как переделать??

void BlackJack::newHand()
{
    resetHands();

    for (unsigned int i = 0; i < players.size(); i++)
        players[i]->addCard(deck->nextCard());

    Card* c = deck->nextCard();
    c->setVisible(false); // dealer gets a face down card
    dealer->addCard(c);

    for (unsigned int i = 0; i < players.size(); i++)
        players[i]->addCard(deck->nextCard());

    dealer->addCard(deck->nextCard());
}

person y2k    schedule 22.01.2010    source источник
comment
Просто чтобы людям не приходилось гуглить (я сделал): D.R.Y. = Не повторяйся.   -  person Sergio Tapia    schedule 23.01.2010
comment
Есть ли смысл в этом вопросе...   -  person Yogesh Arora    schedule 23.01.2010
comment
Как это сделать лучше... есть ли смысл голосовать за всех?   -  person Georg Fritzsche    schedule 23.01.2010
comment
Превратите себя в копов кода. Нет другого выхода. Извини.   -  person Paul Nathan    schedule 23.01.2010


Ответы (1)


Переместите повторяющийся код в другую функцию:

void BlackJack::addDealerCard(bool visible) {
    Card* c = deck->nextCard();
    c->setVisible(visible); 
    dealer->addCard(c);
}

void BlackJack::addCards() {
     for (unsigned int i = 0; i < players.size(); i++)
        players[i]->addCard(deck->nextCard());
}

void BlackJack::newHand() {
    resetHands();

    addCards();    
    addDealerCard(false);

    addCards();    
    addDealerCard(true);
}
person Georg Fritzsche    schedule 22.01.2010
comment
Или еще лучше, в C++11 вы можете сделать for (bool const visible : { true, false }) { addCards(); addDealerCard(visible); } - person David Stone; 27.10.2012