zanořování do funkcí, abstrakce, fasády se v C tolik nenosí, ten kód bývá zpravidla dlouhá nudle nějakých blocků kódu. Z velké části za to může zvyk lidí, kteří to dělají. Má to i technické důvody, ten boilerplate nic funkčního nepřináší, musí se čas od času refactorovat a to výrazně snižuje dlouhodobou udržovatelnost a změny pomoci patchů.
Podívejte se třeba na takové zpracování argument nástroje ls z coreutils, https://github.com/coreutils/coreutils/blob/master/src/ls.c#L1912-L2484, sice se používá switch, ale 500 řádků jak nic.
Na první pohled to vypadá jako pěkný nepořádek, za mě je ale naprosto zásadní, že ten kód má stejnou strukturu jako 30 let stará verze stejné funkce https://github.com/coreutils/coreutils/blob/2ba9e70e52ca41cd46e5177bdc9ee5cae51a0cb5/src/ls.c#L621-L900, pořád jsem schopný jí porovnat, pořád jsem schopný aplikovat některé původní patche. Velice rychle jsem schopný očima porovnat zpracování těch argumentů.
Kdyby to celé bylo abstrahované do jednotlivých funkci, byly použity generátory na zpracování argumentů, už bych zpětně to nemusel dát vůbec dohromady, porovnat či migrovat, bylo by to roztrhané po mnoha místech.
Tohle je třeba věc, kterou Clean code vůbec neřeší.