Dobre standardy programowania - nazewnictwo zmiennych

Dobre standardy programowania - nazewnictwo zmiennych
0

Witam,
chciałem się zapytać Was, bardziej doświadczonych programistów, czy macie jakieś swoje ulubione standardy nazywania zmiennych/obiektów w waszych programach? Chodzi mi o to, że właśnie stworzyłem klasę o nazwie nazwa_klasy i zastanawiam się jak nazwać obiekt takiej klasy O_o... Najbardziej by mi pasowała taka nazwa jak nazwa klasy, ale tak nie można :/. No i właśnie zastanawiam się nad wyrobieniem sobie jakiegoś standardu ;)

Często bywa również tak, że mam metodę w której przypisuję obiektom klasy wartości i wówczas również jest problem jak nazwać takie parametry... Chodzi mi o taki przykład

Kopiuj
void metoda_przypisania_zmiennych(int A, double B)
{
this->A = A;
this->B = B;
}

bez this byłoby czytelniej, ale powstaje wówczas pytanie jak nazwać zmienne w parametrach funkcji, by je jakoś odróżnić...
pozdrawiam

mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0

Poczytaj: http://pl.wikipedia.org/wiki/Notacja_węgierska

A klasy ja nazywam np. CGame, a obiekt to małą literą np. game


<sup>_</sup>
RE
Nie, nie, nie, to najgorsze rozwiązanie ze wszystkich możliwych :).
mcoder
Zmienicie zdanie jezeli powiem, ze @Gynvael Coldwind tak robil?
RE
Być może kiedyś robił. Tak samo jak ja i co drugi programista. Dzisiaj (prawie) wszyscy są zgodni co do tego, że to zły wybór.
mcoder
Robił tak w lipcu 2010 roku, to jest 3 lata po studiach, publicznie na swoim blogu, ktory czytaja newbie i potem go nasladuja.
n0name_l
"Zmienicie zdanie jezeli powiem, ze Gynvael Coldwind tak robil?", hmm... nie! Ta notacja to paskudztwo.
AlfaLeporis
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 10 lat
  • Lokalizacja:Polska
0

Osobiście wszelkie parametry funkcji poprzedzam znakiem "_". W Twoim wypadku mogło by to wyglądać tak:

Kopiuj
void metoda_przypisania_zmiennych(int _A, double _B)
{
this->A = _A;
this->B = _B;
}
edytowany 3x, ostatnio: AlfaLeporis
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:1272
0

Po pierwsze nazwa metody lub zmiennej ma odwzorowywać to co w niej naprawdę się znajduje. Za pół roku zobaczysz fragment:

Kopiuj
void metoda_przypisania_zmiennych(int A, double B){} 

i co pomyślisz? Zaczniesz czytać kod żeby zrozumieć o co chodzi, a to jest problem.
Gdybyś np. napisał:

Kopiuj
void ustalPozycje(int x, double y){} 

problemu by nie było.

Z takich lepszych standardów.
-Klasy zaczynasz dużą literą i potem camelCase.
-Metody i zmienne zaczynasz małą literą i potem camelCase.

Zmienne jednoliterowe lub z nazwą bez znaczenia generalnie odpadają z kilkoma wyjątkami (np. "i" przy iteracji).
Rozbijaj kod na jak najwięcej małych funkcji.

AlfaLeporis
Ta nazwa funkcji i argumenty to był chyba tylko przykład, a nie kawałek kodu projektu...
szopenfx
notacja camelCase zaczyna się małą literą - gdyby zaczynała się dużą to jest to PascalCase
flowCRANE
Bo w pascalu nie rozróżnia się wielkości liter; Ja tam stosuję PascalCase do nazewnictwa głównie procedur/funkcji/typów/pól/metod, a camelCase w połączeniu z notacją węgierską do zmiennych lokalnych - i wiem co jest czym nawet po wielu miesiącach;
0
mcoder napisał(a):

Poczytaj: http://pl.wikipedia.org/wiki/Notacja_węgierska

O notacji węgierskiej czytałem, ale ona jest bez sensu - tam jest kilkadziesiąt typów... To jest nie do zapamiętania i wszystko się miesza i nie wygląda to zbyt estetycznie...

mcoder napisał(a):

A klasy ja nazywam np. CGame, a obiekt to małą literą np. game

Ja rozważałem pisać nazwy klas z dużych liter np. NAZWA_KLASY, ale doszedłem do wniosku, że to również nie wygląda zbyt estetycznie a do tego makra również są pisane dużymi literami i nie chcę by się to przeplatało...
W nazwach stosuję podkreślnik, ale również zamierzam z niego zrezygnować na rzecz: NazwaKlasy
Wówczas obiekty mógłbym nazywać np. tak NazwaKlasy nazwaklasy lub NazwaKlasy nazwa_klasy
Niestety ciągle się waHam...

AlfaLeporis napisał(a):

Osobiście wszelkie parametry funkcji poprzedzam znakiem "_". W Twoim wypadku mogło by to wyglądać tak:

Kopiuj
void metoda_przypisania_zmiennych(int _A, double _B)
{
this->A = _A;
this->B = _B;
}

Ja kiedyś dawałem f_ co informowało, że jest to zmienna funkcji, ale również trochę się do tego zniechęciłem...

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
2

W C++ jest o tyle trudniej niż w innych językach, że pisze w nim bardzo dużo osób, które są już ugruntowane w dziedzinie programowania. Z racji braku oficjalnych zaleceń organizacji, która sprawuje nad nim pieczę (komitet standaryzacyjny) stosują standardy, które poznali gdzie indziej. Dlaczego, w przeciwieństwie do Javy, C# czy Pythona ciężko powiedzieć o tych jedynych i właściwych.

Najpierw zdefiniujmy kilka stylów: camelCase, _camelCase, PascalCase, underscore_case.

Takie są moje preferencje:
Nazwy klas: PascalCase.
Nazwy metod: PascalCase.
Parametry: camelCase.
Pola: _camelCase. Czasem nie poleca się rozwiązań z podkreśleniami z przodu z tego względu, że są to nazwy zarezerwowane dla wewnętrznej implementacji czy kompilatora. Nie ma z tym jednak większych problemów. Możesz też użyć camelCase_.
Zmienne: camelCase.

Inni jako nazwy funkcji i metod stosują camelCase, a jeszcze inni underscore_case (też bardzo czytelne, także dla parametrów i zmiennych).
Kiedyś bardzo popularna (w C++ i swojego czasu w PHP) była notacja węgierska, czyli z przedrostkiem oznaczającym typ albo zasięg zmiennej (np. m_cośtam czy lpszCośtam). Nadal można ją często zauważyć w kodach C++ Microsoftu (i nadal w nagłówkach WinAPI). Obecnie raczej wszyscy są zgodni, że to złe rozwiązanie.

Najważniejsze jest jednak to, by trzymać się jednego stylu w jednym projekcie. Nie ma nic gorszego niż brak konsekwencji.

mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0

Ale kombinujesz MichałWx... Po co chcesz cos wymyslac jakies swoje zasady?


<sup>_</sup>
rincewind
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 8 lat
1

Ja trzymam się takich standardów:

  • Nazwy klas w ProperCase.
  • Nazwy metod, funkcji, zmiennych i parametrów w camelCase.
  • Prywatne pola w klasie camelCase z sufiksem _; tu dodam, że pola publiczne są naprawdę rzadkością – jeśli są, to camelCase.
  • Akcesory pól prywatnych (jeśli są potrzebne) tak jak nazwa pola bez sufiksu (np. pole T foo_, getter T foo() const, setter T& foo()).
  • Stałe najczęściej UPPER_CASE.
  • Parametr template'owy oznaczający typ w UpperCase z prefiksem T (np. TOut); jeśli jest tylko jeden parametr, to po prostu T.
  • Parametr remplate'owy oznaczający wartość w UpperCase.

Mały przykład:

Kopiuj
const int CONST_VALUE = 123;

class MyClass {
public:
    MyClass(int bar) : bar_(bar) {
        double myVar = 3.14;
    }
    
    bool foo(int baz) const {
        return baz == bar_;
    }
    
    int bar() const {
        return bar_;
    }
    
    int& bar() {
        return bar_;
    }

private:
    int bar_;
};

int main() {
    MyClass myClass(7);
}

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

Opisywac moze nie bede, ale mniej-wiecej cos w tym stylu:

Kopiuj
#define BUFFER_SIZE 256

const int CONST_VALUE = 123;
 
class MyClass
{
public:
    MyClass(int bar):
        bar(bar)
    {
        ;
    }
 
    int getBar() const
    {
        return this->bar;
    }
 
    void setBar(const int bar)
    {
        this->bar = bar;
    }
    
    bool porownanieBarow(const int) const;
 
private:
    int bar;
};

template<class T>
bool porownaj(const T& a, const T& b)
{
    return a == b;    
}

template<class Input, class Output>
void copy(const Input& first, const Input& last, Output& result)
{
    // ...
}

bool MyClass::porownanieBarow(const int bar) const
{
    return this->bar == bar;
}

 
int main()
{
    MyClass my_class(10);
    return 0;
}

Edit: Dodam jeszcze wywolanie duuuzych funkcji, raczej w formie ciekawostki ;>

Kopiuj
std::copy(
	istream_iterator<char>(cin),
	istream_iterator<char>(),
	ostream_iterator<char>(cout)
);
edytowany 2x, ostatnio: n0name_l
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:19 dni
0

Ja stosuję notację:

  • klasy/przestrzenie nazw PascalCase z zachowaniem wielkości znaków w skrótach, czyli np. HTMLParser a nie HtmlParser
  • metody small_caps_snake_case
  • stałe BIG_CAPS_SNAKE_CASE
  • zmienne i parametry small_caps_snake_case
  • stanowcze nie notacji węgierskiej
  • składowe prywatne z przedrostkiem m_

edytowany 1x, ostatnio: hauleth
0
winerfresh napisał(a):

Ja stosuję notację:

  • klasy/przestrzenie nazw PascalCase z zachowaniem wielkości znaków w skrótach, czyli np. HTMLParser a nie HtmlParser
  • metody small_caps_snake_case
  • stałe BIG_CAPS_SNAKE_CASE
  • zmienne i parametry small_caps_snake_case
  • stanowcze nie notacji węgierskiej
  • składowe prywatne z przedrostkiem _m_

Ta opcja mi najbardziej pasuje! Więc i ja ją przyjmę w swoich projektach jako standard ;-)
Nie wiem tylko czy dawać ten przedrostek m... Jakoś brzydko to wygląda :P a chwilowo nie odczuwam potrzeby odróżniania zmiennych prywatnych od publicznych - większość i tak jest prywatna.
Dzięki wszystkim za dyskusję!
pozdrawiam

hauleth
Poprawiłem trochę.
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Jeszcze zauważyłem, że wśród niektórych programistów (?), szczególnie tych początkujących (i nie tylko...), istnieje notacja n00bcase... :D

Kopiuj
class CSklep
{
    int produkty_count;

    int getprodukty()
    {
    }

    void PokazILOSC()
    {
    }
}

Jak taki koder sam sobie pisze kod to pal go sześć, ale jak się taki w pracy trafi to o jejku...

--

A tak poważniej pisząc, to co z nazewnictwem kontrolek w GUI? Czy tu używacie notacji węgierskiej? Np. dla buttona btnExit czy może inne np. ExitButton? Co o tym sądzicie, nazewnictwo kontrolek w GUI (lub komponentów).


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 2x, ostatnio: xeo545x39
Zobacz pozostałe 4 komentarze
n0name_l
Moze wyjsc dluga, oczywiscie, jak kazda inna. To rozwiazanie mi sie najbardziej spodobalo, a dluga nazwa niekoniecznie mi wadzi, wpisze 3-4 literki i mam i tak calosc i tak. (Rozmawiamy o duzych projektach i porzadnym sofcie mam nadzieje)
Azarien
ja używam butExit, cbProductsList albo podobnie. główną formę nazywam zwykle fMain.
xeo545x39
No ja np. wolę btn, cb tak samo, ale frm dla formy. Te btn i frm da się skojarzyć, ale cb i inne skróty już czasem ciężko przypomnieć sobie :/
msm
Wśród developerów PHP też ta konwencja jest popularna.
Azarien
cb może znaczyć zarówno ComboBox jak i CheckBox ;-) choć do tego drugiego używam chk.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
1

void metoda_przypisania_zmiennych(int _A, double _B)
{
this->A = _A;
this->B = _B;
}
Ważniejsze od konkretnego wyboru jest, by stosować go konsekwentnie w ramach jednego projektu.

np.

Kopiuj
_b = b;
Kopiuj
this->b = ab; // przedrostek a jak argument
Kopiuj
m_b = b; // m jak member

itd.
wszystko jedno co wybierzemy, byleby nie było co funkcję inaczej.

edytowany 1x, ostatnio: Azarien
DibbyDum
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Polska, Kraków
0

Yubby dibby dibby dibby dibby dibby dibby dum..
dampe
  • Rejestracja:ponad 12 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:SK
1

Zacznijmy może od tego że we własnych projektach mamy więcej możliwości jeżeli chodzi o dobór standardu opisującego nazwy. W pracy już tak kolorowo często nie ma - jeden z góry określony standard, którego się trzymasz (co ma swoje logiczne uzasadnienie).
Ja opiszę tylko i wyłącznie swoje podejście do nazewnictwa, które sam sobie wyrobiłem wraz ze zdobywaniem doświadczenia - ustosunkowane jest to własnym stylem programowania jak i subiektywnym ocenieniem co w praktyce jest bardziej korzystne. Poza tym duży wpływ na mój styl miała książka "Kod doskonały. Jak tworzyć oprogramowanie pozbawione błędów". Wydaje mi się że i tak zdecydowanie bardziej istotnym czynnikiem jest stosowanie właściwie dobranych nazw dla danych typów, funkcji, zmiennych itp. Jeżeli wcześniejsza kwestia nie jest spełniona to żadna konwencja nie zda egzaminu, chociażby nie wiadomo jakby nie była dobrze przemyślana:

Kopiuj
int x, y, pf, k, kk, anty_nie_wiadomo_co; 
std::string bardzo_lubie_swoja_klawiature_wiec_sobie_pisze_dlugie_nazwy_zmiennych = "a co mi tam!";
float tuBedzieCosFajnego = 0.0;

Być może jest to przerysowane, jednakże nie jeden kwiatek tego typu zdarzył się na 4p.

Nazwy klas - FooClass.
W żadnym wypadku żadne przedrostki "C" np. CFooClass - gdy pierwszy raz spotkałem się z takim stylem zarysowało się moim umyśle tylko jedno wielkie CWtf!
FOO_CLASS to już w ogóle jakieś totalne nieporozumienie.
Nie przepadam również za przedrostkami "I" np. IFooClass, chociaż już ma większy sens zastosowania aniżeli przykład z przedrostkiem C.
Jeżeli klasa jest implementacją jakiegoś wzorca projektowego to wówczas używam takiej składni: FooClass_Factory, FooClass_State itp.

Instancje klas: lowerCamelCase, bez żadnych notacji węgierskiej, która imho to zwykły przerost formy nad treścią - bardziej przeszkadza niż w rzeczywistości pomaga. Warta uwagi jest konwencja nazewnictwa zmiennych dla kontrolek gui, np. buttonExit. Początkowo sam mieszałem w dwóch stylach: buttonExit oraz exitButton. Zdecydowałem się jednak na pierwsze rozwiązanie z bardzo prostej przyczyny - auto-uzupełnianie nazw w środowisku/edytorze. Po wpisaniu "button" i np. ctrl+enter (czy też ctrl+spacja) i boom - mam już wszystkie przyciski. Tym sposobem nie muszę przeszukiwać w myślach za co dana kontrolka jest odpowiedzialna - to mi podpowie samo środowisko - wiem tylko że chodzi mi o knefel i tyle ;]

Funkcje składowe lowerCamelCase:
void fooFunction();
Nazwy dla argumentów funkcji to już bardziej złożona sprawa. Kiedyś stosowałem przedrostek _ lub pf i fa, lecz uznałem iż jest to zupełnie niepotrzebne. Jeżeli mówimy o konstruktorach to wszystkie nazwy zapisane są tak samo jak pola składowe. Jeżeli funkcja jest zwykłym setterem to np.

Kopiuj
void Foo::setAge( int newAge ) { age = newAge; }

Proste i zrozumiałe.
Co do samych nazw funkcji składowych to w zależności od ich zastosowania dodaję prefiksy. Wiadomo settery i gettery z odpowiednimi przedrostkami set i get:
void setAge;
int getAge;
Funkcje zwracające wartość logiczną z przedrostkiem "is", np:
bool Foo::isStupid() const { return stupid; }

Co do samych składowych, to tutaj wychodzę z prostego założenia. Jeżeli piszę coś prostego to przeważnie nie używam żadnego rozbudowanego środowiska z rozmaitymi smerfnymi hitami w stylu panel "symbol browser" czy jak tam zwał. Korzystając ze zwykłego notepad++ (bez żadnych pluginów), nie ma tego typu rzeczy. Jednakże taki projekt jest na tyle prosty iż nie ma możliwości abym gdzieś się zastanawiał: "czy jakaś nazwa reprezentuje składową, argument funkcji, zmienną zdefiniowaną w danej funkcji or whatever". Natomiast w większych projektach, które mogą utrudnić sprawną pracę używam odpowiedniego środowiska. Na wierzchu otwarty wcześniej wymieniony panel - no problem. Nie potrzebuję przedrostków typu m_skladowa lub skladowa, czy też skladowa, z czego pierwsza wersja nota bene brzydko wygląda ;]

consty, enumy, define'y - FOO. W przypadku enum'ów, dodatkowo poprzedzam zastosowanie dla danej stałej np:
enum GameState = { STATE_PAUSE, RUN_STATE }; itp.
Makra też z dużej.

Poza tym, nie wiem dlaczego, ale nie lubię nazw zmiennych w forach i innych pętlach typu: i,j,k,x,y,z itd. Wolę jednoznacznie określić że coś jest np indeksem z jakiegoś tam kontenera, lub nadać nazwę row i column zamiast i oraz j w zagnieżdżonych forach, przy wyborze czegoś z tablicy 2d.

To tak w skrócie, co mi do głowy teraz przyszło. Każdy wyrabia swój styl, który bardziej mu odpowiada.


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:7 dni
0

A co sądzicie o przedrostku T z delphi?
Jak dla mnie trochę brzydkie, ale skuteczne, przykładowo:

Kopiuj
class TGame {} Game; //<-- Obiekt nie musi się nazywać myGame czy jakkolwiek inaczej

Na swoje potrzeby, gdy namespace nie jest określony przez konkretny produkt używam czegoś takiego:

Kopiuj
namespace T
{
    struct Bag{};
    struct Sword{};
    class Player
    {
        T::Bag Bag;
        T::Sword Sword;
    };
}
/* ... */
T::Player Player;
edytowany 1x, ostatnio: spartanPAGE
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
2

Mi osobiście jest obojętnie czy ktoś pisze notacjeWielbłądzią(),

czy formatuje kod(){
w taki sposób;
}

czy może ()
{
w taki sposób;
}

czyPiszeOdtępy, Czy też może nie daje ich wcale.. PrzeCzYtAm KażDe KrEjZoLsTwO.
Ważne jest dla mnie, żeby był w tym konsekwentny. Jeżeli wali notacje węgierską, to niech to robi od samego początku do końca.
Dla mnie dobry styl to konsekwencja.

edytowany 2x, ostatnio: kopernik
Zobacz pozostałe 19 komentarzy
dampe
@n0name_l nie tworzyłem żadnego problemu, a przynajmniej na pewno nie miałem takiego zamiaru. Poza tym już o fakcie formatowania wcześniej pisał kopernik, o kolorowaniu składni też było pisane, o nawiasach w sumie niczego sam nie pisałem tylko _13th_Dragon dał przykład. Natomiast zastępowanie spacji nawiasami - to dopiero urojony pomysł. Wydaje mi się że temat już został wyczerpany. Jako że obejrzałem dziewiąty odcinek gry o tron z nowego sezonu, jest mi smutno i nie chce mi się prowadzić dalej tej dyskusji, wybacz i pzdr ;]
_13th_Dragon
To trzeba czytać a nie oglądać.
dampe
Na czytanie nie miałbym czasu :]
_13th_Dragon
Czyżby moja diagnoza jest słuszna? ;>
dampe
Hahaha :D Chyba nie, gdyż do czytania mam inne książki - ich tematyka raczej wiadoma.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
1
spartanPAGE napisał(a):

A co sądzicie o przedrostku T z delphi?

Taka jest konwencja w tym języku i raczej wypada się jej trzymać.

Przedrostek chyba bierze się stąd, że po pierwsze Delphi nie rozróżnia wielkości liter, a po drugie Turbo Pascal nie pozwalał na użycie tej samej nazwy jako typu i jako zmiennej (Delphi chyba pozwala...).
Dlatego nie mogło być game:Game na wzór Game game; używanego np. w C++, i ktoś wymyślił game:TGame, tożsame z game:tgame, GAME:TGAME, gaME:tgaME, GaMe:TgAmE itd.

edytowany 3x, ostatnio: Azarien
_13th_Dragon
"... game:TGame, tożsame z game:tgame, GAME:TGAME, gaME:tgaME, GaMe:TgAmE ..." - i to jest jedyna rzecz którą nie znoszę wśród pascalo-podobnych.
dampe
  • Rejestracja:ponad 12 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:SK
0

A tak btw., jak u Was wygląda sytuacja z nadawaniem polskich nazw dla zmiennych, funkcji itd.? Akceptowalne? Sami tak piszecie? Czy może nie lubicie tego? Wiem że jest to pewne odskoczenie od głównego tematu, lecz zastanawia mnie Wasze zdanie.
Osobiście nie przepadam za polskimi nazwami, gdyż mieszanka angielskich słów wraz z polskimi jakoś nie przekonuje mnie. Czasami mam wrażenie iż osoba używająca polskich nazw jest dopiero początkująca. Może się mylę :]


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~
n0name_l
polskie, rosyjskie, niemieckie czy chinskie nazwy sa dla mnie kompletnie niezrozumialym zjawiskiem.
RE
Nieangielskie nazwy to katastrofa. Zdarzyło mi się pracować z kodem, w którym nazwy były pisane po hiszpańsku z dialektem katalońskim małymi literami bez jakichkolwiek przerw. Wklepanie tego do google nie dawało najczęściej absolutnie niczego.
_13th_Dragon
Miałem podobne (jak opisał wyżej @Rev doświadczenie tylko że raz z francuskim kodem a raz z niemieckim. Słownik nić nie dawał podejrzewam że byli to skróty jakichś słów na dodatek bez znaków diakrytycznych ( tak jak często widzę na tym forum dla wszelakich list - *nast,*poprz; ).
Azarien
odkąd trafiłem na dywanik za int dupa nazywam zmienne po angielsku.
RE
int ass już w porządku?
Azarien
myślę że tak. zawsze można powiedzieć że to od "assembly" :)
_13th_Dragon
@Azarien, mogłeś powiedzieć że int dupa; to dwa kroki - po francusku.
dampe
@Azarien, jakie przeznaczenie było tej zmiennej? Aż boję się dowiedzieć co tam za programy piszecie :D
Azarien
nikomu i do niczego niepotrzebny parametr funkcji, przekazywany przez referencję.
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)