Czy są jakieś rygorystyczne naukowo badania zasad stylu kodowania? [Zamknięte]

25

Czy zasada stylu kodowania - np. Zasada pojedynczego wyjścia - naprawdę jest dobra? Zawsze czy tylko czasami? Ile to naprawdę robi różnicę?

Bez względu na twoje opinie, są to oczywiście subiektywne pytania. Albo czy oni?

Czy ktoś próbował przeprowadzić obiektywne, rygorystyczne naukowo badanie zasad stylu kodowania?

Nie mogę sobie wyobrazić, jak ktoś mógłby przeprowadzić podwójnie ślepe badanie czytelności, ale być może może być możliwa podwójna ignorancja - wykorzystaj studentów, którzy nie wiedzą o zasadzie studiowanej jako przedmioty, oraz osoby niebędące programistami do zarządzania badaniem.

Steve314
źródło
5
Być może interesuje Cię ukończenie czytania kodu. Wszystko nie jest wymierne, ale wiele jest, a w tej książce znajdziesz dobry przegląd z surowymi danymi lub źródłami.
deadalnix
Zależy to również w dużej mierze od języka, niektóre zasady dotyczą określonych języków, a nie innych. Na przykład single-exit principletak naprawdę nie dotyczy C ++ z powodu RAII
Martin York,
@Loki - musiałem o tym pomyśleć i nie jestem pewien, czy się zgadzam. To prawda, że RAII jest przeznaczony w dużej mierze do radzenia sobie z wyjątkami, które są alternatywne punkty wyjścia, ale (przynajmniej dla niektórych ludzi) liczą jako alternatywnych alternatywnych punktów wyjścia - nie bardzo licząc w stosunku do jednej zasady wyjścia w sposób break, gotolub returnrobić. Pojedyncze wyjście IOW nie jest absolutne w C ++, ale to w zasadzie mój pogląd na C w większości innych języków. Ale nadal jest to istotne w nieokreślonym sensie.
Steve314,
1
@ Steve314, artykuł jest co najmniej odlegle istotny - nakreśla projekt metodologii takiego eksperymentu, co jest dość ważne ze względu na oczywisty brak właściwie zarejestrowanych dowodów eksperymentalnych w tej dziedzinie.
SK-logic

Odpowiedzi:

11

Powtarzam komentarz deadalnix: przeczytaj Kod Complete 2 . Autor (Steve McConnell) szczegółowo omawia styl kodowania i często odwołuje się do artykułów i danych.

M. Dudley
źródło
Zasadniczy i dobrze zaprezentowany przegląd profesjonalnego tworzenia oprogramowania, mam nadzieję, że pewnego dnia znajdę podobny dla zapewnienia jakości. Szczególnie pomocne były mi rozdziały dotyczące programowania defensywnego i programowania pseudokodu. Rozdział o praktykach współpracy na rzecz rozwoju wydaje się najbardziej przekonujący ze wszystkiego, co do tej pory czytałem na te tematy.
komar
Nie przeczytałem tej książki, a może powinienem, ale - w oparciu o komentarze w odpowiedziach komarów - czy te cytowane artykuły są naprawdę naukowo rygorystyczne i obiektywne? Jeśli odpowiedź brzmi „jak najwięcej”, jakie kompromisy były konieczne? Jak zasugerowałem w pytaniu, czy konieczne było zastąpienie podwójnie ślepej próby jakimś słabszym standardem?
Steve314,
@ Steve314: Nie wiem, nie sprawdziłem źródeł! Ale nie zawsze potrzebujesz dyscypliny naukowej, aby ustanowić najlepszą praktykę. Omówienie zalet i wad jest czasem wystarczające.
M. Dudley,
@emddudley - absolutnie prawda, ale nie do końca o co chodziło w tym pytaniu.
Steve314,
@ Steve314: Code Complete byłby dla Ciebie świetnym punktem wyjścia i jestem pewien, że niektóre z jego odniesień odnoszą się do naukowej analizy stylu kodowania.
M. Dudley,
12

Bardzo wątpię w samą możliwość przeprowadzenia badań na ten temat, które przyniosłyby obiektywne wyniki i pozostanę sceptyczny, dopóki nie zostaną mi pokazane przekonujące badania.

Programiści, którzy spędzili lata czytając i pisząc kod zgodny z pewnym stylem kodowania, z pewnością uznają go za bardziej czytelny niż jakiś idealny styl kodowania, który zobaczyliby po raz pierwszy w życiu.

Jest dokładnie tak samo z najpopularniejszym układem pisania QWERTY - łatwo jest udowodnić, że jest dość nieoptymalny pod względem ergonomii (czy uważasz, że wszystkie znaki słowa TYPEWRITER zostały umieszczone w górnym rzędzie, mając na uwadze naszą codzienną wygodę?) .

Ale ulepszone alternatywy, takie jak Dvorak lub Colemak, nigdy się nie przyjęły i jest mało prawdopodobne. Dlatego ludzie nie są z nimi bardziej produktywni - fakt. Nawet jeśli są lepsi w jakimś abstrakcyjnym sensie.

Ponadto trudno byłoby znaleźć osoby bez wcześniejszego kontaktu z programowaniem (ponieważ mogłoby to zaszkodzić wynikom naszego badania), ALE umiejętności programowania, ORAZ chęć uczestnictwa w badaniu przez okres wystarczająco długi, aby wykazać oba krótkie - świadczenia czasowe i świadczenia długoterminowe, aby można je było porównać ze sobą ... (Nie wiem, czy wykluczają się wzajemnie, ale badacze nie mogli po prostu założyć, że nigdy nie są).

Konrad Morawski
źródło
1
Fajnie, nigdy wcześniej nie słyszałem o Colemaku
CaffGeek
1
@Chad jeszcze mniej znany jest Carpal X, z którym bawiłem się przez chwilę. Uważam, że jest ładniejszy niż Colemak (osiągnąłem 90-100 wpm z carpalx). Nawet jeśli nie zamierzasz przełączać się na żadne egzotyczne układy, strona carpalx bardzo ciekawie zapoznaje się z oceną i optymalizacją układów klawiatury i wykorzystaniem algorytmów genetycznych dla tej kategorii problemów. Zobacz mkweb.bcgsc.ca/carpalx
Konrad Morawski
1
Czasami marginalne korzyści z alternatywnego podejścia będą wystarczająco duże, aby uzasadnić koszty jego przyjęcia; w przeciwnym razie wszyscy nadal programowalibyśmy asembler i fortran. Ta odpowiedź tak naprawdę nie odpowiada na pierwotne pytanie, czy faktycznie istnieją marginalne korzyści. W przykładzie Dvoraka z pewnością istnieją i zostało to udowodnione, ale nie są to wystarczająco duże korzyści, aby uzasadnić naukę Dvorak.
Jeremy,
@Jeremy „ta odpowiedź tak naprawdę nie odpowiada na pierwotne pytanie, czy faktycznie istnieją marginalne korzyści” - PO nie poprosił bezpośrednio o wyniki takich badań, zapytał, czy ktoś próbował przeprowadzić takie badania, które jest bardziej otwarte pytanie. Odpowiedziałem, wskazując kilka logicznych powodów, dla których byłoby to technicznie trudne i dlaczego jakiekolwiek wyniki takiego badania prawdopodobnie zostałyby znacznie zanieczyszczone szumem statystycznym. Więc jeśli moja odpowiedź została uznana za nieużyteczną z powodów, które podałeś, myślę, że zostałem potraktowany niesprawiedliwie.
Konrad Morawski
1
@Jeremy istotą tych kosztów adopcji jest to, że ludzie osiągają lepsze wyniki przy użyciu gorszego narzędzia, o ile mają z tym więcej praktyki. I to dokładnie pokazałoby się w każdym badaniu próbującym sprawdzić, jak dobrze jego podmioty radzą sobie z różnymi stylami kodowania. Hałas spowodowany ich wcześniejszą znajomością / nieznajomością stylów kodowania, których byś użył, zmniejszyłby wpływ wszelkich wrodzonych cech tych stylów. Chyba że wyrównałeś plac zabaw, przyjmując kompletnych początkujących. Stanowi to jednak praktyczną trudność, jak wskazałem w ostatnim akapicie mojej odpowiedzi.
Konrad Morawski
4

Odpowiedź jest ostateczna NIE! Czy „złam” i „kontynuuj” złe praktyki programowania? jest podzbiorem tego pytania, więc zacznę od ledwie zmodyfikowanej odpowiedzi na to ...

Możesz [ponownie] pisać programy bez instrukcji break (lub wraca ze środka pętli, które robią to samo). Ale może to wymagać wprowadzenia dodatkowych zmiennych i / lub powielania kodu, które zwykle utrudniają zrozumienie programu. Z tego powodu Pascal (język programowania z końca lat 60.) był bardzo zły, szczególnie dla początkujących programistów.

Istnieje wynik informatyki zwany hierarchią struktur kontrolnych Kosaraju, która sięga 1973 roku i jest wspomniana w (bardziej) znanym artykule Knutha Programowanie strukturalne wraz z oświadczeniami z 1974 roku. To, co S. Rao Kosaraju udowodnił w 1973 roku, to że nie jest możliwe jest przepisanie wszystkich programów z wielopoziomowymi podziałami głębokości n na programy z głębokością przerwania mniejszą niż n bez wprowadzania dodatkowych zmiennych. Powiedzmy jednak, że jest to wynik czysto teoretyczny. (Po prostu dodaj kilka dodatkowych zmiennych ?! Z pewnością możesz to zrobić, aby poczuć się w grupie z użytkownikami 3K + na stosie wymiany ...)

O wiele ważniejsze z punktu widzenia inżynierii oprogramowania jest najnowszy artykuł Erica S. Robertsa z 1995 r. Zatytułowany Loop Exits and Structured Programming: Reopening the Debate (doi: 10.1145 / 199688.199815). Roberts podsumowuje kilka badań empirycznych przeprowadzonych przez innych przed nim. Na przykład, gdy grupa studentów typu CS101 została poproszona o napisanie kodu dla funkcji realizującej wyszukiwanie sekwencyjne w tablicy, autor badania powiedział o tych studentach, którzy użyli przerwy / powrotu, aby wyjść z sekwencji pętla wyszukiwania zaraz po znalezieniu elementu:

Nie znalazłem jeszcze ani jednej osoby, która spróbowała użyć programu przy użyciu [tego stylu], która stworzyła nieprawidłowe rozwiązanie.

Roberts mówi również, że:

Uczniowie, którzy próbowali rozwiązać problem bez wyraźnego powrotu z pętli for, radzili sobie znacznie gorzej: tylko siedmiu z 42 uczniów próbujących zastosować tę strategię udało się wygenerować prawidłowe rozwiązania. Liczba ta stanowi wskaźnik sukcesu mniejszy niż 20%.

Tak, możesz być bardziej doświadczony niż studenci CS101, ale bez użycia instrukcji break (lub równoważnie return / goto ze środka pętli), w końcu napiszesz kod, który przy nominalnej ładnej strukturze jest wystarczająco włochaty pod względem dodatkowej logiki zmienne i powielanie kodu, że ktoś, prawdopodobnie ty, wprowadzi do niego błędy logiczne, próbując podążać za pewnym pomysłem „poprawnego” stylu kodowania.

Jest tu jeszcze jeden większy problem oprócz instrukcji return / break-type, więc to pytanie jest nieco szersze niż pytanie o breakach. Według niektórych mechanizmy obsługi wyjątków również naruszają paradygmat punktu wyjścia

Tak więc w zasadzie każdy, kto twierdził powyżej, że zasada jednokrotnego wyjścia jest nadal przydatna, również przeciwstawia się paradygmatowi obsługi wyjątków, chyba że zostanie zastosowany w niezwykle zawężający sposób opisany w tym ostatnim linku; wytyczne te zasadniczo ograniczają wszystkie wyjątki poza funkcję throw (), tzn. propagacja wyjątków międzyfunkcyjnych jest w ogóle niedozwolona. Ciesz się nowym Pascalem dzięki składni podobnej do C ++.

Widzę, skąd wzięło się pojęcie „tylko jeden powrót”?że powszechna opinia na tej stronie jest sprzeczna z tym, co tu zamieściłem, więc w pełni rozumiem, dlaczego zostałem już poddany głosowaniu w dół, mimo że jestem pierwszą odpowiedzią na to pytanie, o którą pytam: kilka informacji na temat rzeczywistych testów użyteczności skoncentrowanych na problemie pojedynczego wyjścia. Chyba nie powinienem pozwolić, aby wiedza przeszkadzała w uprzedzeniach, szczególnie na stronie grywalizacji. Odtąd będę trzymał się edycji Wikipedii. Doceniane są przynajmniej informacje pochodzące z dobrych źródeł, a niejasne lub niepoprawne twierdzenia, które udają, że są poparte źródłami, ostatecznie zostają zablokowane. Na tej stronie dzieje się coś wręcz przeciwnego: dominują opinie niepoparte dowodami. Spodziewam się, że moda usunie tę ostatnią część, ale przynajmniej ten koleś będzie wiedział, dlaczego straciłeś mnie na zawsze jako współpracownik.

Syczeć
źródło
Nie głosowałem za tym, ale na „Ale robiąc to, być może będziesz musiał wprowadzić dodatkowe zmienne i / lub duplikację kodu, które zazwyczaj utrudniają zrozumienie programu”. punkt, to subiektywne twierdzenie. Zgadzam się, że dodanie zmiennej lub duplikacji kodu utrudnia zrozumienie, ale zapewne dodanie goto utrudnia również zrozumienie, a także prawdopodobnie szkody wyrządzone przez duplikację można złagodzić, dzieląc zduplikowany kod na funkcję (chociaż IMO się porusza złożoność wykresu połączeń nie eliminuje go automatycznie).
Steve314,
Widziałem twój punkt widzenia na temat artykułu z 1995 roku dopiero po tym ostatnim komentarzu i zdecydowałem się głosować - interesujący punkt. Myślę, że twój głos negatywny może być bardziej, ponieważ twój post jest długi i zaczyna się od subiektywnego punktu, więc prawdopodobnie downvoter nie przeczytał wszystkiego (na początku tak samo jak ja). Zasadniczo dobrze jest wcześnie przedstawić swój prawdziwy punkt.
Steve314,
W każdym razie myślę, że wiele osób uważa wyjątki za alternatywne alternatywne punkty wyjścia - ponieważ są one przeznaczone na przypadki błędów (w pewnym sensie), tak naprawdę się nie liczą. Rozumiem jednak, że jest to trochę wrażliwe na kulturę języka. W niektórych językach „wyjątek” to coś więcej niż nazwa - wyjątkowy przypadek sukcesu jest poprawny (a IIRC Stroustrup powiedział coś takiego o C ++, podnosząc filozoficzną kwestię, czy błąd jest błędem, jeśli jest obsługiwany). Niektórzy twierdzą nawet, że wyjątki to tylko kolejny przepływ sterowania, z którego można korzystać za każdym razem, gdy zapewnia on wymagany przepływ sterowania.
Steve314,
1
@ Steve314 ” plus zapewne szkody wyrządzone przez duplikację można złagodzić, dzieląc zduplikowany kod na funkcję „ Umieszczenie poza linią i poza bezpośrednim widokiem część logiki funkcji, część, która nie ma sensu izolowana. Jeszcze trudniej zrozumieć logikę funkcji.
ciekawy
1
@curiousguy - tak, to prawda i prawdopodobnie część intencji mojego punktu „przeniesienia złożoności do wykresu połączeń”. Moja religia jest taka, że ​​każdy dokonany przez ciebie wybór jest kompromisem, więc bądź świadomy wszystkich możliwych opcji oraz ich zalet i wad, a wiedza o wspólnych łagodzeniach jest ważna, ale strzeż się na wypadek, gdyby lek był gorszy niż choroba. Z wyjątkiem oczywiście tej części kompromisu, ile czasu spędzasz (lub marnujesz) na zamieszanie.
Steve314,
1

http://dl.acm.org/citation.cfm?id=1241526

http://www.springerlink.com/content/n82qpt83n8735l7t/

http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=661092

[Wydaje się, że na twoje pytania odpowiada jedno słowo „tak”. Powiedziano mi jednak, że udzielanie krótkich odpowiedzi jest „lekceważące” dla pytania. Jeśli uważasz, że byłem lekceważący, oznacz flagę, aby moderator mógł ją usunąć.]

S.Lott
źródło
1
@ luis.espinal: W jakim kierunku? Jakie informacje zawiera tekst? Pytanie toczy się trochę. Jaką część pytania należy rozwiązać za pomocą tekstu?
S.Lott,
1
Ze względu na styl i być może w celu dostarczenia dodatkowych informacji, które mogą dostarczyć streszczenia linków (biorąc pod uwagę, że nie wiemy, czy OP jest płatnym członkiem ACM / IEEE / Springer Verlag z dostępem do pełnych artykułów i znaleźć odpowiedzi na jego pytania.) Na przykład streszczenie artykułu ACM nie wspomina o stylu kodowania. Co najwyżej mówi o potwierdzeniu twierdzenia o programie strukturalnym (który sam nie mówi o problemie z jednym lub wieloma powrotami). Mogłeś więc wyjaśnić, dlaczego ten link jest istotny.
luis.espinal
1
Trzeci artykuł (na szczęście mam dostęp do IEEE Xplore) nie wydaje się związany z tym, o co prosi OP, o ile wiem. To cudowny artykuł, który pamiętam, który drukuję w celu późniejszego poświęcenia się czytaniu. Być może mógłbyś również wyjaśnić, w jaki sposób ten artykuł pomaga OP odpowiedzieć na jego pytanie. Ogólnie rzecz biorąc, wygląda na to, że po prostu połączyłeś kilka linków. To nie jest sposób na lekceważenie (chyba że taki był twój zamiar), ale znowu nie rozumiem, jak to pomogło PO. I dlatego plakat powinien dodać tekst wzdłuż swoich linków. Więc teraz już wiesz, dlaczego to powiedziałem;)
luis.spinal
1
z ust OP Is a coding style principle - e.g. the single-exit principle - really a good thing?- daje kontekst pytaniu, które stawia, o stylach kodowania. Co więcej, styl kodowania nie jest taki sam jak metodologia programowania, w szczególności metody projektowania wysokiego poziomu, na których skupia się artykuł IEEE (wyraźnie stwierdzony przez autorów). Dlatego mówię „nie” - zakresy są zupełnie inne.
luis.espinal
1
Podejrzewam, skąd pochodzi PO. Wyraźnie określa style kodowania (nie metodologie), aw szczególności zwroty pojedyncze i wielokrotne. Musiałem sobie z tym poradzić kilka razy dzięki dobrze napisanemu, z natury oczywistemu kodowi przy użyciu wielu instrukcji return, przepisywanych do bardziej skomplikowanych wersji przy użyciu pojedynczych zwrotów (w szczególności w dużych organizacjach dużych biurokratycznych) * jako na „proces”. I zastanawia się (i kwestionuje dowody) ważność, użyteczność i opłacalność takich arbitralnych zleceń. Ludzie, którzy wymuszają takie mandaty, wciąż żyją w latach 60-tych: /
luis.spinal
1

Jest zasadą stylu kodowania - np. Zasadą pojedynczego wyjścia

Ludzie, którzy wciąż zastanawiają się, czy wybrać jedno wyjście, czy wiele wyjść, wciąż utknęli pod koniec lat sześćdziesiątych. Wówczas taka dyskusja była ważna, ponieważ byliśmy w początkowej fazie ustrukturyzowanego programisty, a obóz głosił, że ustalenia stojące za twierdzeniem o programie strukturalnym Bohm-Jacopini nie były uniwersalne dla wszystkich konstrukcji programistycznych.

Jest to coś, co powinno być uregulowane dawno temu. Cóż, zostało to ustalone (dokładnie 4 dekady, zarówno w środowisku akademickim, jak i w branży), ale ludzie (ci, którzy są absolutnie za lub przeciw) nie zwracają na to uwagi.

Co do reszty moich odpowiedzi, wszystko jest względne (czego nie ma w oprogramowaniu?):

  • naprawdę dobra rzecz?

Tak. Przez większość czasu na ogólny przypadek, z zastrzeżeniami specyficznymi dla przypadków skrajnych i konstrukcjami programistycznymi specyficznymi dla języka.

Zawsze czy tylko czasami?

Większość czasu.

Ile to naprawdę robi różnicę?

Zależy.

Czytelny kod a nieczytelny kod. Zwiększona złożoność (którą powinniśmy już wiedzieć, zwiększa prawdopodobieństwo wprowadzenia błędów) w porównaniu z prostszą złożonością (i ergo, mniejsze prawdopodobieństwo błędów.) Języki, których kompilatory nie dodają ukrytego zwrotu (powiedzmy, Pascal, Java lub C #) i te, które domyślnie int (C i C ++).

Ostatecznie jest to umiejętność doskonalona przez liczbę godzin pracy za klawiaturą. Czasami dobrze jest mieć wiele instrukcji return, takich jak tutaj (w niektórych pseudokodach Pascala):

function foo() : someType
  begin
  if( test1 == true )
  then
    return x;
  end
  doSomethignElseThatShouldnHappenIfTest1IsTrue();
  return somethingElse();
end;

Cel jest jasny, a algorytm jest wystarczająco mały i na tyle nieskomplikowany, że nie gwarantuje stworzenia zmiennej „flagowej”, która przechowuje ewentualną wartość zwrotną używaną w jednym punkcie zwrotnym. Algorytm może być błędny, ale jego struktura jest na tyle prosta, że ​​wysiłek w wykryciu błędu jest (najprawdopodobniej) znikomy.

Czasami tak nie jest (tutaj przy użyciu pseudokodu C):

switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
   doSomething(); // no return statement yet
}

W tym przypadku algorytm nie ma prostej struktury, a instrukcja switch (w stylu C) pozwala na kroki przejściowe, które mogą, ale nie muszą być celowo wykonywane jako część algorytmu.

Być może algorytm jest poprawny, ale źle napisany.

A może przez siły zewnętrzne przekraczające możliwości programisty jest to rzeczywista (i poprawna) reprezentacja prawnie potrzebnego algorytmu.

Może to źle

Odkrywanie prawdy w tym wszystkim wymaga znacznie więcej wysiłku niż w poprzednim przykładzie. I tu leży coś, w co mocno wierzę (pamiętajcie, że nie mam formalnych badań, które mogłyby to poprzeć):

Zakładając poprawny fragment kodu:

  1. Wiele instrukcji return zwiększa czytelność i prostotę takiego fragmentu kodu, jeśli fragment ten reprezentuje prosty algorytm o z natury prostej strukturze przepływu. Mówiąc prościej, nie mam na myśli małych, ale rozumiem z natury zrozumiałe lub samo-dowody , które nie wymagają nieproporcjonalnego wysiłku w czytaniu (ani nie nakłaniają ludzi do wymiotowania, przeklinania czyjejś matki lub połykania kuli, gdy muszą ją przeczytać. )

  2. Pojedyncza instrukcja return zwiększa czytelność i prostotę takiego fragmentu kodu, jeśli wartość zwracana jest albo obliczana podczas wykonywania algorytmu, albo jeśli kroki w algorytmie odpowiedzialnym za obliczenie można zgrupować w jednym miejscu w strukturze algorytmu .

  3. Pojedyncza instrukcja return zmniejsza czytelność i prostotę takiego fragmentu kodu, jeśli wymaga przypisania do jednej lub więcej zmiennych flag, przy czym lokalizacje takich przypisań nie są jednolicie rozmieszczone w całym algorytmie.

  4. Wiele instrukcji return zmniejsza czytelność i prostotę takiego fragmentu kodu, jeśli instrukcje return nie są równomiernie rozmieszczone w algorytmie i jeśli wyznaczają wzajemnie wykluczające się bloki kodu, które nie są jednorodne pod względem wielkości lub struktury między sobą.

Jest to ściśle związane ze złożonością fragmentu kodu, o którym mowa. A to z kolei wiąże się z miarami złożoności cyklicznej i halsteadowej. Na tej podstawie można zaobserwować:

Im większy rozmiar podprogramu lub funkcji, tym większa i bardziej złożona jest jej struktura przepływu kontroli wewnętrznej, a tym większe prawdopodobieństwo, że staniesz przed pytaniem, czy użyć instrukcji wielokrotnego, czy pojedynczego zwrotu.

Wniosek z tego jest następujący: utrzymuj małe funkcje, robiąc jedną rzecz i tylko jedną rzecz (i robiąc to dobrze). Jeśli wykażą nominalnie małe wskaźniki złożoności cyklicznej i półstrzałowej, to nie tylko będą prawdopodobnie najprawdopodobniej poprawne i będą realizacją zrozumiałych zadań, ich wewnętrzne struktury również będą stosunkowo oczywiste.

Wtedy, i tylko wtedy możesz dość łatwo i nie tracąc dużo snu, możesz zdecydować, czy użyć pojedynczego zwrotu i wielu zwrotów bez większego ryzyka wprowadzenia błędów przy którymkolwiek z tych wyborów.

Można również spojrzeć na to wszystko i zasugerować, że gdy ludzie zmagają się z problemem pojedynczych zwrotów lub wielokrotnych zwrotów, dzieje się tak dlatego, że - albo z powodu braku doświadczenia, głupoty, albo braku etyki pracy - nie piszą czystego kodu i mają tendencję do pisania potworne funkcje z całkowitym lekceważeniem miar cyklicznych i halsztowych.

luis.espinal
źródło
1
Typ zwracany w C ++ nie jest domyślnie ustawiony na int: nie ma domyślnego typu zwracanego, więc należy go podać we wszystkich przypadkach.
Sjoerd,
Przedtem napisałem to pytanie - programmers.stackexchange.com/questions/58237/… . Zasadniczo opowiadam się za świadomością tej zasady, ale nie ściśle ją przestrzegam - jeśli wszystkie punkty wyjścia są oczywiste, jestem szczęśliwy. Chodzi mi o to - tylko dlatego, że wymienię zasadę jako przykład, nie oznacza, że ​​jestem zwolennikiem tej zasady, a na pewno nie w jej ścisłej formie. Moje subiektywne zdanie jest jednak takie - może jest mocniejszy argument za moim zdaniem, a może mocny argument, że się mylę.
Steve314,
O czym jest „default to int”?
ciekawy
Mam na myśli, i powinienem to zakwalifikować, że większość kompilatorów po prostu „potwierdzi” wartość rejestru akumulatorów jako wartość zwracaną, jeśli kod zawiera gałąź wykonawczą bez wyraźnej wartości zwracanej. To w efekcie oznacza zwrócenie wyniku ostatniej operacji arytmetycznej (cokolwiek to może być śmieci) w postaci int. I to na pewno byłyby śmieci (i ergo, niezdefiniowane zachowanie) niezależnie od tego, co funkcja zamierzała przede wszystkim zrobić. C i C ++ mogą cię ostrzec, ale kompilacje pozwolą ci dokonać kompilacji, chyba że użyjesz opcji -Werror lub czegoś podobnego.
luis.espinal