【发布时间】:2013-06-27 09:24:23
【问题描述】:
我有这些很长的 if - else/switch 语句,真的很长,而且它们使代码难以阅读。所以只是想知道有没有办法摆脱它们?也许像为每个条件使用一个类,然后使用责任链模式?
你会建议什么样的方法?
这是一个示例代码:
if ( cc == LIB_DEFINED_CONSTANT_1 )
{
response = "-1";
errorWindow->setText ( "The operation timed out.\nPlease try again later." );
errorWindow->show ( );
}
else if ( cc == LIB_DEFINED_CONSTANT_2 )
{
response = "-1";
errorWindow->setText ( "Couldn't conect to the server.\nPlease try again later." );
errorWindow->show ( );
}
else if ( cc == LIB_DEFINED_CONSTANT_3 )
{
response = "-1";
errorWindow->setText ( "Access is denied.\nPlease contact our support team." );
errorWindow->show ( );
}
else if ( cc == LIB_DEFINED_CONSTANT_4 )
{
response = "-1";
errorWindow->setText ( "Credentials and varified\nPlease contact our support team." );
errorWindow->show ( );
}
else if ....
如您所见,条件标签中的大部分代码都有些类似,除了为errorWindow设置文本。
编辑: 如果人们可以就他们投反对票的原因发表评论,那就太好了。
【问题讨论】:
-
这取决于他们解决什么问题,但可能是可以通过数组、地图或状态机解决的问题。
-
谁知道......没有看到代码,或者至少没有更全面的解释来说明正在测试的条件是什么以及每个受控块中正在执行什么代码。
-
没有代码,我不知道。在你的问题中放一个最小的样本,比如你的 2 或 3 个条件。如果没有更多上下文,您将不会得到太多答案。
-
在你的例子中,你复制了 everything 除了字符串的内容。从消除重复开始,即分解出与单个位置完全相同的行。您将看到一个错误代码和字符串描述表,您将能够解决那个特定问题。
-
我认为这个问题最好放在codereview.stackexchange.com ,因为代码正在以它应该的方式工作(据我从你的问题中可以看出),并且你正在寻求建议进行改进。我认为@DanielDaranas 给出了迄今为止最有用的提示:将错误代码存储在一个数组中(最好是
std::vector),并将相应的错误消息存储在另一个数组中(std::vector<std::string>),或者创建一个包含错误代码的struct和消息,并将它们全部放入一个数组中。细节留给读者作为练习;)
标签: c++ oop design-patterns