C++ 如何简化多开关案例语句?

C++ 如何简化多开关案例语句?,c++,C++,我试图简化switch语句,这样就不会占用太多空间。 我觉得我有太多重复的代码。我不知道是否有更好的语句可以使用,或者有更好的方法来清理这段代码。我对C++也很新,所以任何提示都会有帮助。 这是我用来画模具的 void Dice::DrawDie() { switch (LastRoll) { case 1: cout << "\n ------- \n| |\n| |\n| o |\n| |\n|

我试图简化switch语句,这样就不会占用太多空间。 我觉得我有太多重复的代码。我不知道是否有更好的语句可以使用,或者有更好的方法来清理这段代码。我对C++也很新,所以任何提示都会有帮助。 这是我用来画模具的

void Dice::DrawDie()
{
    switch (LastRoll)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
    switch (LastRoll2)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
    switch (LastRoll3)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
    switch (LastRoll4)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
    switch (LastRoll5)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
}

创建一个函数
voiddrawdie(introllnum)
,并使用
DrawDie(LastRoll1)
调用它

void DrawDie(int RollNum) {
    switch (RollNum)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
}

创建一个函数
voiddrawdie(introllnum)
,并使用
DrawDie(LastRoll1)
调用它

void DrawDie(int RollNum) {
    switch (RollNum)
    {
    case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
        break;
    case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
        break;
    case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
        break;
    case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
        break;
    case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
    }
}

你有很多重复的代码。干净代码的一个好规则是(在这之后,我的同事总是说“什么?”让我重复描述)

在这种情况下,您可以通过创建一个函数,
display\u die()
来避免所有的复制粘贴,如:

std::string str_rev(std::string str) {
    std::reverse(str.begin(), str.end());
    return str;
}

void display_die(int val) {
    if(val < 1 || val > 6) { return; } // Bad value

    std::vector<std::string> first_face = {"   ", "  o", "  o", "o o", "o o", "o o"};
    std::vector<std::string> second_face = {" o ", "   ", " o ", "   ", " o ", "o o"};
    std::string lead = "\n ------- \n|       |\n|  ";
    std::string split = "  |\n|  ";
    std::string trail = "  |\n|       |\n ------- \t";

    std::cout << lead << first_face[val - 1] << split 
        << second_face[val - 1] << split
        << str_rev(first_face[val - 1]) << trail;
}
std::string str\u rev(std::string str){
反向(str.begin(),str.end());
返回str;
}
无效显示(int val){
如果(val<1 | | val>6){return;}//错误值
向量第一_面={”、“o”、“o”、“o”、“o”、“o”、“o”};
向量第二个_面={“o”,“o”,“o”,“o”,“o”,“o”};
std::string lead=“\n------\n | | \n |”;
std::string split=“|\n |”;
std::string trail=“|\n | |\n-------\t”;

std::cout你有很多重复的代码。干净代码的一个好规则是(之后我的同事总是说“什么?”让我重复描述)

在这种情况下,您可以通过创建一个函数,
display\u die()
来避免所有的复制粘贴,如:

std::string str_rev(std::string str) {
    std::reverse(str.begin(), str.end());
    return str;
}

void display_die(int val) {
    if(val < 1 || val > 6) { return; } // Bad value

    std::vector<std::string> first_face = {"   ", "  o", "  o", "o o", "o o", "o o"};
    std::vector<std::string> second_face = {" o ", "   ", " o ", "   ", " o ", "o o"};
    std::string lead = "\n ------- \n|       |\n|  ";
    std::string split = "  |\n|  ";
    std::string trail = "  |\n|       |\n ------- \t";

    std::cout << lead << first_face[val - 1] << split 
        << second_face[val - 1] << split
        << str_rev(first_face[val - 1]) << trail;
}
std::string str\u rev(std::string str){
反向(str.begin(),str.end());
返回str;
}
无效显示(int val){
如果(val<1 | | val>6){return;}//错误值
向量第一_面={”、“o”、“o”、“o”、“o”、“o”、“o”};
向量第二个_面={“o”,“o”,“o”,“o”,“o”,“o”};
std::string lead=“\n------\n | | \n |”;
std::string split=“|\n |”;
std::string trail=“|\n | |\n-------\t”;

std::cout除了一个变量
FOO

switch (FOO)
{
case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
    break;
case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
    break;
case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
    break;
case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
    break;
case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
    break;
case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
}
然后您的代码变成:

void Dice::DrawDie() {
    output(LastRoll);
    output(LastRoll2);
    output(LastRoll3);
    output(LastRoll4);
    output(LastRoll5);     
}
接下来,您可能希望将卷存储在一个容器中,那么方法很简单:

void Dice::DrawDie() {
    for (auto& roll : last_rolls) output(roll);
}

除了一个变量
FOO

switch (FOO)
{
case 1: cout << "\n ------- \n|       |\n|       |\n|   o   |\n|       |\n|       |\n ------- \t";
    break;
case 2: cout << "\n ------- \n|       |\n|    o  |\n|       |\n|  o    |\n|       |\n ------- \t";
    break;
case 3: cout << "\n ------- \n|       |\n|    o  |\n|   o   |\n|  o    |\n|       |\n ------- \t";
    break;
case 4: cout << "\n ------- \n|       |\n|  o o  |\n|       |\n|  o o  |\n|       |\n ------- \t";
    break;
case 5: cout << "\n ------- \n|       |\n|  o o  |\n|   o   |\n|  o o  |\n|       |\n ------- \t";
    break;
case 6: cout << "\n ------- \n|       |\n|  o o  |\n|  o o  |\n|  o o  |\n|       |\n ------- \t";
}
然后您的代码变成:

void Dice::DrawDie() {
    output(LastRoll);
    output(LastRoll2);
    output(LastRoll3);
    output(LastRoll4);
    output(LastRoll5);     
}
接下来,您可能希望将卷存储在一个容器中,那么方法很简单:

void Dice::DrawDie() {
    for (auto& roll : last_rolls) output(roll);
}

您可以仅将模具面存储在
std::map
和单独的字符串文字中,以提高可读性:

const std::map<int,std::array<const char*,5>> die_faces = {
    { 1, { "+---+",
           "|   |",
           "| o |",
           "|   |",
           "+---+" } },
    { 2, { "+---+",
           "|o  |",
           "|   |",
           "|  o|",
           "+---+" } },
    { 3, { "+---+",
           "|o  |",
           "| o |",
           "|  o|",
           "+---+" } },
    { 4, { "+---+",
           "|o o|",
           "|   |",
           "|o o|",
           "+---+" } },
    { 5, { "+---+",
           "|o o|",
           "| o |",
           "|o o|",
           "+---+" } },
    { 6, { "+---+",
           "|o o|",
           "|o o|",
           "|o o|",
           "+---+" } }
    };
根本不需要更多的开关


您可以将模具面存储在
std::map
和单独的字符串文字中,以提高可读性:

const std::map<int,std::array<const char*,5>> die_faces = {
    { 1, { "+---+",
           "|   |",
           "| o |",
           "|   |",
           "+---+" } },
    { 2, { "+---+",
           "|o  |",
           "|   |",
           "|  o|",
           "+---+" } },
    { 3, { "+---+",
           "|o  |",
           "| o |",
           "|  o|",
           "+---+" } },
    { 4, { "+---+",
           "|o o|",
           "|   |",
           "|o o|",
           "+---+" } },
    { 5, { "+---+",
           "|o o|",
           "| o |",
           "|o o|",
           "+---+" } },
    { 6, { "+---+",
           "|o o|",
           "|o o|",
           "|o o|",
           "+---+" } }
    };
根本不需要更多的开关


编写一个函数来绘制一个骰子,它将值作为参数。如果你重复自己的操作,一个函数或循环就能完成任务。据我所知,所有这些开关块都是相同的。只需将开关提取到一个函数中,并使用不同的LastRolls作为参数调用六次,就可以大大避免重复我建议创建一个函数,该函数以
int
作为参数,并返回一个表示卷的
std::string
,然后每次要显示卷的结果时调用该函数。编写一个函数来绘制一个骰子,并将该值作为参数。如果您重复自己,则函数或循环会失败工作完成了。据我所知,所有这些开关块都是相同的。只需将开关提取到一个函数中,并使用不同的LastRolls作为参数调用六次,就可以大大避免重复。我建议创建一个以
int
作为参数并返回
std::string
表示的函数我同意DRY的观点,但我不认为你的答案中所示的结构是好的,因为很难弄清楚它们是否正确,以及为什么
firest\u face
second\u face
的内容在n在code review中阅读代码。您的解决方案为
3
生成了与原始代码不同的布局,为
2
4
生成了错误的结果。啊,good call@t.niese,我没有注意到第一个面和最后一个面是颠倒的,我已经修复了。我不确定这比但是原创。相反,这里的目标是干净的最终单曲
std::cout
我不知道这比原创的更难看出它的正确性。
这不是很明显,因为它仍然不正确吗?对于你的代码
display\u die(2);
是一个空框,
display\u die(4)
显示两个点而不是四个点。哈。我想你是把我自己的急件和缺乏校对归因于缺乏可读性,@t.niese这是我在这里得到的急件答案。但是如果你不认为这是“干净的,”那么也许你的品味和我不一样。我个人会定义
第三个面
,并在设置时调用
str\u rev
。这将提高可读性。这些变量也可以是
静态常量
。但所有面也可以。哦,我开始自相矛盾,因为我们回到了硬编码时代什么都可以。请投赞成票!虽然我同意DRY的观点,但我不认为您的答案中所示的构造是好的,因为很难弄清楚它们是否正确,以及为什么在代码审阅中阅读代码时,
firest\u face
second\u face
的内容应该产生正确的结果。您的解决方案会产生一个错误
3的布局与原始代码不同,
的结果错误