我看到一段代码是使用C++写的,switch + for,如下
enum class MO { A = 0, B, C};
int test(MO m) {
switch (m) {
case MO::A:
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
if(xxxx){
return -1;
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
break;
case MO::B:
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
if(xxxx){
return -1;
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
break;
case MO::C:
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
if(xxxx){
return -1;
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
break;
default:
break;
}
return 0;
}
int main() {
test(MO::A);
return 0;
}
里面有switch,也有双层for,大概结构如上,模拟的伪代码,这样的代码 有没有什么办法优化,它的复杂度太高
导入clang-tidy检查无法通过。用什么办法优化,补充,每个for循环次数里面的内容是不相同的,另外,每个case是两个"双层for",两个“双层for”之间有return函数的语句。
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO 1
}
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO 2
}
}
这样的代码,在case A, B ,C里都有,
如果case A, B, C三个里面的TODO差异比较大的话,可以分开抽成函数,如果差异比较小,那就弄成一个
差异大:
enum class MO { A = 0, B, C};
void proc_A1() {
//TODO 1
}
void proc_A2() {
//TODO 2
}
void proc_B1() {
//TODO 1
}
void proc_B2() {
//TODO 2
}
void proc_C1() {
//TODO 1
}
void proc_C2() {
//TODO 2
}
int test(MO m) {
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
switch (m) {
case MO::A:
proc_A1();
break;
case MO::B:
proc_B1();
break;
case MO::C:
proc_C1();
break;
default:
break;
}
}
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
switch (m) {
case MO::A:
proc_A2();
break;
case MO::B:
proc_B2();
break;
case MO::C:
proc_C2();
break;
default:
break;
}
}
}
return 0;
}
int main() {
test(MO::A);
return 0;
}
差异小:
enum class MO { A = 0, B, C};
void proc_member1(int i) {
// TODO 1:
}
void proc_member2(int i) {
// TODO 2:
}
int test(MO m) {
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
proc_member1(m)
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
proc_member2(m)
}
return 0;
}
int main() {
test(MO::A);
return 0;
}
重复代码过多,尽量提取公共方法处理;同时,建议在for循环中尽量不要去调用数据库,可以采用统一查询再次组合的形式完成数据处理
这段代码里有很多重复的部分,可以通过函数封装来优化代码。如果要在同一个代码块内重复执行相同的操作,比如两次嵌套循环,可以将这两次嵌套循环抽象成一个函数。只需要调用两次该函数即可,这样就可以大大减少代码冗余。
针对这段代码,可以抽象成一个函数实现嵌套循环的功能,然后在switch语句中调用该函数。这样就可以将代码简化为一个函数的调用,减少了代码的冗余。
优化后的代码如下:
c
enum class MO { A = 0, B, C};
void loop_operation() {
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
}
int test(MO m) {
switch (m) {
case MO::A:
loop_operation();
break;
case MO::B:
loop_operation();
break;
case MO::C:
loop_operation();
break;
default:
break;
}
return 0;
}
int main() {
test(MO::A);
return 0;
}
三个case的内部都是相同的双重循环,每次都循环10次。可以把这部分提取出来作为一个独立的函数,从而减少代码重复,使代码结构更清晰。
另外,为了减少复杂度,可以考虑使用更高效的算法代替双重循环。例如,在特定的情况下,使用预处理的数据结构或利用算法的性质等,都可以提高程序的效率。
enum class MO { A = 0, B, C};
void process() {
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
for (int i = 0; i < 10; i++) {
for (int y = 0; y < 10; y++) {
//TODO
}
}
}
int test(MO m) {
switch (m) {
case MO::A:
process();
break;
case MO::B:
process();
break;
case MO::C:
process();
break;
default:
break;
}
return 0;
}
int main() {
test(MO::A);
return 0;
}
希望对你有所帮助,代码中,我们把公共代码抽取到了一个 loop 函数中,并在三个 case 语句中重复调用了该函数。这样代码变得更加简洁,容易维护。
enum class MO { A = 0, B, C};
void loop(int iterations) {
for (int i = 0; i < iterations; i++) {
for (int y = 0; y < iterations; y++) {
//TODO
}
}
}
int test(MO m) {
switch (m) {
case MO::A:
case MO::B:
case MO::C:
loop(10);
loop(10);
break;
default:
break;
}
return 0;
}
int main() {
test(MO::A);
return 0;
}