To naprawdę subiektywny temat. Moim zdaniem, nie ma nic zasadniczo nie tak z trzema zagnieżdżonymi podczas pętli, ale osiągasz granicę akceptowalności. Gdybyś dodał jeden lub dwa kolejne poziomy zagnieżdżania, wówczas, moim zdaniem, przekroczysz granicę tego, co rozsądnie można oczekiwać od czytelnika. Ludzki mózg może zająć się tak dużą złożonością w dowolnym momencie.
Niektórzy ludzie będą sprzeczać się z moją opinią, że nie powinno być więcej niż jeden poziom zagnieżdżania w funkcji, i że funkcje nie powinny zawierać więcej niż około 10 linii kodu. Argumentem licznika jest to, że taka polityka może skutkować bardziej fragmentarycznym, rozłącznym kodem. Moja zasada jest taka, że jeśli nie możesz wymyślić dobrej nazwy funkcji dla fragmentu kodu, to być może ten fragment kodu nie jest tak naprawdę przeznaczony jako samodzielna funkcja.
Patrząc na sposoby, w jakie można podzielić tę funkcję, istnieje kilka oczywistych opcji.
- Wyodrębnij część zewnętrzną
while
do osobnej funkcji. Ta wyodrębniona funkcja przetwarza pojedynczą linię. Łatwo nazwać i wyczyścić, aby przeczytać.
- Wyodrębnij pętlę
while
, która przeskoczy białe znaki do oddzielnej funkcji. To znowu będzie łatwe do nazwania i sprawi, że twój kod będzie łatwiejszy do odczytania. Usunąłbyś komentarz spacji, ponieważ nazwa wyodrębnionej funkcji uczyniłaby go niepotrzebnym. To chyba warto robić.
Jeśli zastosowano te pomysły następnie kod może wyglądać trochę tak:
char* skipWhitespace(char* str)
{
while (isspace(*str))
str++;
return str;
}
void parseLine(char *lineStr)
{
charPtr = strtok(lineStr, DELIMITERS);
while (charPtr != NULL)
{
charPtr = skipWhitespace(charPtr);
puts(charPtr);
charPtr = strtok(NULL, DELIMITERS);
}
}
......
while (fgets(lineStr, MAXLINELENGTH, fp) != NULL)
parseLine(lineStr);
Zauważ, że refaktoryzacji i nazewnictwo ekstrahowanych metodami sprawia komentarze trochę zbędne i usunąłem je. Inną dobrą zasadą jest to, że jeśli chcesz skomentować kod za dużo, to być może nie jest on jeszcze dobrze rozeznany.
Ostatecznie naprawdę nie ma sztywnych reguł i sprowadza się to do osądu i osobistych preferencji. Moim zdaniem kod w pytaniu jest bardzo czytelny i czytelny, ale wersja refaktoryzowana jest po prostu trochę jaśniejsza, moim zdaniem.
Nota prawna: Nie komentuję prawidłowości lub braku kodu. Po prostu zignorowałem ten aspekt.
Nie, nie ma problemu w zagnieżdżonych pętlach. – pmg
Chociaż, możesz chcieć zamknąć niektóre z nich w metody odzwierciedlające to, co robią - ten ostatni staje się 'skipSpaces()' lub niektórymi. –
jeśli dane wejściowe mogą zawierać znaki ujemne (* z wartościami większymi niż 127 *), możesz chcieć rzucić argument na 'isspace', aby uniknąć niezdefiniowanego zachowania:' isspace ((unsigned char) * charPtr) ' – pmg