如何处理具有多个退出点的函数的函数退出?

我是一名学生,而不是一名经验丰富的程序员,前几天我正在重构我前段时间写的一段代码。 在那里,有一个代码大小相当大的函数,并具有如下结构:

if (eval) return code; ... if (different test) return another code; ... 

总共大约有6或7个返回点,其中一些返回点在分支内部有清理代码。 其中一些还响应了错误的情况,即函数不能完全处理输入而是返回错误代码的路径。

即使代码被评论,但在我眼前看起来很难以阅读。 所以我想知道是否有关于这个问题的最佳实践。

从网络上读取代码,我找到了解决这个问题的不同方法。 例如,人们会遵循这个方案:

 do { whole body of the function; while (false); clean up code if necessary; return code; 

主要是能够使用break; 不同评估中的句子(因为我们在循环中)退出循环,必要时进行清理并返回退出代码。 但是感觉和goto对我的感觉一样,他们放置的限制只会在代码中转发。

另一个与我的相似,但在函数末尾只有一个return语句,并且有一个变量来保存错误代码。

你可以使用goto

 code = firstCode; if (condition != 0) goto label; code = secondCode; if (anotherCondition != 0) goto label; label: clean_up_code_if_necessary() exit(code); // may be you should return from the function 

但根据具体情况,可能还有许多其他选择。

这里经常使用linux内核习语。 当某些内容失败时,它会在之前执行的代码之后回滚并清理。

 if(do_a()==FAIL) goto fail_a; if(do_b()==FAIL) goto fail_c; if(do_c()==FAIL) goto fail_c; /* rest of the code goes here */ /* if it's ok then set err to 0 and jump to ok */ err = 0; goto ok; // otherwise unroll what have been done fail_c: undo_c(); fail_b: undo_b(); fail_a: undo_a(); ok: return err; 

好吧,我们需要区分C和C ++,处理事物的方式在C和C ++之间是完全不同的。

在C中,我建议使用Enum来说明代码的当前状态,例如:

 enum {State1,State2,Invalid_Argument,Error} 

然后,创建一个检查所需内容的函数,然后从上面的枚举中返回一些常量作为返回值:

 int check_statement(arg1,arg2...) 

最后,在上面的function中使用开关盒:

  switch(check_statment(...)){ case state1: ... return ... case Error: ... return.. }