Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return. To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
Jasně, ale best practice je třeba i max. dvě úrovně zanoření a hlavně,
čitelný kód. Pokud ho nedokážeš přečíst, nepochopíš ho. A když ho nepochopíš, tak v něm nevidíš chyby a problémy.
Tvoje řešení (C):
void funkce(int a, int b, int c) {
if((a < A_MIN)|| (a > A_MAX)||(b < B_MIN)|| (b > B_MAX)||(c < C_MIN)|| (c > C_MAX)) {
... // cast funkcionality
if(!chyba1) {
... // cast funkcionality
if(!chyba2) {
... // cast funkcionality
}
}
}
}
Čitelný a pochopitelný řešení:
#define check(podminka) if(!(podminka)) return
#define check_range(val, min, max) check((val >= min) && (val <= max))
void funkce(int a, int b, int c) {
check_range(A, A_MIN, A_MAX);
check_range(B, B_MIN, B_MAX);
check_range(C, C_MIN, C_MAX);
... // cast funkcionality
check(chyba1);
... // cast funkcionality
check(chyba2);
... // cast funkcionality
}
A nakonec kód, který fanatik do strukturovanýho programování nemá šanci přežít:
void initStruct(struct mojestruct* data) {
assert(data != NULL);
...
}
A co teprve __attribute__((noreturn)) v GCC... Ta ti taky do plánu nezapadá, že?
