【问题标题】:i violated D.R.Y. help me please?我违反了 D.R.Y.请帮帮我?
【发布时间】:2011-01-08 10:33:44
【问题描述】:

我正在制作 21 点模拟游戏,我想像在赌场一样发牌,

即所有玩家都发一张牌,庄家一张面朝下,玩家一张牌,庄家一张面朝上

但是看我违反了干:(如何重做??

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());
}

【问题讨论】:

  • 这样人们就不必用谷歌搜索了(我做过):D.R.Y. =“不要重复自己。”
  • 这个问题有什么意义吗...
  • “如何做得更好” ... 全轮投票有什么意义吗?
  • 把自己变成代码警察。没有其他出路。对不起。

标签: c++ refactoring dry blackjack


【解决方案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);
}

【讨论】:

  • 或者更好的是,在 C++11 中,你可以这样做 for (bool const visible : { true, false }) { addCards(); addDealerCard(visible); }
【解决方案2】:
    void BlackJack::newHand()
    {
        resetHands();

        dealToPlayers();

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

        dealToPlayers();

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多