programowanie w C - bardzo ogólne pytanie o filozofi
Oct 23, 2017 78 Replies
P
Piotr Gałka
W dniu 2017-10-24 o 13:42, Piotr Wyderski pisze:
Taka konstrukcja z cofaniem się w kodzie jest dla mnie trudna. Nie rozumiem czy zakładasz, że albo_jednak_zle może być true po wykonaniu bloku dobrze, czy else. Jak po else to znaczyło by, że kod //bardzo zle nie gwarantuje, że albo_jednak_zle będzie false - czyli może się zapętlić. A jak po dobrze to by znaczyło, że warunek dobrze nie jest 100% pewny.
Kiedyś dawno błędy zawsze obsługiwałem tak, że wszystkie funkcje zwracały int i każda wyższa reagowała na to, co zwraca niższa jak umiała, a jak nie to przekazywała błąd wyżej (czasem nadając mu już inny numer). Nigdy nie obsługiwałem błędów danej funkcji w niej samej.
Od jakiegoś czasu staram się używać try{throw;}catch bo nie trzeba myśleć o przekazywaniu wyżej błędów przychodzących z dołu.
Możesz mieć rację, ale nie będę używał goto, bo tak (tu tupnięcie nogą) :) P.G.
Didn't find your answer? Ask the community — no account required.
P
Piotr Wyderski
Piotrze, powody niechęci do goto były dwa:
Fatalny styl programowania ówczesnych początkujących programistów.
Niedostateczny rozwój metod translacji w zakresie analizy i optymalizacji tzw. nieredukowalnych grafów przepływu, do których powstania *może* doprowadzić goto, a konstrukcje "strukturalne" w rodzaju break i continue nie. Jestem osobiście przekonany, że o to właśnie tak naprawdę poszło, a mitologię dorobiono później. No ale lata 60. się jakiś czas temu skończyły i problemu grafów nieredukowalnych już nie ma, kompilatory robią transformacje, które się nie śniły pionierom... No ale trendy narzuca ten, kto pisze podręczniki... :-)
A jak masz kaskadowe returny? Funkcja bardziej niż z siebie nie wróci i się zaczynają piętrowe ifki do obsługi takich sytuacji. Dobrze użyte goto jest dobre, ale to konstrukcja dla ekspertów. Tylko jest różnica między zakazywaniem a rekomendowaniem nieużywania.
Pozdrawiam, Piotr
P
Piotr Gałka
W dniu 2017-10-24 o 13:52, J.F. pisze:
Nigdy nie pisałem w assemblerze tylko raz pisałem assembler :) P.G.
P
Piotr Gałka
W dniu 2017-10-24 o 14:07, Piotr Wyderski pisze:
Na szczęście throw wróci nie tylko z siebie :) i jeszcze po drodze wszystko posprząta wywołując odpowiednie destruktory. P.G.
P
Piotr Wyderski
No to jej nie używaj, to nie jest ani przymusowe, ani nawet częste. Ja się tylko sprzeciwiam wieszaniu psów na tym niezwykle użytecznym narzędziu. Kolega ujął to w charakterystyczny dla siebie sposób: "jak się umie, to można nawet pić aceton".
To jest szkic pewnego ogólnego sposobu programowania: ścieżka najbardziej prawdopodobna powinna być fizycznie najprostsza, liniowa, bo to podnosi czytelność programu. Nawet kosztem ścieżek obsługi błędów.
Potencjalnie tak, milczące założenie to niekontynuowalność ścieżki błędnej: rzucenie wyjątku, ustawienie errno, return, jak kto ma w coding standard ustalone.
No bo często nie jest. Stopniowo sobie odsiewasz możliwości na ścieżce głównej. Jeśli warunek jest fałszywy, to stan na 100% nie jest poprawny, jeśli jest prawdziwy, to *być może* jest poprawny. Trochę jak w filtrach Bluma. Goto pozwala Ci niezwielokratniać ścieżek obsługi błędu (zakładając, że taka unifikacja ma sens logiczny i rozmawiamy tylko o sprawach organizacji strukturalnej).
To działa dopóki realizujesz to konsekwentnie. Wystarczy w jednym miejscu zapomnieć i obsługa błędów zdycha. Druga sprawa to ta obsługa wyżej, to złożona sprawa. Funkcja wyższego poziomu często nie ma kontekstu do właściwego zinterpretowania błędu i popadamy w drugą skrajność: użytkownik dostaje w twarz komunikatem, że pod adresem
0x1234 znaleziono wartość 0x5678 i pomimo absolutnej poprawności przekazanych mu informacji nie ma pojęcia, co z tym zrobić. Drugi koniec spektrum wyznacza autentyczny wpis do logu o treści "Coś jebło, aborting". Trzeba znaleźć złoty środek. :-)
W tym zakresie wykazuję się pełnym ekumenizmem. :-) Rób *porządnie*, a nie skupiaj się na narzędziach do osiągnięcia tego celu.
Niestety nie Ty jeden. Pilny lot do USA z dokładnie tego powodu już ćwiczyliśmy, bo się produkcyjny system w środku nocy zatrzymał i to niestety nie w warzywniaku. :-)
Pozdrawiam, Piotr
P
Piotr Wyderski
Chyba, że na swej drodze spotka rycerza Kacz Trzy Kropy i potem Pszemol nie ma telefonu. ;-)))
Destruktory wywoła, ale liczenie, że posprząta, wymaga wulkanu optymizmu. Niestety zwykle system przejdzie ze stanu "mniej-więcej wiadomo, co się dzieje" do "kompletnie nie wiadomo, więc radośnie działajmy dalej". Mało który zawodowy programista C++ potrafi pisać kod bezpieczny ze względu na wyjątki (choć jest przekonany, że potrafi) i różne Google pozakazywały używania wyjątków w swoim kodzie.
Pozdrawiam, Piotr
J
J.F.
IMO - dzis bylby podobnie fatalny, tylko dzis od poczatku sie ich uczy w "strukturalnym jezyku", nawet jesli to (Visual) Basic.
Cos w tym jest, bo istotnie optymalizacja moze byc trudna ... ale juz IMP Fotran H bardzo dobrze optymalizowal, a na C i Pascala bylo jeszcze za wczesniej. Pascal ... tam sie chyba na optymalizatorze nie skupiano.
No, goto miedzy funkcjami nie dziala :-)
Tylko zanim czlowiek ekspertem zostanie, to trzeba cwiczenia zaliczyc, albo mlodszego programiste zaliczyc, i uslyszy sie "w tym programie jest goto, to jest zly program, prosze to poprawic" ...
J.
P
Piotr Wyderski
Starsze podręczniki o konstrukcji kompilatorów poświęcały temu spory procent swojej objętości.
Ale jeśli da się przenieść główny koszt wydajnościowy do funkcji liściowej, co jest częste, to da się ją "spłaszczyć" przy pomocy goto i względny koszt propagacji błędów znacznie spadnie.
Zazwyczaj bez rzetelnego wyjaśnienia, dlaczego program jest zły. Ja z kolei dwóch pracowników przekonałem do goto po prostu pokazując im tak napisany program. Ale to byli znakomici programiści. :-)
Pozdrawiam, Piotr
J
Janusz
W dniu 2017-10-24 o 11:58, Piotr Gałka pisze:
Ale inline nic nie zmienia, to jest tylko sposób wywołania funkcji, nadal masz zagnieżdżone pętle i potrzebę bezbolesnego wyjścia z tego bagna.
Wg mnie bzdura, rozdrabnianie funkcji a do tego dąży ta niby "zasada" także zaciemnia program.
P
Piotr Gałka
W dniu 2017-10-24 o 17:36, Janusz pisze:
Chodziło mi tylko o czytelność. Napisałem inline aby podkreślić, że da się to zrobić bez pogarszania wydajności.
Zrozumienie co robi pętla:
for(;;) { jakies dzialania if(wewn_petla())break; inne dzialania }
wydaje mi się łatwiejsze gdy między działaniami przed i po jest tylko jedna linijka a nie ileś tam wewnętrznej pętli.
Oczywiście to rzecz względna i zależy od konkretnej sytuacji. Jak tę wewnętrzną pętlę da się w jednej linijce zapisać:
to robienie z niej funkcji nie ma wielkiego sensu, ale jak ona ma z 10 linijek to już bym się zastanawiał, a przy 20 to chyba już bym się nie zastanawiał. P.G.
J
Janusz
W dniu 2017-10-24 o 20:31, Piotr Gałka pisze:
Ok.
G
Grzegorz Niemirowski
Piotr Gałka snipped-for-privacy@cutthismicromade.pl napisał(a):
Nieraz emuluje się w ten sposób w C wyjątki dostępne w C++, takie natychmiastowe wyjście z nawet mocno zagnieżdżonego kodu i przeskok do etykiety obsługującej wyjątek.
M
Mateusz Viste
Ja tam myślę że jest odwrotnie - to C++ ze swoją całą "wyjątkowością" próbuje emulować niezastąpione GOTO, bo to ostatnie z dnia na dzień przestało być modne :)
Mateusz
P
Piotr Wyderski
C++ ma goto, więc niczego emulować nie musi.
Ono jest tak samo modne, jak kolonoskopia -- czasami trzeba...
Pozdrawiam, Piotr
S
slawek
A po wuja goto? Już w latach 70-tych wiedziano że nie ma sensu używać skoków. Nota bene, w pralkach bywają dwa mikrokontrolery. Jeden do ogólnej logiki, drugi do sterowania samym silnikiem.
Ale... pralka zasilana jest z 230V AC, jest woda, może urwać rękę, obciąć palce, albo zwyczajnie zalać sąsiadów itp. przy próbach i "debugowaniu". Czy nie lepiej zacząć od czegoś bezpieczniejszego, a jednocześnie bardziej innowacyjnego niż pralka?
S
slawek
Ogólnie, w czymkolwiek to się programuje jak w czymkolwiek. Znaczy siedzi się (lub stoi lub leży lub zwisa) i programuje.
Tyle że programowanie w C++ obiektowo a w Basic ZX Spektrum to zupełnie różne światy. Trochę tak jak chodzenie po linie i chodzenie po trawie.
S
slawek
Nigdy się nie przydaje. No może poza jednym: pozwala odsiać marnych programistów i kiepskie firmy. Oczywiście mowa o C, a nie Fortranie IV.
S
slawek
Jak ktoś zna tylko pętlę for, to używa break i - gdy sprawy się komplikują - goto.
S
slawek
Przeczytałem kilka książek Stroustrupa. Raczej łatwa lektura. Raczej mądry człowiek, mądrzejszy niż różne Mateuszki. Ale może ja się nie znam.
S
slawek
Miejsce BCB5 jest w muzeum, zresztą to kiepski kompilator był. Najśmieszniejsze: błędnie generowały kod dla goto.
A sprawdza się że standardem.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.