Reaktywne programowanie - motywacja

Reaktywne programowanie - motywacja
PK
PK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:245
0

Chciałem zapytać jakie przykładowe wymagania musiałby spełniać projekt, aby w rzeczywistości był sens wchodzić w reaktywne programowanie.

Nigdy nie programowałem w oparciu o ten paradygmat. Póki co widzę, że abstrakcja strumienia zachęca, do programowania funkcyjnego pozbawionego efektów ubocznych więc z użyciem strumieni raczej trudniej jest pisać kod, który coś przetwarza i na podstawie danych w strumieniu dociąga jeszcze dodatkowe dane z sieci.

Strumienie skoro buferują to mają stan (mogą buforować treść) i przy użyciu operatorów zarządzać nią i momentem emisji. Najpotężniejsza cecha sturmieni jaką widzę, to fakt, że można je łączyć z innymi strumieniami, co w przypadku zdarzeń z wielu źródeł daje podstawę do synchronizacji danych na różne sposoby.

Przykłady jakie jestem w stanie sobie wyobrazić to:

  1. czekanie na dane z kilku źródeł aż wszystkie dostaniemy wszystkie dane o zadanym kryterium, co umożliwia synchronizację zbliżoną do tego jak mamy napisy w filmach
  2. konkurencja z czasem czyli czekamy na dane, ale obok mamy drugi strumień przez który wyjedzie ze zdarzeniem jak nastąpi timeout albo mamy strumień z guzika, gdzie user ma produkuje zdarzenie kliknięcia, które np. w tym przypaku byłoby na równi z timeoutem

Gdy o tym myślę to trochę nie rozumiem czemu fenomenu reaktywnego programowania. Ta rzecz oczywiście upraszcza synchronizację, jest pomocne gdy dane pochodzą z wielu źródeł, ale ja w 90% sytuacji wybrałbym event listenera lub csp na mniejszą skalę niż pakować się we framework od reaktywnego programowania.

Zastanawiam się czego jeszcze nie widzę.

Czy takie strumienie ułatwiają projetkowanie aplikacji gdzie dochodzi do współpracy paru osób na tym samym widoku jednocześnie? Co o tym najbardziej decyduje?

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

Programowanie reaktywne jest bardziej "naturalne" niż programowanie zdarzeniowe. Jego główną zaletą jest to, że widzisz cały szablon w jego wszystkich możliwych stanach. Gdy programujesz zdarzeniowo, szablon odzwierciedla tylko stan początkowy lub ewentualnie zawiera elementy, które są ukryte i przy określonych zdarzeniach zostaną pokazane.

W programowaniu reaktywnym, widok dba sam o siebie. W programowaniu zdarzeniowym, to Ty musisz powiedzieć widokowi: "ej, zmień ten element". Przy tym ostatnim, nie widzisz jakie zmiany pociągnie za sobą to zdarzenie w kontekście całego szablonu. Łatwo jest zmienić jakiś inny element i tym samym zepsuć działanie zdarzenia.

Programowanie reaktywne jest po prostu bardziej transparentne w kwestii widoku.

Zobacz pozostałe 7 komentarzy
LukeJL
Programowanie reaktywne jest bardziej "naturalne" niż programowanie zdarzeniowe -- Ale w wielu implementacjach (choćby słynne Rx.js) reaktywność i tak opiera się na zdarzeniach(!), więc co to za różnica. Różnica jest taka, że zwykle mamy imperatywne podejście, a w Rx.js jest deklaratywne. I to jest większa różnica, a nie, że "zdarzenia", bo zdarzenia w Rx też są (chyba, że mówisz o Functional Reactive Programming - tam już nie ma zdarzeń faktycznie, tylko szczerze mówiąc nie wiem jak FRP miałoby wyglądać w praktyce).
PK
pan_krewetek
@LukeJL: user bearek piszę bindingu a nie o streamach, tam dalej w komentarzach to się wyjaśniło.
LukeJL
chociaż nie, może coś pokręciłem, w oryginalnym papierze naukowym o FRP też jest mowa o eventach http://conal.net/papers/icfp97/ (chociaż bardziej konceptualnie, kurczę, trzeba się wgryźć w teorię. Ale tak czy siak podejście FRP różni się od Rx.js - ale już nie chcę mówić dokładnie czym, żeby nie pokręcić nic).
bearek
Tak, przepraszam za konfiużyn.
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 3 godziny
  • Postów:2367
0
bearek napisał(a):

Programowanie reaktywne jest bardziej "naturalne" niż programowanie zdarzeniowe.

Nie znam się na reaktywnym, dlatego pytanie moje będzie z serii głupich. Jaka jest różnica między reaktywnym, a zdarzeniowym?

Do tej pory wydawało mi się, że reaktywne, to reagowanie na zdarzenia -> coś emituje zdarzenie, jakiś listener na nie reaguje i coś tam robi dalej.

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

To jest właśnie zdarzeniowe :P Reaktywne to takie, które na automatyczny mechanizm "reagowania" na zmianę czegoś. Za kulisami po prostu samo dodaje settera dla wartości i odświeża szablon. To odświeżanie też najczęściej jest sprytne, bo odświeża tylko to, co wymaga odświeżenia.

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
3

@bearek:

W programowaniu zdarzeniowym, to Ty musisz powiedzieć widokowi: "ej, zmień ten element".

Jeśli dobrze rozumiem to się mylisz. Zdarzenia sygnalizują coś co się stało, a więc nie mówią co ma się zmienić. Nie są imperatywne. To kod obsługujący te zdarzenia wprowadza zmiany.

Przy tym ostatnim, nie widzisz jakie zmiany pociągnie za sobą to zdarzenie w kontekście całego szablonu. Łatwo jest zmienić jakiś inny element i tym samym zepsuć działanie zdarzenia.

Jak już napisałem, zdarzenia opisują coś co już się stało. Nie można więc tego zepsuć bo to już miało miejsce.

Czytając to co piszesz nie widzę żadnych konkretów. Bez urazy ale brzmi to tak jakby określenie "reaktywne programowanie" było kolejnym buzzwordem opisującym już istniejące event-driven programming, udając że jest nowym podejściem tyko dla tego że opiera się na złych założeniach odnośnie podstaw programowania zdarzeniowego. Jednocześnie to żaden atak z mojej strony, sam jestem ciekaw zagadnienia ale piszę tylko jak to wygląda w mojej ocenie.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

@Aventus: napisałem to samo, co Ty :P "ej zmień ten element", czyli że to się nie odbywa automatycznie, tylko my musimy sami ten element zmienić.

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 3 godziny
  • Postów:2367
0
bearek napisał(a):

Reaktywne to takie, które na automatyczny mechanizm "reagowania" na zmianę czegoś.

A skąd się ten mechanizm bierze? Masz na myśli jakiś konkretny framework/bibliotekę, która potrafi reagować na pre-definiowane zdarzenia? Próbuję uchwycić tę granicę między "programowaniem zdarzeniowym", a "programowaniem reaktywnym". Mogę sobie wyobrazić jakąś gotową bibliotekę, która reaguje na zdarzenia (a_button42.onClick(action) ) i w tym sensie jest "event driven", ale czy "ractive" ?

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

@yarel: programowanie reaktywne to nazwa konceptu. Tak, realizują go różne frameworki JS-owe, np. Vue.js, Angular i React. Akurat React ma metodę setState(), która inteligentnie odświeża widok, ale np. w Vue.js dzieje się to bardziej magicznie, bo nie musisz wywoływać żadnych metod.

Nie ma czegoś takiego jak "granica" między reaktywnym a zdarzeniowym. To są dwa osobne koncepty. Bliżej in do przeciwieństw niż do podobieństw.

PA
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:426
0

Akurat react i spółka, to takie odpowiednio uproszczone programowanie reaktywne. Dlatego może się komuś wydawać, że to to samo co event-driven programming.

Z bardziej ortodoksyjnych frameworków masz https://github.com/reflex-frp/reflex

Ale generalnie tak, reaktywnie programuje się po to, żeby było bardziej modularnie i funkcyjnie.

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

@part: akurat modularność i funkcyjność nie mają z tym nic wspólnego.

Co masz na myśli mówiąc "uproszczone reaktywne programowanie"? Jakie jest nieuproszczone?

PA
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:426
0
bearek napisał(a):

@part: akurat modularność i funkcyjność nie mają z tym nic wspólnego.

Programowanie reaktywne jest konceptem mocno rozwijanym w językach funkcyjnych, ponieważ to najbardziej obiecująca droga do tworzenia interfejsów użytkownika. Z modularnością chyba też pewien związek jest.

Co masz na myśli mówiąc "uproszczone reaktywne programowanie"? Jakie jest nieuproszczone?

Programowanie reaktywne bazujące na "architekturze elm-a" jest uproszczone. Jeżeli chcesz nieuproszczone, to masz np. linka wyżej.

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

Przecież funkcyjność to tylko sposób zarządzania danymi, to z interfejsem nie ma najmniejszego związku. Programowanie reaktywne ma za zadanie sprawić, że widzimy logikę szablonu i że to warstwa danych zawsze w taki sam sposób działa na zależne od niej elementy, tj. żaden element nie zostaje "zapomniany". Tyle. To jest koncept programowania widoku. To co Ty podajesz to są skutki uboczne.

PK
PK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:245
0

Proszę o wskazanie wymagań, które przechylają szalę w kierunku reaktywnego programowania. Chodzi mi o takie wymaganie, że pójście w inną stronę oznacza pakowanie się w niezłe kłopoty.

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:około rok
  • Postów:85
0

Przeczytaj początek dokumentacji któregokolwiek z tych frameworków.

Zobacz pozostałe 3 komentarze
bearek
czytaj ze zrozumieniem, to może znajdziesz coś ponad "modą" w tym, co napisałem.
PK
pan_krewetek
To nie jest kwestia związana z czytaniem. Po prostu to co piszesz zestawiam z innymi technikami i przy tym nie widać różnicy. Natomiast argument, że stare techniki (bez wskazania ich jednoznacznej wady) ciągną do lamusa sprawia, że dyskusja wiele na tym traci.
bearek
Przy prostych projekcikach zysk jest niewarty zachodu, ale już przy średnich+ jest. A już przy SPA to nie ma o czym mówić.
PK
pan_krewetek
Zobacz to co piszesz nie odnosi się do problemu. Wielkość projektu nie wskazuje wprost na rodzaj problemów jakie zamierzasz rozwiązać, pawda?
bearek
Owszem, wskazuje. Skala zwiększa liczbę zależności między różnymi funkcjonalnościami i sprawia, że pewne kompromisy stają się albo wykonalne, albo nie.
Charles_Ray
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 14 godzin
  • Postów:1873
3

Rzadko kiedy się to opłaca, można na to patrzeć jak na tradeoff: optymalizacja zużycia zasobów/maszyn (pod warunkiem, że kod jest IO-intensive) vs czas developmentu i utrzymania takiego kodu (ciężkie testowanie, nie mówiąc o CR czy debugu na prod). Prosta abstrakcja zachęca, potem są problemy - pisałem o tym tutaj na forum, poszukaj.

Tutaj fajny art: https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape

No i prezentacja:


”Engineering is easy. People are hard.” Bill Coughran
edytowany 2x, ostatnio: Charles_Ray
Zobacz pozostałe 3 komentarze
DA
@bearek: Java Champion, co on tam wie.
bearek
@dargenn: nie wiem czy czempion czy nie czempion, ale o reaktywności jak widać nie wie nic.
Charles_Ray
Typie Tomek napisał książkę o RxJavie xDDDDD nie ośmieszaj się plz
bearek
To chyba książka do wytarcia pupy jak typ uważa, że reaktywność "rzadko się opłaca" XD cały web odetchnął z ulgą, że nareszcie można w jako tako rozsądny sposób definiować złożone interfejsy, ale nie - "rzadko się opłaca" XD
stivens
Obejrzales calosc chociaz?
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

@bearek

napisałem to samo, co Ty :P "ej zmień ten element", czyli że to się nie odbywa automatycznie, tylko my musimy sami ten element zmienić.

Wybacz ale nadal nie rozumiem. Co w takim razie jest automatycznym zmienieniem elementu, a co "manualnym"? Załóżmy taki scenariusz:

  • Mam event OrderSubmitted
  • Mam jakiś handler tego eventu w innym serwisie który buduje sobie widok zamówień użytkownika
  • Event jest obsługiwany przez handler który aktualizuje widok zamówień

Rozumiem że to jest ta manualna obsługa? Jak to zrobisz automatycznie, reaktywnie?

EDIT: Trochę poczytałem i wychodzi na to że kogo nie spytać ten będzie miał inną definicję. Nie mówiąc już o mieszaniu reactive programming z reactive systems. Spotkałem się nawet z opiniami że event-driven to jeden z najczęściej używanych sposobów na osiągnięcie "reaktywności", czyli w zasadzie odwrotność tego co Ty napisałeś. Nie twierdzę że ta definicja jest poprawna a Twoja nie. Zaznaczam tylko że wszyscy się chyba gubią w zdefiniowaniu tego, co tylko utwierdza mnie w przekonaniu że jest to buzzword.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
Zobacz pozostałe 20 komentarzy
Charles_Ray
Ale ja nie napisałem żadnej książki xD w innej dyskusji wspominałem o https://lubimyczytac.pl/ksiazka/4106080/reactive-programming-with-rxjava
bearek
Aha, no to się wyjaśniło. Ja nie oglądałem tamtego filmiku. Mówiłem o bzdurach w kontekście posta, a nie filmiku. No ale sprawa wyjaśniona, każdy miał trochę racji. Piwko na zgodę. :P
SA
To powinno trafić do perełek, dobrze że wyszło w miarę szybko, bo bym się w życiu nie domyślił, że two-way binding to programowanie reaktywne.
bearek
No bo faktycznie nazwa React.js się wzięła z pupy. W kontekście webu tak to się nazywa.
bearek
@Saalin: poza tym to nie ma nic wspólnego z two-way binding. Widok niczego nie binduje.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8398
0

Chciałem zapytać jakie przykładowe wymagania musiałby spełniać projekt, aby w rzeczywistości był sens wchodzić w reaktywne programowanie.

Zmieniający się stan, jedne obiekty zależące od stanu drugich (czyli np. GUI byłoby dobrym kandydatem, bo tam się co chwila zmieniają dane i te wszystkie przyciski i kontrolki muszą reagować na zmianę danych. Swoją drogą ostatnio robię coś, co pozwoli na reaktywność przeglądarkowych wizualizacji 3D, dzięki temu mogę zdefiniować, że np. położenie jednego obiektu w 3D zależy od drugiego albo od jakiejś innej zmiennej. Ogólnie ma mi to pomóc w pisaniu interaktywnych aplikacji/gierek 3D w bardziej zwięzły sposób).

(przy czym nie zakładam, że wszystko będzie tam reaktywne, raczej chodzi ogólnie, żeby dało się łatwo budowac apki, a reaktywność to tylko narzędzie, które może czasem się przydać, ale też nie znaczy, że całą apkę należy na tym budować)

więc z użyciem strumieni raczej trudniej jest pisać kod, który coś przetwarza i na podstawie danych w strumieniu dociąga jeszcze dodatkowe dane z sieci.

Nie, czemu? Po prostu piszesz deklaratywnie. "Dociąganie" z sieci nie musi być imperatywne. Tj. w podejściu imperatywnym każesz komputerowi "dociągnij z sieci" (np. fetch jest przykładem takiego imperatywnego API), w podejściu deklaratywnym "dociąganie z sieci" może być abstrakcyjną czynnością.

Taki pseudokod:

Kopiuj
const catPictures = ajax('https://en.wikipedia.org/wiki/Cat')
    .map(html => parseImagesFromHtml(html)
    .map(url => ajax(url));

zakładając, że ajax byłby naszą deklaratywnym obserwable do "dociągania z sieci".
To pseudokod, ale nawet w Rx.js jest coś takiego widzę: https://rxjs-dev.firebaseapp.com/api/ajax/ajax

I z tego co pamiętam, to efekty uboczne w Rx.js nie uruchamiały się dopóki nie zrobiłeś subscribe, więc samo utworzenie obserwabla nie było efektem ubocznym.


edytowany 4x, ostatnio: LukeJL
PK
pan_krewetek
Też tak początkowo o tym myślałem, ale zacząłem sobie zadać pytania czym to różni się o FP. Skoro javascript jest giętki to czemu miałby potrzebować dodatkowego wrappera w postaci rxjs? Doszedłem wtedy do wniosku, że różnicą są bufery i możliwość wstrzymywania przepływu do momentu aż nie zostanie spełniony warunek (np. na podstawie ilosci).
LukeJL
ale ja myślę, że reaktywne programowanie to nie tylko Rx.js, to tylko jedna z implementacji tego paradygmatu. Co do Rx.js to myślę, że warto poznać, szczególnie, że to jest trudna biblioteka - rzadko mam problemy z bibliotekami w JS, ale pamiętam, że do Rx.js musiałem szukać wyjaśnień, tutoriali, bo nie mogłem ogarnąć. Bo Rx to nie libka, to stan umysłu. Więc warto poznać, spróbować, żeby zrozumieć pewien sposób programowania i żeby potem móc świadomie zadecydować o tym, mieć wybór (albo zainspirować się do pewnego stylu programowania również nie używając Rx).
Charles_Ray
@pan_krewetek: dokładnie, różnica między strumieniem a reaktywnym strumieniem jest właśnie model push/pull - to subscriber deklaruje, ile danych jest w stanie wziąć na klate
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około godziny
  • Postów:3538
1

Ja bym raczej odszedł od gadki o frameworkach, ale skupił się na najważniejszych kwestiach czyli właśnie reaktywności.

W największym skrócie: w programowaniu reaktywnym warunek mając: a = b + c, wartość a zmieni się gdy zmieni się wartość b. Niesie to za sobą cały szereg konsekwencji, główny to mechanizm pilnujący zależności - każda implementacja (np. ta z Reacta) może mieć swoją specyfikę. Plusem jest na pewno to, że taki kod jest bardzo podatny na różnorakie optymalizacje (bo da się stworzyć graf zależności).

Kiedy się na pewno bawić w programowanie reaktywne? Na pewno wtedy, kiedy źródła twoich danych są od siebie niezależne (mogą to być pola na formularzu, jakieś odczyty z czujników itp.). Przy bardziej skomplikowanych algorytmach raczej bym się w to nie bawił bo wtedy szansa na to, że napisze się coś w stylu: b = b + 1 (może być rozbite na kilka linijek) rośnie.

PK
pan_krewetek
a = b + c, wartość a zmieni się gdy zmieni się wartość b - ale tak przecież dawniej się programowało, zauważ, że praca callbacków odzwierciedla ten sam kierunek pracy; jak coś się zmieniło wtedy callback był wołany, a wraz z nim kolejne, które od niego zależały. W zasadzie można mówić callback to zło, bo prowadzi do callback hell, ale pracę takiego callbacka da się podporządkować jeśli przepływ sterowania zostanie określony przez nadrzędny kod (coś w rodzaju własnej funkcji pipe, która ma callbacki określone jako poszczególne kroki swojej pracy).
PK
pan_krewetek
Przy bardziej skomplikowanych algorytmach raczej bym się w to nie bawił bo wtedy szansa na to, że napisze się coś w stylu: b = b + 1 (może być rozbite na kilka linijek) rośnie - czy mógłbyś podać, aby wyjaśnić bardziej o co chodzi? Bo tu mnie zastanawia czemu zwyczajnie nie dodasz kroku, który każda wartość w strumieniu podbija o jeden do góry? Czy może chodzi o to, że wynik strumienia miałby od razu stanowić podstawę do emisji kolejnego zdarzenia? W każdym razie fajnie byłoby dowiedzieć się jaki docelowo przykład masz na myśli.
W0
Właśnie o to chodzi, że callback jest wołany - tj. musisz go stricte zadeklarować. W programowaniu reaktywnym nie ma żadnych callbacków, każda zmienna z definicji jest obserwablą, a każda zmiana wartości powinna prowadzić do propagacji zmian. W przypadku b = b + 1 to jest nic innego jak stack overflow, ponieważ b wskazuje samo na siebie, tj. w grafie zależności będzie to zależność cykliczna. Oczywiście różne implementacje reaktywności mogą sobie z tym poradzić, natomiast z punktu widzenia paradygmatu coś takiego nie powinno nigdy zajść.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8398
0

W największym skrócie: w programowaniu reaktywnym warunek mając: a = b + c, wartość a zmieni się gdy zmieni się wartość b.

oprócz Rx.js polecam naukę Mobx, bo tam jest właśnie reaktywność, które polega bardziej na tego typu rzeczach. Poza tym choćby i React też zapewnia reaktywność bo zmieniasz stan komponentu i się sam odświeża, reaguje na zmiany.

No i programowanie wizualne, oparte na tworzeniu grafu zależności i ustalaniu, skąd mają płynąć dane dokąd. Ogólnie programowanie reaktywne zaczyna mieć więcej sensu, kiedy człowiek się pobawi różnymi "node editors".

Ja bym raczej odszedł od gadki o frameworkach,

Bo to pewien paradygmat czy sposób myślenia o programowaniu, niepotrzebna do tego jest żadna biblioteka, żeby pisać w ten sposób.


edytowany 3x, ostatnio: LukeJL
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około miesiąc
  • Postów:1082
0

No więc właśnie, programowanie reaktywne to paradygmat i coś więcej (a może inaczej - coś innego) niż jakikolwiek frejmołrk.
Ale skoro już React tu padł (a fuj ;-)) to polecam poświęcenie tych 30 minut i obejrzenie tego:

W Svelte reaktywność jest wbudowana w DNA tego rozwiązania.

PK
PK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:245
0

Czytając https://pragprog.com/titles/smreactjs5/reactive-programming-with-rxjs-5/

napotkałem fajne wprowadzenie, bo omawia plusy minusy callbacków, obietnic, event listenerów i programowania reaktywnego

Najfajniejsza informacje:

  • obietnica jest jak placeholder, ale patrzy tylko na jedną wartość, podczas gdy strumień to też placeholder, lecz zorientowany na wiele wartości
  • event listener rejestruje funkcje, ale praktycznie żadna z tych funkcji nic nie zwraca, stąd funkcje event listenera są skupione na efektach ubocznych i kontekście jaki je otacza, jak emitujesz zdarzenie wtedy wywołujesz efekty uboczne, taki kod trudniej jest kontrolować. Natomiast przy strumieniu to idziemy dużo bardziej w kierunku przewidywalnych działań
edytowany 1x, ostatnio: pan_krewetek
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)