c++ - 代码风格:在 switch/if 语句的分支中重用控制表达式或控制变量
问题描述
最近,我发现了一段看起来像这样的代码。
switch(type)
{
case TYPE1:
doSomething1(type, arg1);
break;
case TYPE2:
doSomething2(type, arg1, arg2);
break;
}
为什么不直接传递那些枚举(TYPE1,TYPE2)而不是传递类型变量?就像下面的例子一样。
switch(type)
{
case TYPE1:
doSomething1(TYPE1, arg1);
break;
case TYPE2:
doSomething2(TYPE2, arg1, arg2);
break;
}
我知道当变量被重用时,这样的重复是可以的:
- switch 语句的默认情况
- 多个合并案例,例如
开关(类型) { 案例类型1: 案例类型2: 案例类型3: 一些函数(类型,arg1,arg2); 休息; }
但在第一个例子中,它似乎没用。
你怎么看?这种约定有什么好处吗?
解决方案
在可维护性方面,第一个片段优于第二个片段。想象一下,您想要更改分支条件,例如 invertTYPE1
和TYPE2
: 对于第一个片段,您有两个编辑,而第二个片段有四个。
关于您对传递标志可能“无用”的解释:从您展示的示例中无法判断从不同分支调用的函数是否确实需要枚举标志。如果他们不这样做,从函数签名中删除枚举是安全的。但是有这样的失败
switch (type) {
case TYPE1:
case TYPE2:
doSomething(type /*, ... */);
}
表明将有另一个分支doSomething
取决于type
,这可能是不必要的代码重复和/或违反关注点分离。
推荐阅读
- python - 在 python selenium 中搜索内部元素似乎不起作用
- prolog - 变量 = 术语复合序言
- android - 避免从 JSON 数组响应中删除重复值
- javascript - 刷新时可能html页面状态中的元素没有改变?
- elasticsearch - Elasticsearch 嵌套布尔查询
- unit-testing - 白盒测试 - 基础覆盖率
- python - 对于新的 linux 用户,在 python 中获取登录名的简单方法是什么?
- javascript - 反应 | 功能组件抛出错误 useState Object(...) is not a function
- sql - 我有两个查询要优化,它们在生产中运行很长时间。我已经使用了表中存在的所有可能的索引。有什么建议么?
- linux - 无法在 Linux Mint 中安装 Jmeter 插件管理器