Parę pytań o czystość kodu

Parę pytań o czystość kodu
DR
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:10
0

Cześć, chciałbym zadać parę pytań odnośnie czystości kodu, a jako samouk, nie mam za bardzo kogo innego się poradzić :) Otóż:

  1. Do jakiego stopnia abstrakcji wskazane jest pisanie metod, które wywołują inne metody? Domyślam się, że im większy "łańcuch" tym gorzej ale jaka jest ogólna przyjęta praktyka? Osobiście staram się to robić tak, że maksymalnie jedna metoda, która powiedzmy wywołuje parę innych metod ale one już kolejnych nie wywołują (wszystko w obrębie jednej klasy).
  2. Jak to jest z tym, że klasa ma wykonywać tylko jedno zadanie? Prosty przykład: klasa wykonuje operację na danych wejściowych, a następnie wyświetla je w jakiś "bajerancki" sposób w konsoli. To się kwalifikuje jako jedno zadanie czy już dwa? Mam podzielić to na dwie klasy, pierwsza oblicza, a potem przekazuje do drugiej stałą referencje do tego obiektu i ona zajmuje się wyświetlaniem jego danych, czy wszystko ma się odbywać wokół jednej klasy? Jak wyczuć kiedy klasa staje się zbyt ociężała?
  3. Hermetyzacja. Czy jeśli tworzę klasę A zaprzyjaźnioną z klasą B, aby mieć swobodny dostęp do jej danych prywatnych to czy nie łamię zasad hermetyzacji? Mam mieszane uczucia co do tego zabiegu i zawsze kiedy tak robię (bo nie widzę innej opcji) to pobieram klasę B do A w formie const aby nie robić chaosu (jaki mógłby wyniknąć z edycji tej przekazanej klasy B do A). A może za bardzo się tym wszystkim przejmuję?
  4. Czy każda klasa powinna mieć osobny plik nagłówkowy czy można grupować parę podobnych klas w jednym nagłówku?
    Czekam na wasze opinie :)
somekind
To nie edukacja.
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0
Dregon napisał(a):
  1. Jak to jest z tym, że klasa ma wykonywać tylko jedno zadanie? Prosty przykład: klasa wykonuje operację na danych wejściowych, a następnie wyświetla je w jakiś "bajerancki" sposób w konsoli. To się kwalifikuje jako jedno zadanie czy już dwa? Mam podzielić to na dwie klasy, pierwsza oblicza, a potem przekazuje do drugiej stałą referencje do tego obiektu i ona zajmuje się wyświetlaniem jego danych, czy wszystko ma się odbywać wokół jednej klasy? Jak wyczuć kiedy klasa staje się zbyt ociężała?

Nie mam zbyt wielkiego doświadczenia, ale dla mnie te "operacje" i wyświetlanie (które nie jest "tymi operacjami") to dwa różne zadania. Ale z drugiej strony, jeśli to wyświetlanie nie jest bardzo często używane, to chyba lepiej po prostu zrobić dodatkową metodę. Nie zauważyłem jednak informacji o języku programowania, a czasami to robi bardzo dużą różnicę w przydziale zadań do klas.


aurel
Moderator
  • Rejestracja:prawie 15 lat
  • Ostatnio:dzień
4

Domyślam się, że im większy "łańcuch" tym gorzej ale jaka jest ogólna przyjęta praktyka? Osobiście staram się to robić tak, że maksymalnie jedna metoda, która powiedzmy wywołuje parę innych metod ale one już kolejnych nie wywołują (wszystko w obrębie jednej klasy).

To zależy. Najgorzej to sobie założyć właśnie coś w tym stylu co napisałeś i się tego trzymać choćby nie wiem co. Nie ma nic złego w łańcuchu wywołań, póki ma to sens. Jeżeli wydzielasz funkcję dla samej sztuki wydzielania funkcji, to wiesz, że przesadziłeś.

Jak to jest z tym, że klasa ma wykonywać tylko jedno zadanie? Prosty przykład: klasa wykonuje operację na danych wejściowych, a następnie wyświetla je w jakiś "bajerancki" sposób w konsoli. To się kwalifikuje jako jedno zadanie czy już dwa?

Dwa. Wynik obliczeń można wyświetlić w konsoli, ale można też zapisać do pliku, wydrukować prosto na drukarkę, przesłać mailem... Jeśli rozdzielisz obliczenie od wyświetlania, to takie modyfikacje w przyszłości będą banalnie proste.

Jak wyczuć kiedy klasa staje się zbyt ociężała?

Z doświadczeniem przyjdzie wyczucie. Póki co nie ma co gdybać, po prostu pisz. Gdy nadejdzie ten moment, że patrzysz na swoją klasę i jest ci ciężko na samą myśl o robieniu w niej zmian, to już wiesz.

Hermetyzacja. Czy jeśli tworzę klasę A zaprzyjaźnioną z klasą B, aby mieć swobodny dostęp do jej danych prywatnych to czy nie łamię zasad hermetyzacji? Mam mieszane uczucia co do tego zabiegu i zawsze kiedy tak robię (bo nie widzę innej opcji) to pobieram klasę B do A w formie const aby nie robić chaosu (jaki mógłby wyniknąć z edycji tej przekazanej klasy B do A). A

Łamiesz. Nie rób tak. Robisz chaos. Dowiedz się, jak to zrobić poprawnie. Masz błąd gdzieś w podstawowych założeniach, bo nawet nie rozumiem po co jednej klasie "swobodny" dostęp do prywatnych danych drugiej klasy... Przecież po to własnie dzielimy kod na klasy i dodajemy te słówka kluczowe "public", "private", żeby w ogóle nie występowało coś takiego jak "swobodny dostęp". Zastanów się, co dokładnie klasa A chce robić z klasą B i tylko to zrób publicznym.

KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0
aurel napisał(a):

nie rozumiem po co jednej klasie "swobodny" dostęp do prywatnych danych drugiej klasy... Przecież po to własnie dzielimy kod na klasy i dodajemy te słówka kluczowe "public", "private", żeby w ogóle nie występowało coś takiego jak "swobodny dostęp".

A po co w C++ piszemy takie słówko kluczowe friend ? Uwielbiam, gdy jakiś średniej klasy programista wszystko "wie lepiej" niż np twórcy jakiegoś języka. Gdyby jednak naprawdę ten średniej klasy programista wiedział wszystko lepiej, to by zaprojektował np swój własny język, lepiej. Zamiast się mądrować po forach.

edytowany 2x, ostatnio: kulson
KL
Yup, i dlatego składnia PHP do dzisiaj jest niespójna, a jakikolwiek pomysł na kształt jaki powinien przyjąć dopiero od jakiegoś czasu się faktycznie kształtuje. Praktycznie każdy język ma swoje małe piekiełko, które kiedyś było użyteczną rzeczą, a wraz ze zmianą podejścia zostało uznane przez praktyków za potencjalnie niebezpieczne i niewarte użytku, gdy nie jest absolutnie konieczne. Zgodnie z Twoim podejściem powinniśmy wrócić do identyfikowania kodu etykietami i jazdy na goto, bo przecież są.
KU
Zgodnie z moim podejściem, jeśli dany język wspiera jakąś konstrukcję, to znaczy że twórcy przewidzieli jej wykorzystywanie. Najnowszy standard języka C++ wcale nie usunął obsługi friend więc twórcy uznają, że jest ciągle przydatny. A java np tego nie ma, bo twórcy javy są zdania że jest niepotrzebny. Co do goto to też są (rzadkie) przypadki, gdy jego użycie jest uzasadnione.
KL
Ależ oczywiście, że jest przydatny. Jednocześnie jego przydatność nie sprawia, że nie powinien zostać zastąpiony lepszym rozwiązaniem, jeśli nie jest absolutnie konieczny. Chyba się zgodzisz, że lepiej zastanowić się nad sensowną architekturą niż po kilku takich zaprzyjaźnieniach udostępnić swoją żonę sąsiadowi żeby sobie zrobił z nią co mu tam potrzebne, nie?
aurel
W składni wielu języków jest też goto. Nie sądzę, by był to wystarczający argument za tym, by stosować goto. Są przypadki, gdzie ma to uzasadnienie, ale tak generalnie, to samo istnienie słowa kluczowego w składni wystarczające nie jest. Jeśli znasz przypadek, w którym słówko kluczowe "friend" ma sens, to podaj go - wzbogacisz dyskusję. Na razie niestety tylko coś tam poplumkałeś o średnich programistach :(
aurel
Można też deklarować zmienne globalne. Skoro można, to znaczy, że to świetny pomysł, prawda? ;)
KU
Można się spierać czy friend jest niepotrzebne, czy wielokrotne dziedziczenie jest niepotrzebne itd itp. Ty podajesz jako prawdę objawioną, że to jest zawsze złe. A jednak z jakiegoś powodu istnieje i nie ma planu usunięcia tego ze specyfikacji.
aurel
Podaj przykład, gdzie nie jest to złe. Nie wyobrażam sobie takiego, ale może za mało wiem o życiu w C++. Oświeć mnie, proszę.
KL
Co, kto, kiedy? Ani ja, ani Aurel nigdzie czegoś takiego nie stwierdzamy nawet w domyśle...
KU
Czego nie stwierdzacie nawet w domyśle? Tego, co @aurel właśnie stwierdziła jeden komentarz wyżej?
aurel
@kulson, przestań plumkać, zacznij podawać argumenty. Ja serio nie znam się na C++, a w językach, w których programuję, taki dziwoląg jak friend nie występuje. Podaj przykład, gdzie ma to sens, gdzie hermetyzacja jest gorszym rozwiązaniem.
KL
Rozmowa dotyczyła przypadku, o który pytał autor. To, że w takim przypadku wciskanie zaprzyjaźniania jest niewłaściwe nie oznacza z automatu, że źle jest zawsze. Czyli nie wyklucza istnienia sensownych zastosowań w innych przypadkach. Weź w końcu podaj przykład, bo to Ty twierdzisz, że feature jest godny zainteresowania. A ja chętnie się dowiem gdzie i w jaki sposób, bo jestem jedynie przeciętniakiem, a c++ ostatni raz widziałem na uczelni :)
AM
To ze coś nie jest wyrzucone nie oznacza że korzystanie z tego jest uważane za dobra praktyke. Myśle ze friend w 99% przypadków jest potrzebny tylko do streamów. Wiec jesli osoba zaczynajaca z c++ pyta sie sie o friend i nie chodzi o streamy, to tak, zapewne robi coś żle.
fasadin
Kulson czyli 'goto' powinno być używane w każdym języku w którym jest? Friend w c++ ma swoje zastosowanie, a nie by używać bo jest...
KU
Takie dyskusje już toczyły sie na wielu forach, minimum wysiłku żeby znaleźć i poczytac jeśli was to interesuje: https://stackoverflow.com/questions/17434/when-should-you-use-friend-in-c - tutaj nie ma co sie rozpisywać, bo nie tego dotyczy temat. Naprawdę, to że @aurel nie widzi żadnego przypadku gdzie frined by było przydatne, nie znaczy nic, nawet oficjalne FAQ języka C++ odpowiada na to pytanie, ale po co szukać, lepiej trollować
aurel
@kulson, ja to już sobie dawno znalazłam... Miałam nadzieję po prostu, że dodasz coś produktywnego do dyskusji, zamiast bezsensownego plumkania. Czy twój post jest pomocny dla pytającego? Poza tym IMHO coś tam słyszałeś, ale tak naprawdę nie bardzo się znasz, więc zamiast wyjaśnić koledze, kiedy warto używać friend odsyłasz do google'a...
KR
@kulson "Uwielbiam, gdy jakiś średniej klasy programista wszystko "wie lepiej" niż np twórcy jakiegoś języka." Dlaczego zakładasz, że autorka komentarza jest gorszym programistą, niż projektanci języka? Myślisz, że języki projektują nadludzie?
AM
Nie potrzebnie przedłużacie tę dyskusje. @kulson błędnie założył że @aurel nie widzi ŻADNEGO przypadku na gdzie użycie friend jest przydatne.
KU
Jak to błędnie, przecież @aurel dokładnie to napisała: nie widzi żadnego przypadku. A odsyłam do dyskusji, która już jest dlatego, że to nie miejsce na rozszerzoną dyskusję na ten temat
AM
A fakt nie zauważyłem tego komentarza. W takim razie cofam to co powiedziałem.
KU
Problem jest w tym, że ktoś wyuczył się kilku wzorców na siłę i tylko na nich jedzie całe życie. I potem wygłasza takie stwierdzenia.
aurel
Ja już zdążyłam doczytać, kiedy friend ma sens (komentarze @amd były z resztą bardzo pomocne). @kulson dalej nie napisał nic pomocnego :D to nie miejsce na rozszerzoną dyskusję na ten temat Oczywiście, to jest miejsce na napisanie, co @kulson uwielbia. Wszystkich nas bardzo interesuje, co uwielbiasz. Po co odpowiadać na pytanie autora wątku, skoro można sobie poplumkać :D
aurel
BTW Dalej podtrzymuję zdanie, że w przypadku opisanym przez autora friend sensu nie ma.
AM
I masz @aurel racje. Bo autor wykorzystuje je własnie(tzn nie widziałem kodu ale na to wygląda) żeby ominąc hermetyzacje. Myśle, że @kulson miał na myśli, że jednak istnieją realne przypadki wkorzystania, i z tym też miał racje.
KU
@aurel: może i podtrzymujesz, ok ale jeszcze chwilę temu uparcie twierdziłaś, że wg ciebie nigdy to nie ma sensu
aurel
@kulson, pisałam jedynie, że nie wyobrażam sobie takie przypadku, i prosiłam o wskazanie, bo chętnie dowiaduję się nowych rzeczy. @amd wskazał, ty potrafisz tylko bić pianę.
KU
Nic nie wskazał, o ile pamiętam to ja ci podałem linka do Stackoverflow, gdzie w dyskusji dokładnie odpowiedziano na twoje pytanie
AM
@kulson: 'nic nie wskazał'? hmm wydaje mi się że moja wiadomość która była wysłałana 30 minut przed Twoim linkiem lepiej wskazuje na pytanie po co jest friend i czy korzystać z niego, niż Twój link ze stacka. A już na pewno jest lepsza dla osoby początkujacej bo nie kaze mu szukac co to jest CRTP bo i tak tego nie zrozumie.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
4
Dregon napisał(a):
  1. Do jakiego stopnia abstrakcji wskazane jest pisanie metod, które wywołują inne metody? Domyślam się, że im większy "łańcuch" tym gorzej ale jaka jest ogólna przyjęta praktyka? Osobiście staram się to robić tak, że maksymalnie jedna metoda, która powiedzmy wywołuje parę innych metod ale one już kolejnych nie wywołują (wszystko w obrębie jednej klasy).

No to zależy od poziomu skomplikowania zadania, generalnie rzadko jest potrzeba aby w ramach jednej klasie łańcuch wywołań był dłuższy niż 3, bo to prawdopodobnie znaczy, że trzeba część kodu wydzielić i przenieść do innej.

  1. Jak to jest z tym, że klasa ma wykonywać tylko jedno zadanie? Prosty przykład: klasa wykonuje operację na danych wejściowych, a następnie wyświetla je w jakiś "bajerancki" sposób w konsoli. To się kwalifikuje jako jedno zadanie czy już dwa?

To metoda ma wykonywać jedno zadanie, klasa ma mieć jeden powód do zmian. :)
Zmiana sposobu obliczeń to jeden powód, zmiana sposobu wyświetlania to drugi powód. Ergo - nie może jedna klasa robić tego i tego.

Jak wyczuć kiedy klasa staje się zbyt ociężała?

Jak już wspomniałem licz możliwe powody do zmian. Poza tym patrz też na długość kodu oraz liczbę zewnętrznych zależności. Jeśli jedna klasa ma zależności na bibliotekę do obsługi plików, bazy danych i wyświetlania na ekranie, to raczej na pewno ma zbyt wiele odpowiedzialności.

  1. Hermetyzacja. Czy jeśli tworzę klasę A zaprzyjaźnioną z klasą B, aby mieć swobodny dostęp do jej danych prywatnych to czy nie łamię zasad hermetyzacji? Mam mieszane uczucia co do tego zabiegu i zawsze kiedy tak robię (bo nie widzę innej opcji) to pobieram klasę B do A w formie const aby nie robić chaosu (jaki mógłby wyniknąć z edycji tej przekazanej klasy B do A). A może za bardzo się tym wszystkim przejmuję?

Tak, łamiesz. Tak się nie powinno robić, naucz się programować bez tego. W językach obiektowych nie masz czegoś takiego jak zaprzyjaźnianie klas.

  1. Czy każda klasa powinna mieć osobny plik nagłówkowy czy można grupować parę podobnych klas w jednym nagłówku?

To jest już pytanie specyficzne wyłącznie dla języków z plikami nagłówkowymi. Podejrzewam, że nic złego się nie stanie - o ile dobrze zdefiniujesz podobieństwo.

Silv napisał(a):

Nie zauważyłem jednak informacji o języku programowania, a czasami to robi bardzo dużą różnicę w przydziale zadań do klas.

Skoro autor pisze o plikach nagłówkowych i zaprzyjaźnianiu, to wiadomo jaki to język. Ale to tak na marginesie, bo język nie ma znaczenia dla przydziału odpowiedzialności.

kulson napisał(a):

A po co w C++ piszemy takie słówko kluczowe friend ? Uwielbiam, gdy jakiś średniej klasy programista wszystko "wie lepiej" niż np twórcy jakiegoś języka.

Użycie tego słowa (nawet uzasadnione) w jakiejś tam specyficznej sytuacji nie oznacza, że nie będzie to złamanie hermetyzacji i gwałt na OOP.

Kiedy używać friend PRAWIDŁOWO, a nie BO JEST, to może się np. @kq wypowiedzieć.

Gdyby jednak naprawdę ten średniej klasy programista wiedział wszystko lepiej, to by zaprojektował np swój własny język, lepiej.

:D :D :D

kq
W sumie mogę się pokusić o posta na ten temat, ale na rozmowach rekrutacyjnych na pytanie "co oznacza słowo kluczowe friend?" moją odpowiedzią jest "oznacza ono błąd w kodzie/designie", a dopiero później rozszerzam to o wyjątki ;​)
AM
  • Rejestracja:około 12 lat
  • Ostatnio:dzień
  • Postów:195
2

Masz coś takiego jak
https://en.wikipedia.org/wiki/Law_of_Demeter
ale prawda jest taka, że zgadzam się z @aurel
Nie ma nic złego w łańcuchu wywołań, póki ma to sens. Niestety poprawne dostrzeganie sensu przychodzi z doświadczeniem.

Jeśli jak sam wspomniałeś wypisywanie ma być w jakiś 'bajerancki' sposób. To tak, powinno to być w innej klasie. Wiec masz 2 klasy, ale nie przesyłasz drugiej referencji do pierwszej (bo wtedy wpadasz w swój problem z friend). Skoro twoja pierwsza klasa oblicza, tzn ze ma jakiś wynik, wiec przesyłasz go do klasy wypisującej.

Kopiuj
struct CalculatorThatPrintsResult {
  CalculatorThatPrintsResult (Printer& printer) printer_(printer) {}

  divide(double a, double b) {
    result = ...
    printer_.prettyPrint(result);
  }

  Printer& printer_;
};
  1. W 99% przypadków friend powinieneś używać tylko do stream operatorów.

  2. W c++ można. Ale na daną chwile proponuje Ci jednak trzymać się klasa = nowy plik. Znowu w 99% przypadków to jest dobra metoda.

Jak masz jakieś pytania co do praktyk czy c++. Albo chcesz żeby ktoś rzucił okiem na Twój kod. (a nie chcesz się pytać publicznie) To dawaj na priv.

edytowany 3x, ostatnio: amd
DR
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:10
0

Dzięki za odpowiedzi, nawet nie pomyślałem, że w Javie może nie być funkcjonalności friends. Zdecydowanie prócz nauki C++, muszę poznać także inny język aby poszerzyć horyzonty i patrzenie na praktyki programistyczne. I kodzić, kodzić, kodzić... :)

somekind
Nie tylko w Javie, chyba w żadnym języku tego nie ma.
4lph4NULL
  • Rejestracja:około 7 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Cyberspace
  • Postów:29
0
Dregon napisał(a):

Cześć, chciałbym zadać parę pytań odnośnie czystości kodu, a jako samouk, nie mam za bardzo kogo innego się poradzić :) Otóż:

  1. Do jakiego stopnia abstrakcji wskazane jest pisanie metod, które wywołują inne metody? Domyślam się, że im większy "łańcuch" tym gorzej ale jaka jest ogólna przyjęta praktyka? Osobiście staram się to robić tak, że maksymalnie jedna metoda, która powiedzmy wywołuje parę innych metod ale one już kolejnych nie wywołują (wszystko w obrębie jednej klasy).

Najmniej abstrakcyjne jak się da, by zrealizować założenia. Twoim zadaniem jest stworzenie działającego programu wykonującego wyznaczone zadanie - np wyświetlenie statusu zamówienia, a nie tworzenie barokowych hierachii abstrahujących nawet kształt ogonka w ę i ą.

  1. Jak to jest z tym, że klasa ma wykonywać tylko jedno zadanie? Prosty przykład: klasa wykonuje operację na danych wejściowych, a następnie wyświetla je w jakiś "bajerancki" sposób w konsoli. To się kwalifikuje jako jedno zadanie czy już dwa? Mam podzielić to na dwie klasy, pierwsza oblicza, a potem przekazuje do drugiej stałą referencje do tego obiektu i ona zajmuje się wyświetlaniem jego danych, czy wszystko ma się odbywać wokół jednej klasy? Jak wyczuć kiedy klasa staje się zbyt ociężała?

Zależy czy wolisz czytając kod analizować na raz jedną funkcjonalność, czy też mieć makaron przeplatający ze sobą formatowanie tekstu i przetwarzanie danych.

  1. Hermetyzacja. Czy jeśli tworzę klasę A zaprzyjaźnioną z klasą B, aby mieć swobodny dostęp do jej danych prywatnych to czy nie łamię zasad hermetyzacji? Mam mieszane uczucia co do tego zabiegu i zawsze kiedy tak robię (bo nie widzę innej opcji) to pobieram klasę B do A w formie const aby nie robić chaosu (jaki mógłby wyniknąć z edycji tej przekazanej klasy B do A). A może za bardzo się tym wszystkim przejmuję?

Hiszpańska inkwizycja już po ciebie jedzie.

  1. Czy każda klasa powinna mieć osobny plik nagłówkowy czy można grupować parę podobnych klas w jednym nagłówku?

Zależy od ich powiązania ze sobą, widoczności, języka programowania.

Czekam na wasze opinie :)

W mojej opinii programowanie obiektowe to scam.

Silv
"Najmniej abstrakcyjne jak się da, by zrealizować założenia. Twoim zadaniem jest stworzenie działającego programu wykonującego wyznaczone zadanie - np wyświetlenie statusu zamówienia, a nie tworzenie barokowych hierachii abstrahujących nawet kształt ogonka w ę i ą." — a czy abstrakcja nie jest jednym ze sposobów komunikacji z innymi programistami? "Wiem, o co tu ogólnie chodzi, bo znam te metody" (a co robią metody pod spodem, to już można później dedukować).
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)