Rzucanie nulli w Kotlinie

Rzucanie nulli w Kotlinie
EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0

W Javie żeby nie rzucać nullami i łatwiej je przetwarzać powstała klasa Optional. W Kotlinie takiej klasy nie ma i by default wszystko jest null safety. Czasami jednak zdarza się że chcemy pobrać jakąś wartość (np. z bazy) której nie ma. Oczywiście możemy rzucać Either i inne tego typu pokroju obiekty ale pytanie czy rzucanie nullem w Kotlinie ma sens? Jakby tak podejść do tematu generycznie to pewnie jest to bezsensu bo null to nadal null ale z drugiej strony w kotlinie przetwarzanie nulli w stylu np.:

Kopiuj
    value?.let { doSomething } 

jest poniekąd podobne do tego co robimy z Optionalem w Javie (np. map).

Pytanie więc. Rzucanie nulli w Kotlinie jest akceptowalne czy raczej bee?

superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:4 dni
  • Lokalizacja:Kraków
  • Postów:2000
0

Ja bym powiedział, że dopóki nie używasz non-null assertion w kodzie (!!) i nie masz wielokrotnie zagnieżdżonych let albo innych dziwnych baboli, to jest ok. Jak zaczyna się robić gmatwanina z powodu obsługi nulli to wtedy nie ma wyjścia, refaktor żeby to uprościć.

W sumie najgorzej jest, gdy jakaś biblioteka Javowa pakuje nulle do typu non-null przez refleksje. Wtedy toto już nawet NPE nie rzuca.


danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
1

Kotlinowe ? to po prostu odpowiednik Optional z javy, tylko lepsze. Poza tym zobacz ze tu sytuacja jest zupełnie odwrotna niz w javie. W javie jesli widzisz ze metoda zwraca Object to spodziewasz się dostać Object a czasem niespodziewanie dostaniesz nulla. Jesli masz Optional to wiesz ze mozesz miec "null". W kotlinie domyślnie nie mozesz miec null więc na pewno dostaniesz Object. Jeśli w sygnaturze masz Object? no to z góry wiesz, że musisz to obsłużyć (kompilator Ci chyba nawet nie pozwoli inaczej).

Więc podsumowując: używanie null w kotlinie to tak na prawdę dziania podobne jak używanie Optonal. No chyba, że każda metoda zwraca ? no ale to juz lekka patologia


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
superdurszlak
Kompilator strzela blachę w potylicę za nieobsłużenie nullable :]
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:23 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Niestety nie rozumiem stwierdzenia "Rzucanie nulli". Czy masz na myśli rzucanie wyjątku NullPointerException czy przepychanie nulla jako wartość?
Według paradygmatu programowania fukcyjnego rzucanie wyjątków jest złe. Więc jeśli chcesz przepychać nulla możesz albo użyć notacji ze znakiem zapytania (jak w twoim przykłądzie) albo użyć bibliotekę Arrow-kt zawierającą klasę Option.
Dobrze użyta biblioteka Arrow-kt robi z Kotlina funkcyjny język podobny do Haskella. Rezultat jest podobny do użycia bibliotek ScalaZ/Cats dla Scali.


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Zobacz pozostałe 15 komentarzy
jarekr000000
@Krolik: chciałby tu jeszcze dodać, że osobiście wolę pisać w Scali, ale IMO wielu Scalowców nie widzi , że kotlin bywa blisko Scali. Jak ktoś nie jedzie ostro po type systemie i nie programuje czysto, to na kiego grzyba mu ta Scala? Naprawdę takie bazowe FP jakie daje kotlin to już nieźle. I z drugiej strony to dużo więcej niż to co jest w javie - bo to nie chodzi o lambdy tylko o wspomaganie immutable. A to kotlin robi całkiem nieźle. Widziałem dużą zmianę w javowcah po przejściu na kotlin. Generalnie język - straszny kompromis, ale naprawdę nie jest taki zły.
jarekr000000
Ten dotty null podoba mi się bardziej od Kotlinowego. Już tu narzekałem, że wkurza mnie tego T? wyjątkowość / jednorazowość. Załatwienie problemu przez union type jest dużo bardziej generyczne i eleganckie.
KR
To prawda, że Kotlin bywa blisko Scali (trudno żeby nie, jeśli ściągnął połowę ficzerów) i w sumie też wolałbym programować w Kotlinie niż w czystej Javie, jeżeli nie mógłbym w Scali. Jednak pod względem zaawansowania systemu typów czy właśnie rozwoju dziedziny to jednak Kotlin obok Scali nie stał (mam na myśli właśnie implicity czy makra; które są naprawdę potężnymi mechanizmami, tylko oczywiście trzeba się nauczyć z nich odpowiedzialnie korzystać). Te języki mają zupełnie inną filozofię: Scala stara się być minimalistyczna i abstrakcyjna, Kotlin idzie w specjalizację.
jarekr000000
tylko oczywiście trzeba się nauczyć z nich odpowiedzialnie korzystać to akurat byłaby potężna wada. Bo dlatego właśnie nie korzystam z C++ już. Templatami można było wiele... tylko trzeba było odpowiedzialnie, nawet wskaźniki miały jakieś marginalne zastosowanie. Ale jednak za dużo ludzi z tego korzystało->nieodpowiedzialnie. W Scali IMO jest dużo lepiej - implicity to chłopaki do bicia, i ciągle Oderski chce poprawić (co to ma być w dotty w końcu ? instance ? :-) ). Ale faktycznie zwykle najgorsza rzecz co się zdarza to kryptyczny błąd kompilacji. Spoko 1/2
jarekr000000
Lepiej mieć kryptyczny błąd kompilacji niż heisenbug na produkcji. Makra też idealne nie są i też w dotty mają być zmiany. Zaletą Scali jest to, że faktycznie nie trzeba sie prawie nigdy do makr zniżać. IMO w Haskellu jest więcej rzeczy robionych na TemplateHaskell (koncepcyjnie podobne do scalowych makra, ale nie znam się dobrze - jednych i drugich ciągle udaje i się unikać (w pisaniu, korzystam biernie)). 2/2
catom
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:58
3

Wg mnie, wykorzystywanie null w jakiejkolwiek logice powinno być uznawane za bad design.

Jeśli Ci się chce, zerknij sobie tu (lub znajdź sobie jakieś streszczenie tej prezentacji) - Tony Hoare - Null References: The Billion Dollar Mistake.

edytowany 1x, ostatnio: catom
danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
0

@catom: tylko jak w kotlinie masz metodę która zwraca Object? i zwrócisz tam null to jest to odpowiednik metody javowej w która zwraca Optional<Object> i zwracasz Optional.empty() Po prostu inna składnia


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2
danek napisał(a):

Kotlinowe ? to po prostu odpowiednik Optional z javy, tylko lepsze.

Nie jestem tego 100% pewny. Rozpatrywane w izolacji T? jest ładniejsze od Optional<T>.
Ale fakt, że mamy jeszcze Either<E,T>, Try<T>, Future<T> i tony innych M<T> powoduje pytanie czy nie lepiej by było gdyby była składnia do obsługi dowolnych M<T> (poodstawa to tzw. do notation ).
Możliwe, że będą sobie pluć w brodę za jakiś czas.

Z drugiej strony nie jestem też pewny, że wybrali złe rozwiązanie. Po prostu widzę problem, ale nie wiem jak z tego wybrnąć dobrze i praktycznie. Ich rozwiązanie jakoś działa, ale poza obsługą nulli z javy i framorków nie stosuję T? tylko Option<T>. Co więcej nie mam przekonania, że dobrze robię...
(ale drażnią mnie trochę takie wyjątki w języku).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
danek
jeśli ma się dostępne Either, Try itp to wygodniej korzystać z nich, gorzej jak się ich nie ma :<
Michał Sikora
Michał Sikora
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
0

Odpowiem z perspektywny Androida, ale wydaje mi się, że pasuje to do wszystkich frameworków. Rzeczy typu !! albo requireNotNull() powinny być używane tylko wtedy, kiedy framework za nas coś tworzy, przekazujemy potem tam jakiś parametr i w pewnym momencie chcemy go użyć, a jego brak oznaczałby błąd programu. Wtedy !! wywala nam apkę i od razu pokazuje, gdzie mamy błąd, który musimy naprawić. Czasami może być to błąd frameworka, więc trzeba go zgłosić i tymczasowo korzystać z jakiegoś obejścia do czasu naprawy. W normalnym kodzie uważam, że nigdy nie powinno wystąpić !! czy requireNotNull().

catom napisał(a):

Wg mnie, wykorzystywanie null w jakiejkolwiek logice powinno być uznawane za bad design.

Jeśli Ci się chce, zerknij sobie tu (lub znajdź sobie jakieś streszczenie tej prezentacji) - Tony Hoare - Null References: The Billion Dollar Mistake.

Nie zgadzam się z tym popularnym stwierdzeniem. null sam w sobie nie jest problemem. Problemem jest niemożność rozpoznania nulla na etapie kompilacji przez większość języków. Jeśli mamy brak wartości, to śmiało możemy używać nulli, jeśli pozwala nam na to system typów i ma to sens z perspektywy modelowania.

jarekr000000 napisał(a):

Z drugiej strony nie jestem też pewny, że wybrali złe rozwiązanie. Po prostu widzę problem, ale nie wiem jak z tego wybrnąć dobrze i praktycznie. Ich rozwiązanie jakoś działa, ale poza obsługą nulli z javy i framorków nie stosuję T? tylko Option<T>. Co więcej nie mam przekonania, że dobrze robię...
(ale drażnią mnie trochę takie wyjątki w języku).

Ja mam w drugą stronę. Stosuję T? a wydaje mi się, że bardziej eleganckie byłoby Option<T>. Na Androidzie mogę sobie jeszcze to tłumaczyć tym, że khem, kehm wydajność, ale to trochę oszukiwanie samego siebie. Option<T> ma natomiast ogromną przewagę w przypadku korzystania z Reactive Streams. Specyfikacja tego po prostu zabrania i choćbym nie wiadomo jak tego chciał, to muszę to opakować w jakiś kontener. Z drugiej strony teraz pojawiło się Flow w Kotlinie, więc pewnie będzie za jakiś czas de-facto standardem i problem zniknie.

edytowany 3x, ostatnio: Michał Sikora
catom
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:58
1
Michał Sikora napisał(a):

Jeśli mamy brak wartości, to śmiało możemy używać nulli, jeśli pozwala nam na to system typów i ma to sens z perspektywy modelowania.

Jeśli mamy brak wartości, to zdecydowanie wolę to jawnie zakomunikować używając monady maybe / option. Oczywiście, nie czepiałbym się nulli w np. RDBMS, ale przy mapowaniu ich struktur na odpowiednie struktury języka obiektowego / funkcyjnego, zdecydowanie wolę, gdy wszystkie nullowalne wartości jawnie to w takim języku deklarują.

Aż mi się przypomniał jeden projekt, który miałem przyjemność utrzymywać, gdzie co 5 linii było wyrażenie typu if(service.calculateSomething(attribute) != null) {...} itd. Analiza takiego kodu naprawdę nie należy do najprzyjemniejszych.

edytowany 3x, ostatnio: catom
Michał Sikora
Michał Sikora
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
0

Aż mi się przypomniał jeden projekt, który miałem przyjemność utrzymywać, gdzie co 5 linii było wyrażenie typu if(service.calculateSomething(attribute) != null) {...} itd. Analiza takiego kodu naprawdę nie należy do najprzyjemniejszych.

A czy był to język, który pozwalał na rozpoznawanie nulli w typie?

edytowany 1x, ostatnio: Michał Sikora
danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
0

Właśnie kotlin po przez ? sygnalizuje możliwość nulla


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
Interpod
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:81
0
jarekr000000 napisał(a):

Nie jestem tego 100% pewny. Rozpatrywane w izolacji T? jest ładniejsze od Optional<T>.
Ale fakt, że mamy jeszcze Either<E,T>, Try<T>, Future<T> i tony innych M<T> powoduje pytanie czy nie lepiej by było gdyby była składnia do obsługi dowolnych M<T> (poodstawa to tzw. do notation ).
Możliwe, że będą sobie pluć w brodę za jakiś czas.

Z drugiej strony nie jestem też pewny, że wybrali złe rozwiązanie. Po prostu widzę problem, ale nie wiem jak z tego wybrnąć dobrze i praktycznie. Ich rozwiązanie jakoś działa, ale poza obsługą nulli z javy i framorków nie stosuję T? tylko Option<T>. Co więcej nie mam przekonania, że dobrze robię...
(ale drażnią mnie trochę takie wyjątki w języku).

Nie znam za bardzo kotlina, ale zastanawia mnie co daje w tej sytuacji używanie języka który buduje tone abstrakcji nad null-safety po to tylko żeby babrać się dalej z klasami typu Option/Optional ? Skoro i tak jest jakiś tam impakt na wydajności (?) ? Im więcej słyszę o kotlinie tym bardziej zaczyna mi się wydawać ze to kolejna modna rzecz w IT, na którą jest chwilowe parcie na szkło, a za rok/dwa nikt juz o tym nie będzie pamiętać a java będzie miała się dobrze? Jak bardzo warto jest przenieść się do języka "nowoczesnego" po to żeby sprzedać javowe dobrze znane problemy na kotlinowe?

Podsumowując jak juz używamy Option to jedyny zysk z kotlina to gettery/settery i trochę zwięźlejsza składnia tak ? Hmm to nie wiem czy nie wole lomboka i javy, przynajmniej za pół roku nikt nie będzie musiał przepisywać tych aplikacji.

edytowany 2x, ostatnio: Interpod
Michał Sikora
Michał Sikora
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
3
Interpod napisał(a):

Nie znam za bardzo kotlina, ale zastanawia mnie co daje w tej sytuacji używanie języka który buduje tone abstrakcji nad null-safety po to tylko żeby babrać się dalej z klasami typu Option/Optional ?

O jakiej tonie abstrakcji piszesz? Znak zapytania przy typie, to chyba najprostsze rozróżnienie jakie może być w przeciwieństwie do Option, który już jest jakąś abstrakcją.

Skoro i tak jest jakiś tam impakt na wydajności (?) ?

Nie ma. A jeśli komuś zależy na tych nanosekundach, to może wyłączyć podczas kompilacji, żeby nie były dodawane checki dla nulli w publicznych metodach.

https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-2-324a4a50b70

Jak bardzo warto jest przenieść się do języka "nowoczesnego" po to żeby sprzedać javowe dobrze znane problemy na kotlinowe?

A jakie problemy przenosisz z Javy do Kotlina korzystając z Option?

Podsumowując jak juz używamy Option to jedyny zysk z kotlina to gettery/settery i trochę zwięźlejsza składnia tak? Hmm to nie wiem czy nie wole lomboka i javy, przynajmniej za pół roku nikt nie będzie musiał przepisywać tych aplikacji.

Zależy, co masz na myśli. Bo pod "trochę zwięźlejszą składnią" może kryć się wszystko.

  • delegacje
  • val, var
  • inferencja typów
  • data klasy
  • destrukcje
  • sealead klasy
  • internal
  • korutyny
  • wbudowana składnia dla funkcji
  • funkcje i właściwości rozszerzające
  • typealias (to trochę bieda, ale patrz punkt niżej)
  • inline klasy
  • wsparcie dla wielu platform
  • wyrażenia zamiast intrukcji
  • parę innych rzeczy do lukru składniowego

Lombok poza data class i val, var niczego z tej listy nie oferuje.

edytowany 3x, ostatnio: Michał Sikora
superdurszlak
Dodałbym jeszcze when statement do listy. Wreszcie można wsadzić wyrażenia do czegoś, co przypomina switch zamiast dziobać kaskady if...else if.......else if.....else... wszędzie, gdzie nie da się sprowadzić warunku do x == 3.
jarekr000000
i jeszcze dużo praktycznych rzeczy w stylu smart cast (ten smart cast to raczej w chorych miejscach, ale zawsze).
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2
Interpod napisał(a):

Nie znam za bardzo kotlina, ale zastanawia mnie co daje w tej sytuacji używanie języka który buduje tone abstrakcji nad null-safety po to tylko żeby babrać się dalej z klasami typu Option/Optional ? Skoro i tak jest jakiś tam impakt na wydajności (?)

Impakt na wydajności jest - w microenchmarkach. Trzeba mieć pecha, żeby zobaczyć na produkcji. Tym niemniej, bezpieczeństwo kosztuje, trzeba wybrać czasem co ważniejsze.
Jak kiedyś wyjdzie mi, że w jakimś kluczowym miejscu Option mi spowalnia to go z radością tam przepiszę na null. Na razie nawe nie byłem blisko.
Będzie jeszcze mniejszy narzut Optiona jak wprowadzą ValueTypes (Valhalla).

Podsumowując jak juz używamy Option to jedyny zysk z kotlina to gettery/settery i trochę zwięźlejsza składnia tak ? Hmm to nie wiem czy nie wole lomboka i javy, przynajmniej za pół roku nikt nie będzie musiał przepisywać tych aplikacji.

Pomijając już całego lomboka, którego najważniejsze sensowne zastosowanie widzę w procesie pozbywania się jedzenia z żołądka. To jeśli rzeczywiście używasz go głównie do setterów i getterów to naprawdę współczuje tym co za rok - dwa nie będą mogli przepisać twoich aplikacji. W kotlinie chyba tych setterów to użyłem raz, bo z durnym frameworkiem pracowałem.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
Potat0x
Mógłbyś coś więcej napisać o Lomboku? Właśnie planowałem z niego skorzystać do generowania equals i hashCode, ale teraz to nie wiem :P
jarekr000000
Do generowania equals i hashCode możesz stosować. Ale w zespole to sie szybko rozrasta. Możesz dostać heavy lombokowy kod, który będzie dość wymiotnie wyglądał.
M6
Dokładnie. A prawdziwy cyrk zaczyna się, gdy trzeba pogodzić jakoś lomboka z innym cudem typu mapstruct i w końcu widzisz klasy z 3 polami i 8 annotacjami. Lombok ma kilka fajnych featurów (@Value, @Builder), ale najlepiej stosować z umiarem.
V-2
  • Rejestracja:około 8 lat
  • Ostatnio:10 miesięcy
  • Postów:671
0
danek napisał(a):

Kotlinowe ? to po prostu odpowiednik Optional z javy, tylko lepsze.

Nie całkiem. Np. w RxJavie (2.x) nie mogę zastosować typu Observable<Something?>. Zgodnie ze specyfikacją Reactive Streams, strumienie nie przyjmują nulli w ogóle. Mogę więc być zmuszony do stworzenia jakiegoś własnego wrappera - zaimprowizowanego Optionala - jeśli nie jestem w stanie zlikwidować nullowalności (bo np. źródło danych, które czasem bywają nullami, leży poza moim kodem).

Inaczej jest w Swifcie, gdzie typy "nullowalne" są, tak naprawdę, słodzikiem składniowym na Optionale właśnie, a nie prawdziwymi nullami. Tyle, że twórcy Swifta nie musieli się martwić interoperowalnością z Javą.


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem, ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia. W drugiej firmie której już pracuję mam palących marihuanę programistów [...] piszą kod "leniwie", często nie wysilając się, rozwlekając ten kod, unikając np. programowania funkcyjnego (mówię tutaj o lambdach w javie).
edytowany 1x, ostatnio: V-2
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)