Kiedy public? Kiedy private?

Kiedy public? Kiedy private?
Qbisiek
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 lat
  • Postów:160
2

Motyw dosyć mocno programistyczny, ale nie mogłem się zdecydować do jakiego działu wrzucić - raczej nie jest to temat nietuzinkowy, więc jest tutaj :P.

Zostałem nauczony żeby wszystkie (jak najwięcej się da) pola klas ustawiać jako private, i udostępniać odpowiednie metody. Jest to zgodne z pewnymi kanonami programowania obiektowego - klasa powinna być czarną skrzynką wykonującą pewne zadanie, jej pola nie powinny nas za wiele obchodzić (podczas korzystania z niej), a wszystkie interakcje z klasą powinny się odbywać za pomocą jej metod.
Ostatnio jednak coraz częściej zadaję sobie pytanie czy ta cała konwencja faktycznie ma sens ? Coraz częściej mam wrażenie, że piszę tuziny metod, które de facto umożliwiają mi tylko swobodny dostęp do składowej jakiejś klasy - czyli robią to samo co modyfikator public.

Dzisiaj znowu stanąłem przed dylematem public czy private ? Wpisałem frazę w google i znalazłem na pewnym forum kogoś kto pytał o to samo. Przeważającą ilość odpowiedzi można by streścić w nakazie: "Używaj privat, chyba, że już naprawdę nie masz innego wyboru". Naprawdę ? Czy modyfikator public to jakieś prastare zło ?

Przemyślałem sytuację odnośnie mojego kodu i postanowiłem:

  1. Ustawię public. Sorry, ale wydaje mi się że naprawdę nie ma sensu na siłę ustawiać jakiegoś pola np. String jako private, tylko po to, żeby musieć potem dodać metody getString() i setString(String str).
  2. Napiszę o tym tutaj, być może ktoś poda jakieś sensowne powody wciskania wszędzie private, lub przychyli się do moich wniosków.

edytowany 1x, ostatnio: Qbisiek
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Interfejs powinien byc publiczny, wszystko inne jak najbardziej "sprywatyzowane". Wyjatkiem od tej reguly sa klasy matematyczne, gdzie skladowe rowniez powinny byc publiczne.

Dlaczego tak sie robi?

  1. Ograniczamy mozliwosci uzytkownika co do manipulowania wartosciami obiektow skladowych.
  2. Udostepniamy jasno okreslone ramy interfejsu, z ktorego uzytkownik moze korzystac.
  3. Zostawiamy sobie furtke na zmiane ew. zmiane implementacji bez wymagania od uzytkownika zmian w kodzie.
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

jeżeli i tak od razu dajesz settery i gettery do zmiennej i nie jest potrzebna walidacja danych to można spokojnie dać public.

Każdy będzie miał swoje zdanie na ten temat, a w pracy dostaniesz wytyczne jak masz pisać i będziesz się musiał tego trzymać.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 2 godziny
0

Dylemat można rozbić na dwa przypadki:

  1. Pisanie DTO lub tego typu rzeczy - tutaj zwykle występują magiczne operacje na bajtkodzie, np jakieś aspekty lub magia Hibernate. Bez getterów i setterów magia nie działa.
  2. Pisanie klas które rzeczywiście coś robią - tutaj zgodnie z OOP należy zenkapsulować stan i najlepiej go w ogóle nie udostępniąc, a metody powinny robić coś konkretnego, a nie służyć tylko i wyłącznie do łamania enkapsulacji.

Oczywiście są sytuacje w których robienie getterów i setterów ma mało sensu. Równocześnie jest wiele przypadków w których można użyć Project Lombok i zaoszczędzić klepania kodu bez rezygnacji z (pseudo) enkapsulacji i możliwości rozszerzania logiki dostępowej.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
AX
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:33
0

Przede wszystkim, w ten sposób uodparniasz kod klienta na przyszłe zmiany w API. Przykładowo w przyszłości możesz zadecydować, że nie będziesz już pobierać danych z pola w tej klasie, tylko twoja klasa będzie stanowić jakby proxy do innej (jak powstanie nowy model). Możesz też dzięki temu decydować kto ma prawo modyfikować dane pola, a na zewnątrz dać tylko publiczny getter. Przydatne jest to też w testach jednostkowych jak chcesz zamockować daną klasę i np. zweryfikować czy został w danym momencie wywołany setter.
Poza tym jedną z największych korzyści czynienia pól jako private jest możliwość synchronizacji stanu obiektu, co prawda idealnie jest kiedy obiekt jest immutable (wtedy mogą być wszystkie pola publiczne i stałe) ale nie zawsze się da i zazwyczaj trzeba kontrolować dostęp do pól.

Oczywiście nie zawsze robienie pól jako private ma sens, np. w wewnętrznym API, a przynajmniej w prywatnych wewnętrznych strukturach zazwyczaj to nie ma żadnego celu więc możesz sobie odpuścić. Przy bardzo prostych strukturach typu para klucz-wartość lub wektorach typu punkt też można zrobić wszystkie pola jako public final, ale np. ja preferuję mimo wszystko użyć getterów i setterów, już tak z przyzwyczajenia :).

0

Nie wiem czy podal jaki jezyk, ale np. sa takie w ktorych dostep do pol czy tez propertisow jest taki sam (obiekt.pole) i nie ma rozdzielenia na settery gettery i dostep do pola. Niektore wymagaja rekompilacji poniewaz generowany kod jest inny (np. zdaje sie Scala, @CompileStatic Groovy); inne nie wymagaja (dynamiczny Groovy - sama refleksja ktora sprawdza i gettery i pola, przez co moze byc roznica w wydajnosci - czy Python). Wszystko zalezy. Przyklad: Python nie ma wcale czegos takiego jak modyfikatory dostepu, tylko pewne konwencje (name mangling jesli prefiksem jest __ sie nie liczy bo nie chroni przed niczym) i nikt sie nie zamartwia i jest ok. A mozliwosci jakie daje mozna poogladac np. w kodzie Mercuriala, gdzie rozszerzenia potrafia zmieniac dzialanie wbudowanych komend.
Ja osobiscie jestem przeciwko pisania setterow getterow na potege (wstrzykiwanie wole za pomoca konstruktora) i unikam jak ognia, jednakze obecnie w firmie konwencje i kod sa takie, ze bez tego sie nie da i juz, wiec pisze je bo po prostu nie chce mi sie klocic z kazdym kolejnym javowcem o to czy to ma sens czy nie. (Javowcow uwazam ogolnie za ludzi uposledzonych programistycznie i bardzo ograniczonych - nie wszyscy, taki Wibowit czy inny Bogdans sa wyjatkami, ale znaczna wiekszosc to code-monkeys. To pisze ja, programista Javy <glownie> ;d).

n0name_l
Stawiaj <enter> i staraj sie robic akapity :P
KK
Im dłużej piszę zawodowo w Javie, tym bardziej zgadzam się z nawiasem na końcu:)
M3
mućka, 100/100 :-)
cepa
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 4 godziny
3

z doswiadczenia, NIGDY nie uzywaj publicznych atrybutow klasy

n0name_l
Dlaczego nigdy? W klasie Point nie widze za bardzo sensu hermetyzowania skladowych...
cepa
ot konwencja to konwencja, jezeli programujesz w modelu domenowym, a to w sumie standard w aplikacjach biznesowych to gettery i settery encji nie tylko udostepniaja wartosci skladowych ale, umozliwiaja validacje, lazy load, mockowanie i przeciaŻŻŻŻŻŻŻŻŻŻanie, klasa powinna udostepniac interfejs, a implementacja w tym skladowe powinny byc ukryte, nawet jak klasa to prozaiczny Point
Qbisiek
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 lat
  • Postów:160
0

Dzięki za rozwinięcie tematu,

n0name_l - rozumiem, że przez "użytkownik" masz na myśli innego programistę pracującego z moim kodem ? Bo przecież użytkownik końcowy i tak dostaje gotowy produkt i nie wprowadzi żadnych zmian w kodzie ?

fasadin - mam podobne zdanie.

Wibowit, axxxxx - czyli koniec końców tak jak we wszystkim - nie ma złotego środka i należy się dostosować do konkretnej sytuacji.

mućka - też piszę w Javie :P Choć tak naprawdę to jeszcze jestem noobem i dopiero pomału wykształcam własne nawyki i idee programowania.

cepa -

z doświadczenia, NIGDY nie używaj publicznych atrybutów klasy

  • potrafię zrozumieć, że jeżeli mam narzucone przez kogoś wytyczne, że wszystkie pola mają być private to mam się tego trzymać, ale nie rozumiem dlaczego sam z własnej woli mam na siebie nakładać takie, czasem bezsensowne ograniczenie ? Dzisiaj np. pisałem pewną klasę, której 8 na 9 pól będę później wyświetlał - czyli potrzebuję gettery, i które to pola użytkownik będzie mógł edytować - czyli settery, więc po co mam robić metodę typu edit(lista parametrów) a wewnątrz get i set skoro mogę ustawić pola do edycji jako public ? nie przeszkodzi mi to wcale w walidacji danych. Sprawdzę poprawność parametrów a następnie szybko, łatwo i bezpośrednio ustawię wartości zamiast wywoływać dodatkowe metody, które zrobią to samo

edytowany 1x, ostatnio: Qbisiek
n0name_l
Uzytkownik - osoba uzywajaca dany produkt, w tym przypadku klase. Jestes nim Ty lub ktokolwiek inny na tym swiecie :)
0

@cepa - pytanie po co mockowac, przeciazac, lazy-loadowac skladowe klasy Point. Nie wiem co to za klasa, ale brzmi calkiem prosto - x i y (jesli to 2d). Nie wiem po co tutaj lazy loading. Nie wiem co chcesz mockowac skoro mozna new Point(0, 0), przeciazac to mozesz metody biznesowe ale nie settery.
Bylo mowione ze walidacja itp. nie zawsze sa potrzebne, np. w klasie Point jestem sklonny stwierdzic ze nie jest - wszak dowolne wartosci x i y sa poprawne? Jesli czasami ma byc walidacja a czasami nie, to juz jakas inna klasa sie powinna tym zajmowac, ta ktora tworzy instancje dla opowiedniego kontekstu.

cepa
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 4 godziny
0
Qbisiek napisał(a):

cepa -

z doświadczenia, NIGDY nie używaj publicznych atrybutów klasy

  • potrafię zrozumieć, że jeżeli mam narzucone przez kogoś wytyczne, że wszystkie pola mają być private to mam się tego trzymać, ale nie rozumiem dlaczego sam z własnej woli mam na siebie nakładać takie, czasem bezsensowne ograniczenie ? Dzisiaj np. pisałem pewną klasę, której 8 na 9 pól będę później wyświetlał - czyli potrzebuję gettery, i które to pola użytkownik będzie mógł edytować - czyli settery, więc po co mam robić metodę typu edit(lista parametrów) a wewnątrz get i set skoro mogę ustawić pola do edycji jako public ? nie przeszkodzi mi to wcale w walidacji danych. Sprawdzę poprawność parametrów a następnie szybko, łatwo i bezpośrednio ustawię wartości zamiast wywoływać dodatkowe metody, które zrobią to samo
mućka napisał(a):

@cepa - pytanie po co mockowac, przeciazac, lazy-loadowac skladowe klasy Point. Nie wiem co to za klasa, ale brzmi calkiem prosto - x i y (jesli to 2d). Nie wiem po co tutaj lazy loading. Nie wiem co chcesz mockowac skoro mozna new Point(0, 0), przeciazac to mozesz metody biznesowe ale nie settery.
Bylo mowione ze walidacja itp. nie zawsze sa potrzebne, np. w klasie Point jestem sklonny stwierdzic ze nie jest - wszak dowolne wartosci x i y sa poprawne? Jesli czasami ma byc walidacja a czasami nie, to juz jakas inna klasa sie powinna tym zajmowac, ta ktora tworzy instancje dla opowiedniego kontekstu.

Jest taka stara dobra zasada "ch0jowo ale jednakowo", Point to akurat trywialna klasa, ALE jak sie trzymamy konwencji w kodzie to sie trzymamy. Settery i gettery nie sa tylko po to aby dobrac sie do danych obiektu, ALE do tego, aby zapewnić stabilność interfejsu w długim projekcie.
Po co?
Ano po to, że np: chce zrobić interfejs PointInterface czy tam IPoint ktory udostepnia dane o N-wymiarowej przestrzeni, sposob implementacji mnie nie interesuje ale chce mieć metody typu: setCoord(i,v), getCoord(i), setCoords(v), getCoords() i co mam zrobic public x, public y? A co jak za rok implementacja Point2D i Point3D przejdzie na vektory lub cokolwiek innego?
Po co mockowac?
Aby nie uzależniać się od konkretnej implementacji -> programowanie na interfejsach.
Po co przeciążać?
Teoretyczny przypadek typu punktu w cwiartce (0,oo+) (0,oo+), mam walidować poza klasą Point? To doprowadzi do duplikacji kodu, miejscem walidacji parametrow obiektu jest obiekt, bo to jego domena, wieć dlatego wole mieć settery i gettery ktore moge przeciązać.

ShookTea
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Załóżmy, że masz dwie zmienne: X i Y. Dalej, załóżmy że klasa ma pozwalać na pobieranie wartości tych zmiennych, ale na ustawianie tylko zmiennej X - jeśli X < 0, ustaw Y na -1, X==0 -> Y = 0, X > 0 -> Y = 1.

W takim wypadku, nie możesz zrobić zmiennej public y (która "zastępuje" pakiecik setY i getY), ponieważ chcesz zrobić tylko getY.
Dalej, nie możesz zrobić zmiennej public x, ponieważ o ile getX będzie po prostu zwracał wartość X, o tyle jednak w przypadku setX chcesz nie tylko ustawić X, ale również zmienić na jego podstawie wartość Y.

Przykład:
setX(5)
ustala od razu X na 5 i Y na 1.

Kopiuj
x = 5;
y = 1;

Okej, to też zadziała. Ale wyobraźmy sobie, że zapomniałeś o Y:
x = -5;
Y nadal równe jest 1.


fasadin
to o czym piszesz to jest właśnie walidacja danych.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 2 godziny
0

W językach funkcyjnych namiętnie używa się krotek, czyli klas zawierających kilka pól, zero specyficznej logiki i nawet brak specyficznych nazw pól.

Dla Javy są np tutaj: http://www.javatuples.org/ aczkolwiek w Javie i tak brakuje cywilizowanej składni do obsługi krotek - w przeciwieństwie do Scali czy Pythona, gdzie krotki wyglądają dość ładnie (ale i tak nie lubię Pythona).

Krotki można oczywiście nadużyć i wprowadzić więcej szkody niż pożytku. Nadają się głównie do super-zlokalizowanych typów, np przy zwracaniu pewnej kombinacji typów obiektów, która to kombinacja jest unikalna i nigdzie indziej nie używana.

A Scala ma tyle składniowych bajerów, że tam są zupełnie inne dylematy ;]


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Modyfikatora public w stosunku do pól powinno się używać jedynie w przypadku gdy używasz przy okazji final. W takim przypadku nie ma potrzeby tworzenia dodatkowego gettera, a setter nie ma sensu.
Hermetyzacja za pomocą getterów i setterów nie ma sensu > http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/

W ogólności:

  • obiekty danych np. Point, Pracownik itp. powinny być niezmienne. Ważne szczególnie w środowisku wielowątkowym. W przypadku użycia ORMa można dodatkowo użyć narzędzi kontroli wersji dla encji(przykładowo http://www.jboss.org/envers).
  • obiekty "biznesowe" nie powinny mieć setterów/getterów w ogóle, a jedynie udostępniać metody biznesowe. Wiązanie zależności za pomocą DI.

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
0

@Koziołek - pisalem cos podobnego rano, ale wyszlo mi duzo dluzsze i doszedlem do wniosku, ze nie wysle bo i tak cepa obali to jakims tekstem o cyckach albo czyms. Stwierdzilem ze nie ma sensu. Ale musze powiedziec, ze po raz pierwszy podpisuje sie pod tym co napisales bez zastrzezen ;d

xxx_xx_x
  • Rejestracja:prawie 13 lat
  • Ostatnio:5 dni
  • Postów:365
2

Ja jestem zdania że setterów i geterów trzeba unikać tak samo jak robienia zmiennych klasy jako public. Obiekt nie powinien udostępniać swojej implementacji na zewnątrz. To obiekt powinien udostępniać niezbędne metody do pracy na nim. Przykładowo, możemy mieć obiekt Enemy i w nim pole prywatne alive, i teraz można stworzyć metody setAlive i isAlive i zarządzać w ten sposób życiem obiektu, tylko po co? Nie lepiej w takim przypadku :

  1. w konstruktorze ustawiać alive na true
  2. udostępnić metode kill() która ustawi alive na false i np pchnie notyfikacje do obserwatorów, jeden z obserwatorów, który zarządza listą obietków dowie sie ze obiekt zginął poprzez notyfikacje.
Zobacz pozostałe 6 komentarzy
fasadin
ja się zgadzam z @xxx_xx_x. Żadna to hermetyzacja gdzie wszystko dajemy pod settery i gettery. Równie dobrze można dać jako public. Przykład jak przykład. @spartanPAGE mógłbyś dać przykład klasy gdzie settery i gettery są uzasadnieniem?
xxx_xx_x
@spartanPAGE poziom wypowiedzi godny politowania. Jeżeli próbowałeś być zabawny to ci nie wyszło, jeżeli nie masz argumentów to sie nie wypowiadaj.
spartanPAGE
Klasa enemy godna politowania ;-; Spróbuj ożywić jej zwłoki
xxx_xx_x
:O ale po co ożywiać zwłoki, nekrofilia?? tworzysz nowy obiekt...
spartanPAGE
Nie będę sobie zdzierał nerwów; Ta rozmowa zmieniła się w walkę racji, a racja jest jak dupa, każdy ma własną.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
0

@spartanPAGE, tyle tylko, że gettery/settery nie powinny zawierać logiki ponad walidację danych, a i to można np. w javie załatwić za pomocą beanvalidation albo aspektów.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
spartanPAGE
Tego staffu nie ma we wszystkich językach - człowiek pisze tak, jak jest przyzwyczajony, że działa mniej-więcej wszędzie :]
xxx_xx_x
dokładnie setter/getter ma ustawić wartość konkretnej zmiennej tak jak wynika z nazwy i raczej taka czynność powinna być unikana bo prowadzi do mocnych powiązań.
02
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:1176
2

W Javie wybór między public a private itd. to nie tylko kwestia dobrego designu ale też kwestia bezpieczeństwa jeżeli używa się sandboxa. Jeżeli z uprzywilejowanego kodu wycieknie referencja do ważnego obiektu bo ktoś dał protected zamiast private to mogą stać się złe rzeczy :P

edytowany 3x, ostatnio: 0x200x20
0

Ok, ale wiekszosc Javowego kodu jaki ja niestety widze to jest kombos: pole private i getter i setter. I jeszcze nosi to dumna nazwe 'wzorca' czy tez 'idiomu'. Ktos kto zajmuje sie takim kodem wie ze pole musi byc private.
Jak wspomniano, i sam o tym wiesz lepiej niz ja, sa jezyki ktore nie maja private, i jakos daja rade. Sandbox sandboxem, referencje private, a i tak sa wektory ataku np. dzieki polaczenia nowych MethodHandles, Toolkit.getDefaultTookit() i jmx (czy jakos tak, dokladnie nie pamietam) ;d

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
0

@mućka, to jest to o czym pisałem na blogu - specyfikacja JavaBeans, w pewnym sensie, promuje takie właśnie niedobre praktyki. Z drugiej strony mało kto tworzy klasy wyposażone w całą baterię propertyChangeLIstenerów "bo po co", dla których wymyślono w praktyce g/s jako metody.
Inna sprawa, że przez pewien dłuższy okres popularne narzędzia jak Hibernate czy Spring bez g/s słabo działały.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
0

Dlatego tez chyba w ktoryms z poprzednich postow wspomnialem o spring (a moze to byl ten ktorego w koncu nie wyslalem?).
Ale pytanie jest takie: co mnie to obchodzi, ze jakas biblioteka czegos nie robi? Czy to znaczy ze mam tak robic wszedzie w kodzie, jak Cepa (c**** ale jednakowo to konformizm)? Poza tym, JavaBeans zostaly wymyslone po to zeby graficzne edytory mialy ustalony protokol do wyswietlania wlasciwosci obiektow ktore leza gdzies na formie; dopiero pozniej jakies madre glowy wymyslily ze POJO == JavaBeans i w sumie fajnie transakcyje uslugi itp. rowniez zrobic mutowalne za pomoca setterow...
Ogolnie to w HB rozumiem, bo najczesciej takie zmapowane obiekty to elementy tzw. anemicznego modelu domenowego, ktory jest ladnym okresleniem na fakt, ze domenowe obiekty to nic wiecej tylko worki na dane. W Springu wole wstrzykiwanie do konstruktora, ale spring radzi sobie zdaje sie rowniez z prywatnymi setterami? Wzglednie package private, zeby bylo latwo testowac (ale i tak wole konstruktory!).

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)