Czemu używanie break jest złe?

Czemu używanie break jest złe?

Wątek przeniesiony 2022-07-22 11:04 z Edukacja przez cerrato.

AO
  • Rejestracja:około 3 lata
  • Ostatnio:3 miesiące
  • Postów:36
0

Cześć.
Jakiś czas temu wykładowca z Algorytmów i struktur danych powiedział, że szanujący się programista nie użyje w pętli przerwania break. Stwierdził, że zawsze da się napisać kod tak, żeby obyło się bez breaka. Jestem w stanie w to uwierzyć, ale ciekawi mnie czemu taka niechęć i czy wy - doświadczeni programiści, słyszeliście coś na ten temat? Jest to jakaś niepisana zasada programistów?

Dodam, że facet jest w podeszłym wieku, ale wydawało się, że naprawdę zna się na rzeczy.

edytowany 1x, ostatnio: AlanOGLL
ledi12
  • Rejestracja:ponad 5 lat
  • Ostatnio:26 dni
  • Lokalizacja:Wrocław
64

Wszystko zależy od kontekstu problemu. Gadanie, że break jest zawsze złe to zwyczajna bzdura.


Robię http response status cody w martwych ciągach
SL
  • Rejestracja:około 7 lat
  • Ostatnio:13 minut
  • Postów:878
15

Niestety to kłamstwo bardzo często powtarzane przez wykładowców, bo jedyne doświadczenie jakie mają to studia i książki.

Pomył wziął się stąd, że kiedyś nadużywano goto. Pojawił się ruch całkowicie przeciwstawny ruch (https://en.wikipedia.org/wiki/Structured_programming), który można skrócić do jeden return na końcu funkcji i tyle. Samo goto jest złe, ale takie przeciwieństwo również, bo czytelność na tym cierpi. Zamiast prostego return/break musimy wprowadzać sterujące zmienne bool (a im mniej zmiennych tym lepiej) a zamiast płaskich wcięć mamy drabinki ifów, które czasami są gorsze do rozkodowania niż demonizowane goto.

Już nie mówiąc, że taki styl kodowania czasami odbija się na wydajności np. model przenoszenia wartości w C++ za bardzo nie lubi jak się często przypisuje wartości do zmiennych zamiast je np. zwracać.
Poczytaj co o tym myślą niedoświadczeni programiści, którzy piszą kompilatory https://llvm.org/docs/CodingStandards.html#use-early-exits-and-continue-to-simplify-code

AO
Dzięki za sensowną odpowiedź
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
  • Postów:8769
9

Stwierdził, że zawsze da się napisać kod tak, żeby obyło się bez breaka

Tak samo jak da się napisać aplikację w assemblerze albo w czystym WinAPI, ale pytanie - po co?
Nie uważam, żeby korzystanie z break było czymś złym.
Ważna jest inna kwestia - na ile osoba, która to robi, wie co robi oraz czy ma to wpływ na czytelność kodu.

Poszerzając ten ostatni argument - wydaje mi się, że w kwestii czytelności kodu, nawet takie siłowe unikanie break może mieć negatywny wpływ na czytelność. W sensie - zamiast prostej pętli i jej przerwania gdy trzeba, to (żeby zadowolić wykładowcę) zacznie się stosować jakieś dziwne wynalazki, ekwilibrystykę albo jakąś ifologię, żeby tylko na siłę nie wrzucić break. Znaczy - zamiast wstawić break tam, gdzie rozwiąże on problem, to będziesz pół godziny kombinować jak to zrobić inaczej i zamiast tych 5 liter napiszesz 10 linii, których jedynym sensownym efektem będzie zaciemnienie obrazu i nadmierne skomplikowanie.

Fajnie, jakbyś poprosił tego wykładowcę o kilka przykładów. Albo - sam daj mu parę konstrukcji, gdzie jeden prosty break załatwia sprawię i poproś o pokazanie, jak to przerobić. I się okaże, czy koleś jest cwaniakiem-teoretykiem, czy rzeczywiście osiągnął wyższy poziom oświecenia, a rozwiązanie jakie zaproponuje spowoduje, że nam wszystkim opadną szczęki do samej ziemi ;)


edytowany 1x, ostatnio: cerrato
several
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 2 godziny
3

Dobrze dla Ciebie autorze, że jednak nie wierzysz we wszystko co się do Ciebie mówi i jednak czujesz potrzebę sprawdzenia pewnych rzeczy. Tak jak koledzy wcześniej napisali, wykładowcy często żyją w swoim abstrakcyjnym świecie z wymyślonymi problemami na które dzielnie wymyślają rozwiązania, które nikomu nie są potrzebne. Najlepiej jeszcze zrobić z tego publikację w dzienniku akademickim, którego nikt nie czyta. break i continue to narzędzia do rozwiązywania pewnych problemów a nie kłopot, z którym trzeba się uporać.


LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
1

W pętli wydaje mi się, że break jest bardziej czytelne od robienia zmiennych sterujących, chociaż myślę, że to zależy od konkretnego przykładu. Dopiero wtedy można by rozpatrywać czytelność. Ale generalnie myślę, że to zależy od konkretnej sytuacji.

Jeszcze od kontekstu zależy - w switch/case naturalne jest wychodzenie break albo return, ale to nie pętla.

I od języka programowania, ale zakładam, że mówimy o językach ze składnią inspirowaną C. Chociaż... break nawet i w Pythonie jest, więc to chyba bardziej uniwersalny konstrukt.

AlanOGLL napisał(a):

szanujący się programista nie użyje w pętli przerwania break.

Stwierdzenie pachnące fanatyzmem. Nieważne, czy break jest "dobry" czy "zły", to co to za stwierdzenie w ogóle?

https://xkcd.com/378/

xD

Stwierdził, że zawsze da się napisać kod tak, żeby obyło się bez breaka.

Idąc tą logiką - zawsze da się napisać kod tak, żeby nie używać pętli for, bo zawsze da się ją emulować za pomocą while. Czy pętla for jest zła?


edytowany 2x, ostatnio: LukeJL
KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:11 miesięcy
  • Lokalizacja:Kraków
  • Postów:10
0

Jestem zdania, że należy z dużą dozą ostrożności podchodzić do tego, jak ktoś twierdzi, że czegoś "nigdy" nie należy stosować lub "zawsze" należy stosować. W pracy też się spotykam z takimi sytuacjami, jak np. ktoś twierdzi "nigdy nie używać singletona, bo to antywzorzec", więc tu nie wylewałbym wiadra pomyj na wykładowców, bo i na uczelni, i w pracy, i w innych miejscach można spotkać ludzi ze swoimi odchyłami.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1
AlanOGLL napisał(a):

Jakiś czas temu wykładowca z Algorytmów i struktur danych powiedział, że szanujący się programista nie użyje w pętli przerwania break. Stwierdził, że zawsze da się napisać kod tak, żeby obyło się bez breaka.

No da się napisać.

Mógłbyś wziać dowolny element każdego języka programowania, i powiedzieć "da się napisać program nie używając feature'a x". Mógłbyś napisać program bez klas, polimorfizmu, tablic, etc. Więc argument że "się da", nic sam w sobie nie znaczy.

Co do samego pytania, żeby nie użyć break w pętli, a nie chcesz wykonać operacji na większej ilości elementów, to musiałbyś użyć innego sposobu ograniczenia iteracji, co albo się sprowadza do ifowania, albo nie używania w ogóle pętli, tylko np rekurencji albo skoków, albo jeszcze innego poziomu abstrakcji na kolekcje.

Nie widzę nic złego w break, continue ani innych control-statementsach.

edytowany 1x, ostatnio: Riddle
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Lokalizacja:Wrocław
3

Czasami może się przydać, ale ja to nawet nie pamiętam, kiedy pętli ostatnio używałem, a co dopiero break.

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

Niby chodzi o to, że jak przerywasz pętlę, to kod jest mniej czytelny. Podobnie jak masz więcej niż jeden return w metodzie. Jeżeli ten kawałek kodu ma kilkaset linii, to faktycznie tak jest. Tylko pisanie takich tasiemców jest większym złem niż ten break, czy inny return.

Swoją drogą, zastanawiam się jak ten szanujący się programista rozwiązałby np. problem typu "pobierz plik z internetu, jak się nie uda, to zaczekaj 5 sekund i spróbuj jeszcze raz, jeżeli nie uda się n razy, to daj sobie spokój".

Ale może ja mam błędne podejście, bo programowaniem zarabiam na życie, więc szanowanie się jest luksusem, na który mnie nie stać.

@somekind: Nie używasz pętli w znaczeniu for, while, do while, czy w znaczeniu "nie wykonuję wielokrotnie tego samego ciągu instrukcji" (czyli nie używasz wszelkiej maści forEach i innych takich)?

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
4
Kanciarzek napisał(a):

Jestem zdania, że należy z dużą dozą ostrożności podchodzić do tego, jak ktoś twierdzi, że czegoś "nigdy" nie należy stosować lub "zawsze" należy stosować. W pracy też się spotykam z takimi sytuacjami, jak np. ktoś twierdzi "nigdy nie używać singletona, bo to antywzorzec", więc tu nie wylewałbym wiadra pomyj na wykładowców, bo i na uczelni, i w pracy, i w innych miejscach można spotkać ludzi ze swoimi odchyłami.

Z tymi antywzorcami to trzeba rozróżnić dyskurs od praktyki.

Pewne rzeczy należy publicznie krytykować, bo są niepotrzebne, nadużywane i generujące problemy. Inni programiści niekoniecznie mogą sobie zdawać z tego sprawę, że "X considered harmful". I będą je wciskać wszędzie.

Co nie znaczy, że tego X nie można użyć, jeśli rozwiązuje to jakiś problem albo jeśli wiemy, jaki jest koszt użycia i zaciągamy świadomie koszt technologiczny. Pytanie jednak, czy używamy X świadomi jego wad.

Podobnie jak masz więcej niż jeden return w metodzie.

Zdania są podzielone. Ja jednak jestem zwolennikiem early return. Bo to się lepiej czyta i kod jest bardziej liniowy, nie trzeba robić dodatkowego zagnieżdżenia kodu.


edytowany 1x, ostatnio: LukeJL
KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:11 miesięcy
  • Lokalizacja:Kraków
  • Postów:10
1
LukeJL napisał(a):

Z tymi antywzorcami to trzeba rozróżnić dyskurs od praktyki.

Pewne rzeczy należy publicznie krytykować, bo są niepotrzebne, nadużywane i generujące problemy. Inni programiści niekoniecznie mogą sobie zdawać z tego sprawę, że "X considered harmful". I będą je wciskać wszędzie.

Co nie znaczy, że tego X nie można użyć, jeśli rozwiązuje to jakiś problem albo jeśli wiemy, jaki jest koszt użycia i zaciągamy świadomie koszt technologiczny. Pytanie jednak, czy używamy X świadomi jego wad.

Ale czym innym jest krytykować i wskazywać jakie dana rzecz może sprawiać problemy, a czym innym jest tworzyć prawa w postaci "Nigdy nie należy używać X". Tak, jak napisałeś, może zaistnieć sytuacja, że zdecydujemy się na użycie danego elementu, który może sprawiać gdzieniegdzie problem, ale być tu spoko rozwiązaniem. W sytuacji, gdy tworzymy sobie takie prawa, to się ograniczamy. Wydaje się, że lepszym rozwiązaniem jest już stwierdzenie "Należy unikać X", ale bez jakiegoś uzasadnienia i wyjaśnienia jest prawie tyle samo warte (no to kiedy jest dozwolone? jak nie wiadomo, jaki jest powód, to już lepiej nie używać, dla zasady)

Tu akurat podałem przykład tego singletona, bo sam się z takim stwierdzeniem spotykałem. Chodziło mi o tworzenie sobie radykalnych praw z uzasadnieniem przez autorytet ("bo wykładowca tak powiedział / bo senior tak powiedział / bo na mądrym portalu tak napisano" itp.) i jak najbardziej pochwalam zachowanie autora, że próbuje dociekać czy to prawda i dlaczego. Sam się łapałem na tym, że niektóre rzeczy robiłem, bo ktoś mi tak powiedział, że się robi, a jak się zacząłem zastanawiać dlaczego i dopytywać, to rzeczywistość okazywała się nie taka czarno-biała. Ba, nawet pod wpływem analizy może się okazać, że dana zasada jest bez sensu (jak najwidoczniej jest z "Nie używać breaków"). I może miałem jakieś szczęście, ale więcej fanboyów różnych rozwiązań spotykam w pracy niż miałem okazję poznać wykładowców z radykalnymi twierdzeniami (chociaż może wykładowca-fanatyk wskaźników i C++ robił za cały wydział stwierdzeniami "dopiero po poznaniu typu wskaźnikowego możecie myśleć o byciu programistami", czy "koderzy Javy czy Pythona nie mogą nazywać się programistami, ponieważ nie używają wskaźników", ale to było takie jaskrawe, że nie dało się traktować tego poważnie xD)

S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
3

@somekind: Nie używasz pętli w znaczeniu for, while, do while, czy w znaczeniu "nie wykonuję wielokrotnie tego samego ciągu instrukcji" (czyli nie używasz wszelkiej maści forEach i innych takich)?

Domyślam się o klasycznego fora.. @somekind zapewne używa LINQ, Javovcy Streamów itp


somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Lokalizacja:Wrocław
4
piotrpo napisał(a):

Swoją drogą, zastanawiam się jak ten szanujący się programista rozwiązałby np. problem typu "pobierz plik z internetu, jak się nie uda, to zaczekaj 5 sekund i spróbuj jeszcze raz, jeżeli nie uda się n razy, to daj sobie spokój".

Mam nadzieję, że nie pętlą.

Kopiuj
return Policy
  .Handle<WebException>()
  .WaitAndRetry(new[]
  {
    TimeSpan.FromSeconds(5),
    TimeSpan.FromSeconds(10),
    TimeSpan.FromSeconds(15)
  }, (ex, timeSpan, retryCount, context) =>
  {
    _logger.Error(ex, $"Error - try retry (count: {retryCount}, timeSpan: {timeSpan})");
  })
  .Execute(() => webClient.DownloadString(url));
}

@somekind: Nie używasz pętli w znaczeniu for, while, do while, czy w znaczeniu "nie wykonuję wielokrotnie tego samego ciągu instrukcji" (czyli nie używasz wszelkiej maści forEach i innych takich)?

Tak jak @scibi_92 - technologie pozwalające na deklaratywne filtrowanie pozwalają pominąć używanie pętli. A jak już masz prawidłowo odfiltrowane dane do przetworzenia, to iterujesz po wszystkich, nie trzeba break.

Zobacz pozostałe 12 komentarzy
axelbest
Czasami znajdują się tacy, co 20 linijek w metodzie, rozbiją na 3 factory, 2 interfejsy i abstrakcje, potem będzie masa skakania po plikach, ale kod bedzie czytelniejszy ;)
SA
@somekind: No zapewne znajdzie się ktoś, kto uzna kilkadziesiąt linijek kodu za czytelniejsze od kilku, ale nie idźmy w takie perwersje. Długo nie musiałeś czekać.⬆️
piotrpo
A później sonar pokazuje "Cognitive complexity 15000 allowed 7", a w kodzie "//NOSONAR if we split this method it will be harder to understand"
SA
Przecież łatwiej się debugguje jak tak wszystko w jednym miejscu jest.
somekind
Ja bym bardzo chętnie zobaczył jak ktoś rozbija zagnieżdżone pętle i warunki na factory i interfejsy. Z abstrakcją za to na pewno nie będzie to miało wiele wspólnego.
pms_enable_synaptics
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:152
1
AlanOGLL napisał(a):

Cześć.
Jakiś czas temu wykładowca z Algorytmów i struktur danych powiedział, że szanujący się programista nie użyje w pętli przerwania break.
Stwierdził, że zawsze da się napisać kod tak, żeby obyło się bez breaka.

Do treści prezentowanych przez wykładowców polskich uczelni podchodziłbym z przymrużeniem oka :-P

Jestem w stanie w to uwierzyć, ale ciekawi mnie czemu taka niechęć i czy wy - doświadczeni programiści, słyszeliście coś na ten temat?

Niechęć do break się zdarza wśród mniej doświadczonych. Do goto i return też.

Taka trochę nadgorliwość programistycznych neofitów.

Niektórym nawet tak zostaje, nie wyłączając seniorów i principali. Tyle, że "złej baletnicy" przeszkadza nawet break w switchu.

Zupełnie inną kwestią są przypadki nadużywania tych instrukcji, ale to też wynika z braku umiejętności.

Jest to jakaś niepisana zasada programistów?

Nie, to przedkładanie źle pojmowanego puryzmu nad racjonalnością i praktyką produkcji oprogramowania.

Potrzeba użycia instrukcji break (a nawet goto) często wynika z celu, który chcemy osiągnąć.

Wówczas najczęściej nic nie stoi na przeszkodzie, aby wysokiej jakości kod wykorzystywał te instrukcje.

Dodam, że facet jest w podeszłym wieku, ale wydawało się, że naprawdę zna się na rzeczy.

Zgaduję, że kluczem jest wydawało się.

Z własnego doświadczenia (5 lat na WEiTI PW) wiem, że czasem jak wykładowca coś palnie, to trzeba 3 razy się dopytywać, żeby uwierzyć, że profesor, doktor (re)habilitowany czy inny docent z milionem literek przed nazwiskiem mógł coś takiego powiedzieć.

nalik
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 2 lata
  • Postów:1039
8

Wolę mieć break albo return w funkcji w zamian za mała ilość wcięć i kod, który czyta się z góry do dołu bez zbędnych skomplikowanych drabinek instrukcji sterujących.

Mam też trochę doświadczenia w programowaniu low level w C i parę goto na sumieniu, bo taki był standard kodowania w projekcie. Zakaz wczesnych powrotów, miał być tylko jeden return, za to goto dozwolone, ale tylko podczas skakania do wyjścia z funkcji (które robi dodatkowo jakieś czyszczenie) lub do wyjścia obsługującego błąd. W cpp mamy RAII i return by posprzątał, ale w c już nie, stąd taka specyficzna obsługa błędów. Kto kodował w niskopoziomowo pewnie zrozumie o czym mówię.

Czemu to mówię? Bo nie uważam, by w tym kontekście nawet i goto był zły.

Tak samo jest z break. Jestem w stanie sobie wyobrazić sytuację gdzie owa instrukcja zaciemnia kod, a nawet sprawia, że jest trudny do utrzymania. Ale to nie znaczy, że w ogóle nie należy jej używać.

edytowany 1x, ostatnio: nalik
piotrpo
Tak jak for jest opakowaniem na goto + if, tak samo streamy są w dużej części opakowaniem na jakąś tam pętlę. Na poziomie asm'a i tak wszystko kiończy jako instrukcja skoku.
nalik
Ja to wiem. Jakbym mógł użyć stream w c to bym użył. Jakbym mógł nie użyć goto albo break i miał ekstra kod to bym tak zrobił. Wybiera się to narzędzie które jest odpowiednie do wykonania zadania.
pms_enable_synaptics
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:152
0
nalik napisał(a):

Wolę mieć break albo return w funkcji w zamian za mała ilość wcięć i kod, który czyta się z góry do dołu bez zbędnych skomplikowanych drabinek instrukcji sterujących.

Mam też trochę doświadczenia w programowaniu low level w C i parę goto na sumieniu, bo taki był standard kodowania w projekcie. Zakaz wczesnych powrotów, miał być tylko jeden return, za to goto dozwolone, ale tylko podczas skakania do wyjścia z funkcji (które robi dodatkowo jakieś czyszczenie) lub do wyjścia obsługującego błąd. W cpp mamy RAII i return by posprzątał, ale w c już nie, stąd taka specyficzna obsługa błędów. Kto kodował w niskopoziomowo pewnie zrozumie o czym mówię.

Czemu to mówię? Bo nie uważam, by w tym kontekście nawet i goto był zły.

Bo nie było złe :)

Tylko, że jak ktoś nie umie w programowanie, to nie potrzeba goto, aby zrobił sobie krzywdę. Równie dobrze można sobie strzelić w stopę nieumiejętnie posługując się wskaźnikami, typami danych, alokacjami pamięci, format stringami i czymkolwiek innym.

Co do typów danych, to miałem jako słuchacz wykładu kontakt z "technicznie najlepszym" wykładowcą uczelni z pierwszej trójki rankingu "Perspektywy", który np. twierdził, że ntohl i htonl służą do konwersji longów, a ntohs i htons do konwersji shortów - zgaduję zatem, że koledze @AlanOGLL mógł trafić się podobny aparat w roli wykładowcy, tyle że akurat padło na bogu ducha winną instrukcję break.

Po prostu jak się nie ma kontaktu z rzeczywistym kodem, to się nie ma pojęcia o zasadach jego konstrukcji, bo skąd miałaby ta wiedza pochodzić? Z podręczników akademickich?

A jak się ma kilka niepopartych komercyjną praktyką tytułów przed nazwiskiem, to łatwo można wpaść w pułapkę samouwielbienia i przekonania o swojej wyższości, nie zdając sobie sprawy z faktów i jednocześnie nie będąc w stanie zrobić nawet jednego taska na poziomie mida.

edytowany 1x, ostatnio: pms_enable_synaptics
nalik
Zależy od języka.C jest archaiczne i tam czasami brakuje eleganckiego rozwiązania. Współczesne języki mają lepsze mechanizmy. Tylko nie zawsze można użyć tego współczesnego języka.
SP
SP
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:181
0

Zwykle zwrócenie True działa jak break i kończy mapowanie, przeszukiwanie.

Kopiuj
[1,2,3,4,5].some((el)=>{ console.log(el); return el==3})
Kopiuj
[*map(lambda x: print(x) if x < 4 else True, a)]

Knowledge Distiller
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
10

Wszystko zależy od kontekstu.
Jak się uczysz programowania, robisz skrypty, proste programiki itp. to największym problemem jest to żeby program powstał. I wtedy break, goto itp. nie są niczym specjalnie złym.

Jak pracujesz 20-40 godzin tygodniowo jako programista, ileś lat, i robisz oprogramowanie, gdzie błąd oznacza tragedię, bo komuś odrzuci transakcję płatniczą w Cocomo i zniszczy wieczór, jednak największym problemem jest nie żeby jakoś zadziałało, ale żeby nie wywalała się produkcja i żeby jak przyjdzie jakiś losowy junior coś poprawić w Twoim kodzie, to nie mógł łatwo zepsuć.

Dlatego nakładamy sobie kajdany i nie używamy konstrukcji, które są błędogenne. NIe tylko nie używamy, ale nawet mamy systemy, które sprawdzają kod i odrzucają jeśli pojawi się zakazana konstrukcja (lintery).

W moim przypadku oznacza to, że break w kodzie produkcyjnym to użyłem ostatnio pewnie 25 lat temu :-) Pętli też nie napisałem już od wielu lat.
A to nawet nie są największe ograniczenia. Ba, w mojej firmie używa się dużo języka, który nie jest turing complete (Dhall), tylko po to, żeby nie było się łatwo pomylić.

Ale jeszcze raz - zależy od kontekstu, doświadczenia, rodzaju oprogramowania jakie się pisze (co się stanie w przypadku błędu), zespołu i języka programowania.
Uważam, że bardzo dobrze, że wykładowca takie rzeczy mówi, bo to skłania do dyskusji. I jak widać jest zupełnie życiowy.
Sam pamiętam jak w latach 90tych usłyszałem od nauczyciela, że goto to zło i od razu przyjąłem, że to właśnie akademickie pierdoły, bo przecież bez goto żyć się nie da.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
Zobacz pozostałe 2 komentarze
jarekr000000
W JSONie nie umiemy programować.
piotrpo
@nie100sowny: Masz przygotować prawie identyczne konfiguracje dla środowiska testowego, pre-prod i prod, a na każdym z tych środowisk masz ileś tam różnych podkonfiguracji np. dla różnych tenantów.
jarekr000000
U nas to jest tyle kodu, że czasem kompilator dhall umiera, bo brakuje mu pamięci. Na 64gb maszynie :-)
nie100sowny
Dzięki właśnie interesowało mnie co w tym kodzicie
jarekr000000
My przygotowujemy konfiguracje kubernetesowe dla wiekszego systemu, ktory ma milion opcji uruchomienia (a główny problem to load testy czyli mozolne odpalanie i porównywanie ròznych konfigów pod kątem wydajności i kosztów).
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)