Załóżmy, że mam pętlę w C ++ lub C #, która wygląda tak:
while( true ) {
doSomething();
if( condition() ) {
break;
}
doSomethingElse();
}
Jest to powszechnie nazywane „nieskończoną pętlą”. Jednak nie jest to technicznie nieskończone - zatrzyma się, gdy przepłynie kontrola break
.
Jaki jest termin na taką pętlę - w której znajduje się instrukcja kontroli pętli „na zawsze” i „przerwa”?
terminology
sharptooth
źródło
źródło
condition()
zawsze zwraca false? Powiedziałbym, że to nieskończona pętla z przerwami warunkowymi.break
, pętla nie jest nieskończona (kill
, ctrl-alt-del, unplug ...). Dlaczego więc zawracać sobie głowę terminologią?Odpowiedzi:
Studiując CS, ten profesor nauczył nas, że istnieją pętle sprawdzania wstępnego (
while(cond) {}
), sprawdzania końcowego (do {} while(cond);
) i sprawdzania środkowego . (Mogłem źle przetłumaczyć to na angielski, ale masz pomysł.)C i C ++ nie mają tego drugiego (ISTR Ada ma to, BICBW), więc twoja konstrukcja jest do tego używana w C i C ++.
źródło
loop ... exit when condition; ... end loop;
Pierwszy kurs CS w Stanford ( Metodologia programowania Mehrana Sahamiego ) określa to jako półtorej pętli . I niekoniecznie jest to zła praktyka programowania. Rozważ ten przykład dotyczący zbierania danych wejściowych od użytkownika (zaczerpnięty z The Art and Science of Java autorstwa Erica Robertsa , gdzie Roberts nazywa to również pętlą półtora ):
A potem to samo rozwiązano za pomocą pętli i pół pomysłu, aby uniknąć powielania kodu:
źródło
Bez oficjalnej nazwy nazwałbym ją Broken Broken Loop . Niejednoznaczność tego terminu jest zamierzona, ponieważ przerwa w środku pętli jest nieco nieczysta, prawie jak
goto
.źródło
goto
miał również ważne aplikacje, np. emulację try ... wreszcie blok w C.while(XEventGet(&ev) != NULL){ ... }
, jesteś naturalnie będzie chciał sprawdzić klucze wewnątrz pętli:if(ev.key == XK_q) break;
. Wykonanie następujących czynnościwhile(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }
:, jest brzydkie i prawdopodobnie trudniejsze do odczytania niż przerwa w środkowej pętli. Co więcej, jeśli najpierw trzeba coś zrobić z wartością, zanim będzie można to sprawdzić? Naprawdę nie zamierzasz wpychać tego wszystkiego do podstawowej obudowy pętli, prawda?Nie ma ostatecznej nazwy. Pętla nieskończona jest, moim zdaniem, właściwym terminem. Żadne pętle nie są naprawdę nieskończone, ale może to być potencjalnie nieskończone, ponieważ możliwe jest, że gałąź zawierająca przerwę nigdy nie nastąpi.
Jeśli powiesz komuś „utwórz nieskończoną pętlę i użyj przerwy dla warunku X”, a on będzie wiedział, co masz na myśli. Jeśli ktoś przegląda Twój kod i nie mówi nic więcej niż „Nie podoba mi się nieskończona pętla, którą napisałeś”, będziesz wiedział, o czym mówi (chyba że masz więcej niż jeden).
źródło
while
pętla, a sposób wykonania dowodu zakończenia jest dokładnie taki sam (znalezienie monotonicznie zmniejszającej się wartości to świetny początek).Jest to pętla „do-while” z funkcją warunkową w niewłaściwym miejscu.
źródło
break
lubcontinue
. Unikaj wartości wartowników za wszelką cenę, są one po prostu kolejnym przypadkowym stanem, który należy mentalnie śledzić, co ukrywa cel kodu.Głosowałbym na „bezwarunkową pętlę” , podobną do „bezwarunkowego skoku”. Pokazuje dokładnie, co się dzieje (kod bezwarunkowo zapętla się), bez kłamstwa (w przeciwieństwie do „nieskończonej pętli”).
źródło
if
/break
w środku jest częścią wzoru.To nieskończona pętla z warunkiem pęknięcia.
Zgodziłbym się z Ammilindem, że jeśli chcesz nadać mu specjalną nazwę, możesz nazwać to Infinite Partial Loop
źródło
W Kodzie Rosetty ten szczególny wzór jest opisany jako pętla „N plus połowa” . Chociaż nie jest to mój ulubiony termin, nie jest straszny i jest wyraźnie wzorem, który jest użyteczny dla niektórych rodzajów pętli. (Alternatywą jest zduplikowanie kodu przed warunkiem - potencjalnie trudne w prawdziwych programach - lub zwiększenie głębokości zagnieżdżania kodu po warunku przy dodaniu zmiennej warunku pętli; ani nie poprawia możliwości utrzymania ani zrozumiałości kodu Jedynym powodem odrzucenia takich konstrukcji jest to, że ktoś nalega na napisanie pętli, aby być
break
wolnym od pracy.)źródło
Nie ma standardowego terminu, ale powiedziałbym, że jest to Częściowa pętla .
Ta pętla jest używana, gdy chcesz przerwać dopiero po ostatnim uruchomieniu części pętli (tzn. Częściowym wykonaniu). Jest używany, gdy nie znajdziesz odpowiedniej sytuacji, w której możesz chcieć przerwać całą pętlę .
W takim przypadku chcesz przerwać pętlę po co najmniej
doSomething()
ostatnim uruchomieniu.źródło
Muszę się tutaj zgodzić z sbi - podoba mi się termin pętli kontroli środkowej . Ten rodzaj konstrukcji był bardziej popularny, gdy programowanie strukturalne zaczęło się pojawiać i wiele języków miało dla nich obsługę składni.
To powiedziawszy, obecnie powszechnie wiadomo, że
while
pętle są zwykle łatwiejsze do utrzymania, ponieważ łatwiej jest wnioskować o niezmiennikach i często lepiej radzą sobie z trudną pustą skrzynką.W twoim szczególnym przypadku twoja pętla jest po prostu odpowiednikiem
więc chciałbym używać tylko
break
wersji jeśli znakamidoSomething
lubdoSomethingElse
zaangażowane liczne oświadczenia i wolę nie odłożyłem je do oddzielnych funkcji jak ty.To powiedziawszy, jeśli twoja pętla jest bardziej skomplikowana niż iteracja (start, sprawdzenie, przyrost), powinieneś rozważyć przekształcenie jej w coś prostszego.
źródło
Myślę, że jeśli spróbujemy znaleźć na to określenie, może:
źródło
Nazywam to tym, czym jest, „prawdziwą pętlą podczas”.
Zobacz także, czy podczas (prawdziwej) złej praktyki programowania?
źródło
W każdym przypadku nie jest tak źle. Piszę tego rodzaju pętle za pomocą pewnego rodzaju interfejsów API. Powiedzmy na przykład, że masz obiekt pętli i musisz sprawdzić warunki w nim dość głęboko, na przykład:
Załóżmy teraz, że każda metoda getXXX może potencjalnie zwrócić wartość null. Wtedy nadal byłoby możliwe napisanie wyrażenia boolowskiego, chociaż dość skomplikowanego i nieczytelnego. A następnie musimy wykonać ponowną operację, aby uzyskać dostęp do bieżącego obiektu procedury obsługi. W takich przypadkach łatwiej mi napisać
while (true)
pętlę ze złamaniem i kontynuować.źródło