Co sądzicie o tym kodzie?

Co sądzicie o tym kodzie?
N0
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Gdańsk
  • Postów:647
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 7 godzin
  • Postów:5109
1

wygląda ok

@some_ONE

Widzisz? nawet ten gość wali db init w startupie, a nie jakieś tam HasData :D :D

edytowany 1x, ostatnio: WeiXiao
SO
Może jak pisał ten artykuł (nie znalazłem daty), to .HasData jeszcze nie było, bo dodali to w jakiejś późniejszej wersji EF Core. Zresztą ja nigdzie nie pisałem, że robienie inicjalizacji bazy w startupie to złe rozwiązanie.
AD
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:27
0

IsDeleted pole w bazie, najbardziej debilny pomysł z jakim się spotkałem!

N0
? Dlaczego?
grzesiek51114
grzesiek51114
Zwykły soft-delete. Co w tym dziwnego?
AD
Bo to oznacza same problemy. Załóżmy, że w tabeli jest unikalny indeks na pola: Nazwa i IsDeleted, po oznaczeniu rekordu z nazwą "Ala" jako skasowany, teoretycznie możemy wpisać drugi rekord z taką nazwą ale jego skasowanie już się nie uda.
WeiXiao
Z baz danych nic się nie kasuje.
AD
Skasowanie w sensie zmiana flagi IsDeleted.
N0
@.Adam: To jak robisz soft-delete?
kzkzg
A nie jest problem z tym soft-delete, to że przy wyciąganiu czegoś z bazy ciągle musimy pamiętać o dopisywaniu !IsDelete?
WeiXiao
@kzkzg: jak inaczej byś to rozwiązał?
kzkzg
Nie wiem, pytam. Wydaje mi się to błędogenne. A może by przenosić usunięte rekordy do drugiej bazy danych, tylko ze skasowanymi.
WeiXiao
@kzkzg: I wtedy będziesz walił zapytania do obu baz? przecież jeżeli nagle wywalasz rekordy z jednej bazy, to tworzysz "dziury" i wszędzie musisz robić null checki. Ja to widzę tak: albo bawisz się w !IsDeleted albo walisz nieskończoną ilość null checków masz niespójna bazę. Chyba :D
N0
Największy problem jest chyba z tym, że po "usunięciu" rekordu wartość w kolumnie z unikalnym indeksem nie jest zwracana do puli wolnych wartości. Ale czy naprawdę jest to taki problem? Jeśli mamy np. tabelę użytkowników, to czy jest sens pozwalać nowym użytkownikom na wybranie nazwy, którą wcześniej nosił jakiś zbanowany użytkownik?
WeiXiao
@nobody01: Największy problem jest chyba z tym, że po "usunięciu" rekordu wartość w kolumnie z unikalnym indeksem nie jest zwracana do puli wolnych wartości. czekaj, co? przecież ona nie powinna wracać do puli wolnych wartości...
N0
@WeiXiao: No właśnie też tak uważam, a to jest chyba główny argument przeciwko IsDeleted.
N0
Jeśli ta wartość nie powinna być zwracana do puli wolnych wartości, to nie musimy stosować composite index, czyli nie mamy problemu, o którym pisał @.Adam ;)
AD
Delete to delete fizyczne z bazy a nie flaga, możesz użyć pole IsActive do nie pokazywania przestarzałych lub nieaktywnych rekordów, ale z żadnym kasowaniem nie powinno to mieć powiązania.
kzkzg
@WeiXiao: nie rozumiem o czym piszesz z tymi "dziurami", mogłbyś rozwinąć? I gdzie te nulle trzeba bedzie sprawdzać? (mam ogólne pojecie o bazach danych, może nie dostrzegam jakiejś oczywistości?)
Aventus
Nazywanie soft deletu debilnym- najbardziej debilny komentarz jaki widziałem.
Aventus
@kzkzg: nie musisz wszędzie mieć checkow. Możesz robić selekty z widoków (które to odrzuca oflagowane rekordy) w bazie lub jeśli używasz jakiś ORM zastosować globalne filtry.
AD
Tia.. w każdym widoku pamiętać o filtrowaniu według flag, życzę powodzenia....
Aventus
Albo nie miałeś doczynienia z bardziej rozbudowanymi systemami (w których soft delete to zazwyczaj standard), albo jesteś jakimś fanatykiem-idealistą. Albo jedno i drugie. Powiedz nam proszę, jak Twój pomysł z flagą IsActive rozwiązuje problem? Bo jak dla mnie to dokładnie to samo co soft delete, tylko ubrane w inny płaszczyk.
AD
Delete to fizyczne usunięcie rekordu z bazy danych, a Isactive to inny mechanizm, wtedy gdy nie możemy skasować rekord bo relacje, ale możemy domyślnie nie wyświetlać go używamy Isactive.
._.
@Aventus: Widzisz, nie znasz się. :-|
Aventus
Hard to delete to fizyczne usunięcie z bazy danych, jak najbardziej. Soft delete to oflagowane rekordu jako usunięty. Przestań tworzyć swoje teorie i walczyć z wiatrakami.
Aventus
@._.: no właśnie widzę kurka :(
WeiXiao
@kzkzg: Masz rację, ja poleciałem :P Przecież chroni mechanizm, który nie pozwoli Ci tak łatwo usunąć danych połączonych relacjami. Ale z drugiej strony, co jeżeli miałbyś usunąć np. użytkownika, a pozostawić jego np. pliki, posty itd.?
._.
Co to są dane połączone relacjami?
WeiXiao
@._. fk --> pk? :P
kzkzg
@WeiXiao: użytkownika usuwam, a jego posty itp przypisuje do użytkownika "usunięty użytkownik". Chociaż nie uważam że akurat użytkownik jest dobrym tematem do usuwania.
._.
A jaka jest domena fk i pk w krotce ? :-|
WeiXiao
@kzkzg: użytkownika usuwam, a jego posty itp przypisuje do użytkownika "usunięty użytkownik". Panie kzkzg, a mógłby mi wygenerować Pan statystyki dot. usuniętych użytkowników? ile oni przeciętnie mieli postów, ile likeów itd. Według mnie to rozwiązanie niszczy statystykę w aplikacji.
kzkzg
@WeiXiao: Zgadzam się z tobą, napisałem wcześniej że nie uważam usuwania akurat użytkownika za dobry pomysł. Ale potrafię sobie wyobrazić sytuacje obiektów których faktyczne usuwanie ma sens.
Aventus
@kzkzg: ale tutaj chyba nikt nie uwaza fizycznego usuwania rekordow za cos zlego, zakladajac ze nie bedzie to kolidowalo z wymogami systemu/regulacjami prawnymi. Jedynym problemem jest nasz specjalista twierdzacy ze cos takiego jak soft delete nie istnieje (no bo albo usuwasz, albo nie, wszystko jest przeciez binarnie proste...). A jesli to stosujesz to jestes debil i tyle.
AD
Nikogo nie obrażam, zaproponowałem tylko zamiast super pomysłu Soft-delete flagę Isactive i tyle, nie uważam się za specjalistę pomimo dość dużej praktyki w pisaniu kodu produkcyjnego, codziennie uczę się czegoś nowego i nikogo nie obrażam Panie @Aventus!!!
WeiXiao
soft delete = isActive lol
AD
Lol, no właśnie, że nie, rozumiesz znaczenie pól?
WeiXiao
jaka jest różnica?
AD
W brzmieniu...tylko
AD
No i nie jest to programowe oznaczenie rekordu jako usunięty, a co z jego potomkami, też Soft delete????
Aventus
@.Adam A ja powtarzam- po raz kolejny- ze Twoja propozycja jest tym samym co soft delete, tylko inaczej to nazywasz. Co innego gdybys chcial przechowywac wartosc jak np. Status- archived, active, suspended, whatever. Ale tu znow wszystko zalezy od wymogow systemu, i potrzebowalo by innego podejscia do tego jak wyciagac takie rekordy z bazy, filtrowac je itp. Zamieniajac IsDeleted na IsActive nic nie zmieniasz, bo logika filtrowania (jakakolwiek by ona nie byla, czy to widoki, czy filtry w kodzie) pozostanie taka sama.
AD
@Aventus Nazwa i znaczenie pola ma istotne znaczenie. Delete programowe a ukrycie poprzez Isactive to dwa różne podejścia, ukrycie rekordu to tylko to i nic więcej a oznaczenie rekordu jako skasowany rodzi pytania co z potomkami, relacjami!!??
Aventus
I właśnie tu leży problem- to nie dwa różne podejścia, tylko nazwa pola jest inna. Co do drugiego pytania to jest trochę bez sensu, przecież wszystko zależy od problemu. Jeśli mam główną encje (aggregate root) przez którą dostaje się do innych (np. Otwieram zamówienie żeby zobaczyć szczegóły) to wystarczy zrobić soft delete właśnie tego jednego rekordu. Bo nie bede już miał możliwości dostania się do innych. Jeśli z kolei UI pozwala działać w drugą stronę to trzeba to jakoś rozwiązać, i również nie wyklucza to używania soft delete.
Aventus
Jeśli w systemie należy zastosować usunięcie jakiejś encji bez fizycznego skasowania z bazy danych, to właśnie nazwa IsActive nie ma sensu. Miała by sens gdybym nadal wyświetlał te encje i ich status. Jeśli np. użytkownik kliknął "Delete" to z punktu widzenia klienta nie ma znaczenia co fizycznie stało się z tą encją. Najważniejsze jest to że ma się więcej nie pojawiać, ponieważ została usunięta w świetle wymagań biznesowych danego kontekstu. Tak więc oflagowane IsDeleted jest jak najbardziej na miejscu.
Aventus
Pragnę tylko przypomnieć że przede wszystkim podważałeś istnienie czegoś takiego jak soft delete. Nomenklatura to drugorzędny problem w tym przypadku.
AD
@Aventus To twój przykład i w tym konkretnym przypadku ma sens. Ale załóżmy, że są widoki idące od potomków, to co oznacza, że potomek nie ma flagi skasowany a rodzic skasowany, pokazywać potomka czy nie? Ale idziemy od potomków i dochodzimy do rodzica nieaktywnego, pokazywać potomka czy nie? Skasowany a nieaktywny? W domyśle skasowane powinny być niewidoczne w widokach a nieaktywne, nie jest to już takie pewne.
._.
Nie rozumiem was, po co wam ta wartość IsDeleted.? Lepiej jest zapisać event np. ProductDeleted a potem usunąc rekord Produktu.
._.
A jak co to powinno być IsHidden :-|
AD
Nie poważałem soft delete tylko uważam to za bardzo zły pomysł!
WeiXiao
Ale po co usuwać dane z bazy? @.Adam
Aventus
@.Adam: jest pewne jeśli ma się konkretne wymagania. Nie oczekuj ode mnie odpowiedzi na takie pytania bo jej nie mam. Od tego są zespoły które przysiadają do stołu i projektują rozwiązanie problemu zależnie od natury problemu. Czy gdzieś soft delete się nie sprawdzi? Oczywiście! Ale nie zmienia to tego ze coś takiego jak soft delete istnieje, jest stosowane, i nie ma w tym nic debilnego.
Aventus
Podważałeś, przeczytaj na spokojnie i z odrobiną obiektywizmu swoje wypowiedzi.
AD
@Aventus Masz prawo do własnej opini. Dziękuję za dyskusję. Zawsze to coś ciekawego wnosi.
AD
Pytanie, po co usuwać dane z bazy? Odpowiadam, ano po to aby nie było śmieci?!
._.
A może on ma bazę tylko do odczytu?
WeiXiao
@.Adam: to po co generujesz śmieci w bazie? :)
._.
Bo lubi sprzątać.
AD
@WeiXiao: czasem tak trzeba, aby udowodnić swoją użyteczność ;-) hahaha
Marcin.Miga
@.Adam: Załóżmy, że w tabeli jest unikalny indeks na pola: Nazwa i IsDeleted, po oznaczeniu rekordu z nazwą "Ala" jako skasowany, teoretycznie możemy wpisać drugi rekord z taką nazwą ale jego skasowanie już się nie uda. - to jakiś czelendż? Przynajmniej na dwa sposoby to zrobię...
AD
Zrób i na 10 sposobów , to przykład mistrzu.
Aventus
@.Adam: tylko że tu nie o moją opinię chodzi, a o Twoją walkę z wiatrakami. Nie mówiąc już o treści Twojego posta która wywołała tą dyskusje. Jeśli będziesz strofował wszystko co jest Ci obce stwierdzeniem że jest debilne, to będziesz wyglądał bardzo nieprofesjonalnie w oczach innych programistów. A tego chyba nie chcesz?
AD
@Aventus Akurat nie jest mi to obce. Może za ostro wyraziłem swoją dezaprobatę do pomysłu. Przepraszam jeśli uraziłem czyjeś ego, chodziło tylko o krytykę rozwiązania s nie osoby.
N0
@Marcin.Miga: Tak z ciekawości, jakbyś to zrobił? ;)
Marcin.Miga
@nobody01: Wysłałem ci PW. Za dużo, by tu pisać...
AD
@Marcin.Miga: Troszkę zeszło z wyjaśnieniami, a skoro tak to i rozwiązanie nie jest proste. Drogi Marcinie jestem ciekaw Twoich rozwiązań i przemyśleń?!
Marcin.Miga
Zeszło, bo nie było mnie w domu... :) A w skrócie, to rozwiązanie, to zastosowanie w idDeleted, że 0 oznacza nieusunięty. Każda inna wartość to usunięty. Np ID. Drugie rozawiązanie polega na zrobieniu indeksu unikalnego w ten sposób: create unique index users2_ui on users2(nick, (case when deleted=0 then deleted end));
Aventus
Swoją drogą to jeśli o soft delete mowa to zamiast flagi zazwyczaj lepiej używać pola DeletedDate, gdzie wartość null oznacza oczywiście że rekord nie został skasowany.
AD
A tak z ciekawości zapytam, bo ja współpracuję przy rozwoju systemu ERP, to norma z programowym flagowaniem rekordów jako usunięte? Interesują mnie tylko informacje od osób robiących podobne rzeczy?
Marcin.Miga
Norma. Pewnych danych (np. finansowych) nie możesz usuwać.
AD
Tak wiem Marcinie, w tematach kadrowo płacowych też nie da się pewnych rzeczy usunąć, ale nie stosujemy flagowanie jako usunięty ale jako nieaktywny lub/i archiwalny!
Marcin.Miga
A jaka to różnica? Usuwasz, bo ... np. RODO, ale nie możesz go usunąć ze względów finansowych, więc zaznaczasz go usunięty/nieaktywny/archiwalny... jak zwał tak zwał. Efekt ważny
AD
No jest różnica, starałem się to trochę wyłuszczyć wcześniej!!!
Marcin.Miga
To też ktoś ci odpowiedział, że danych z bazy się nie kasuje...
._.
A tak z ciekawości zapytam, bo ja współpracuję przy rozwoju systemu ERP, to norma z programowym flagowaniem rekordów jako usunięte? Interesują mnie tylko informacje od osób robiących podobne rzeczy? Tak!. Tam jest dokładnie to samo co w CMS'ie blogowym jedna z normalizowana baza z soft delete, w co niektórej tabeli.
Aventus
Tak to norma, i tak po raz kolejny zaznaczam że jakkolwiek byś nie nazwał flagi to jest to równoznaczne z soft delete jeśli po stronie klienta taki rekord jest uznany jako usunięty. Zresztą kolega wyżej to samo potwierdził. Mimo wszystko pole DeletedDate jest zazwyczaj lepsze bo mamy przynajmniej również informacje kiedy usunięcie miało miejsce.
AD
Bzdury i tyle...
._.
@Aventus Żartowałem. Dużo zależy od systemu, np. przy magazynach bardziej miałby sens podział na dwie bazy, jedna do odczytu (dla pracowników) a druga trzyma wszystkie transakcje (w tym Deleted, Closed, StusChanged, etc...) Wtedy jak mówi @Adam (chociaż nie wiem, czy o to mu chodzi) w tej do odczytu kolumna Deleted niemiałaby sensu.
Aventus
No tak, ale przeciez kiedy mowa o soft delete to w przypadku kiedy wlasnie nie stosuje sie dodatkowych mechanizmow. Chociaz scenariusz z dodatkowa baza wydaje sie jakims przeinzenierowaniem. To taki udawany Event Sourcing, wiec czemu po prostu nie stosowac ES? Tylko wtedy uwaga- fizycznie nie usuwa sie absolutnie niczego, wiec Adam moglby dostac zawalu ;)
._.
@Aventus Właśnie o ES mi chodzi. W A + ES można usuwać z read db, więc @Adam byłby zadowolony.
Aventus
Ok, tylko przykład słabo trochę podałeś. Bo ta druga baza- czyli event store- jest jedynym "source of truth" i w jakichkolwiek innych bazach można sobie usuwać jak i odtwarzać rekordy do woli. Przy zastosowaniu ES trzeba odwrócić punk widzenia- dodatkowe bazy to tylko read modele i przechowują stan zbudowany z odtwarzania eventow. No ale właśnie, tutaj stosuje się soft delete na potęgę bo "usunięcie" czegokolwiek to po prostu dodatkowy event. Owszem, w takim wypadku zapewne usuniemy rekord z read modeli, ale ogólnie z całego systemu nic nie zginie.
._.
Ładnie to opisałeś. To nie mówcie nic Adamowi o EventStore, niech myśli, że jest tam tylko baza do odczytu i problem rozwiązany. Ciii... bo usłyszy. :-|
AD
Dziękuję za zainteresowanie, troskę o moje samopoczucie i stan zdrowia :). Niestety sezon grillowa już się skończył, w sklepach brak węgla więc proszę nie grillujcie mnie na drewnie bo drewno daje większą temperaturę (empiryczne sprawdzone). Ofiara szybciej wyzionie ducha. ;) ;).
._.
A to nie jest problem ja mam własną kopalnię węgla i uranu, z którego produkuje baterie dla telefonów Samsunga. Nie słyszałeś, że baterie mu wybuchają.?
AD
A to najlepszy chyba taki prasowany wegiel drzewny, jeśli masz las i wypalaczy na własność to jak najbardziej reflektuję na takiego grilla, a co do baterii samsunga, każdemu zdarzają się chwile słabości, ;) ;)
._.
:-| Nie ma się co za dużo wydurniać, w tak poważnym miejscu.
._.
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:250
1

Prosta strzałka do bazy przez trzy warstwy to jest jakaś architektura?. A jak taka architektura się nazywa.? Interfejsy, które niczemu nie służą. Testy, które nie mają sensu jak zamokowanie bazy i sprawdzenie, czy można coś do niej dodać.

Widać, że autor kierował się jakimiś wyższymi pryncypiami oraz metrykami projektując paczki. Jest w tym coś pięknego.
title

SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
0

Wygląda na typowy przykład przeinżynierowanego CRUDa. Tam chyba nie ma żadnej logiki...

._.
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:250
0

Miałoby to sens, bo to ma tylko zapisywać i odczytywać (jedną encje), ale to wygląda jakby, autor pomyślał, wyszła tylko jedna klasa do zapisu i odczytu, cholera muszę dodać trochę więcej mięsa.

edytowany 1x, ostatnio: ._.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
8
.Adam napisał(a):

IsDeleted pole w bazie, najbardziej debilny pomysł z jakim się spotkałem!

No to chyba konkurs na najbardziej debilny post roku w działach technicznych mamy rozstrzygnięty.

neves
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Kraków
  • Postów:1114
1

Jeśli dowolny diagram zależności w projekcie przypomina:

  • nieuporządkowany chaos
  • kłębek wełny
  • spaghetti

wiedz że się coś dzieje ;)


._.
Ten gościu ma 6 lat doświadczenia i jest seniorem. Moje teorie spiskowe się potwierdzają.
N0
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Gdańsk
  • Postów:647
0

Nawet ta przykładowa aplikacja: https://github.com/dotnet-architecture/eShopOnWeb, która jest promowana przez Microsoft jako punkt odniesienia przy projektowaniu architektury, zdaje się pokazywać złe praktyki (logika biznesowa w kontrolerach, sterowanie przepływem za pomocą wyjątków i takie tam). Już w nic nie można wierzyć w internecie. ;(

SO
Logiki biznesowej to ja akurat tam w kontrolerach nie widzę.
._.
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:250
0

https://github.com/dotnet-architecture/eShopOnWeb/blob/master/src/ApplicationCore/Entities/OrderAggregate/Order.cs

Kopiuj
public Address ShipToAddress { get; private set; }

// DDD Patterns comment
        // Using a private collection field, better for DDD Aggregate's encapsulation
        // so OrderItems cannot be added from "outside the AggregateRoot" directly to the collection,
        // but only through the method Order.AddOrderItem() which includes behavior.

title

._.
A to, że ktoś pisze, że odkrył takie coś jak enkapsulacje a to, co powinno być enkapsulowane w DM jest wepchnięte do serwisu aplikacyjnego. W projekcie panuje ogólny syf.
john_klamka
no ale to przecież nie jest w serwisie tylko w agregacie
._.
Jak koś łamie wszystkie możliwe założenia DDD, a potem pisze, że prywatna kolekcja jest zgodna z założeniami DDD, nie jest zabawne? Nie macie za grosz poczucia humoru.
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)