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