Můžeš se vyjádřit k neutrálnímu kódu _negotiate(telnet_t *telnet, unsigned char telopt) https://github.com/seanmiddleditch/libtelnet/blob/master/libtelnet.c
Konkrétně jak se zlepší přehlednost rozdělením tohoto díla na cca 10 metod o 20 řádcích.
Před každým vnějším case je komentář. To je vhodné místo pro volání funkce. A když píši funkce, tak nemyslím proceduru.
Vezmu jeden switch:
/* in PROXY mode, just pass it thru and do nothing */
if (telnet->flags & TELNET_FLAG_PROXY) {
switch ((int)telnet->state) {
case TELNET_STATE_WILL:
NEGOTIATE_EVENT(telnet, TELNET_EV_WILL, telopt);
break;
case TELNET_STATE_WONT:
NEGOTIATE_EVENT(telnet, TELNET_EV_WONT, telopt);
break;
case TELNET_STATE_DO:
NEGOTIATE_EVENT(telnet, TELNET_EV_DO, telopt);
break;
case TELNET_STATE_DONT:
NEGOTIATE_EVENT(telnet, TELNET_EV_DONT, telopt);
break;
}
return;
}
Mírně ho zmodifikuji a vyčlením do funkce:
/* in PROXY mode, just pass it thru and do nothing */
if (telnet->flags & TELNET_FLAG_PROXY) {
return passThruProxy(telnet, telopt);
}
static int passThruProxy(telnet_t *telnet, unsigned char telopt);
switch ((int)telnet->state) {
case TELNET_STATE_WILL: return NEGOTIATE_EVENT(telnet, TELNET_EV_WILL, telopt);
case TELNET_STATE_WONT: return NEGOTIATE_EVENT(telnet, TELNET_EV_WONT, telopt);
case TELNET_STATE_DO: return NEGOTIATE_EVENT(telnet, TELNET_EV_DO, telopt);
case TELNET_STATE_DONT: return NEGOTIATE_EVENT(telnet, TELNET_EV_DONT, telopt);
}
}
Jak vidíš, zápis se zkrátil a čitelnost zlepšila.
Dále autor zapomíná příkazové závorky u jednořádkových ifů. To je hodně nebezpečné.
Ještě to chce rozbít vnořené switche tak, aby v každé funkci byl pouze jeden.