Čtvrtek, srpen 05, 2004

Jak psát identifikátory v Javě a C#

Známe tyto základní typy označování identifikátorů

Pascal

První písmeno identifikátoru je velké. Pokud se identifikátor skládá z více slov, každé slovo v tomto zřetězeném názvu začíná velkým písmenem. Pascal zápis je vhodný pro identifikátory, které mají tři a více písmen. Příklad:

NazevIdentifikatoru

Camel

První písmeno identifikátoru je malé. Pokud se identifikátor skládá z více slov, každé další slovo v tomto zřetězeném názvu začíná velkým písmenem. Příklad:

nazevIdentifikatoru

Velká písmena

Všechna písmena v identifikátoru jsou velká. Pokud se skládají z více slov, jsou oddělena podtržítkem ('_'). Příklad:

NAZEV_IDENTIFIKATORU

Programovací jazyky Java a C# mají od svých výrobců doporučení, jak psát jednotlivé identifikátory. Je zajímavé, že přestože jsou si oba jazyky velmi podobné, tak tato doporučení se liší.

Java
Identifikátor Popis Příklad
Balíky Všechna jména malými písmeny odděleno tečkou package cz.domena.ukladani
Třídy Pascal class OtevriSoubor; class Soubor
Rozhraní Pascal interface UkladaniJmena; interface Ukladani
Metody Camel vypocti(); vypoctiObsah();
Proměnné Camel int obsah; char k; float obsahKruhu;
Konstanty Velká písmena static final int MAX_DELKA;

C#
Identifikátor Popis Příklad
Jmenný prostor Pascal Microsoft.Media; Microsoft.MediaDesign;
Třídy Pascal OtevriSoubor; Soubor;
Rozhraní Pascal + předpona I IUkladaniJmena; IUkladani;
Metody Pascal Vypocti(); VypoctiObsah();
Atributy Pascal + přípona Attribute ObsoleteAttribute{};
Parametry Camel format; prvniFormat;
Vlastnosti Pascal BarvaPozadi; Cervena;
Události Pascal MouseEventHandler
Výjimky Pascal + přípona Exception WebException
Enum typ i hodnota Pascal UrovenChyby
Statické proměnné pouze pro čtení Pascal CervenaBarva
protected a private proměnné Camel + předpona _ _cervenaBarva; _cervena

I když oba jazyky podporují diakritické znaky v názvech identifikátorů, mě osobně se to moc nelíbí. Je nutné vzít v úvahu, že náš kód může číst někdo, kdo česky neumí a české znaky se na jeho obrazovce nemusí vůbec zobrazit. Sice zde máme utf-8, ale přesto já osobně doporučuji diakritické znaky v názvech identifikátorů nepoužívat. Je to samozřejmě ale věc názoru.

Asi nejlepší volbou je dodržovat doporučení k jednotlivým platformám. Ne proto, že by byly tak geniální, ale proto, že je potom nový kód kompatibilní s knihovnami, které jsou dodány výrobcem. Je pro všechny zúčastněné strany lepší se orientovat v kódu, který je psán stejným způsobem jako knihovny příslušného prostředí.

Pokud si položím otázku, které doporučení se mi jeví jako lepší, mám v odpovědi celkem jasno. Lepší je doporučení pro Javu. Celkem sice chápu důvody proč Microsoft míchá v názvech identifikátorů jejich účel a typ, ale je to nesystémové a může to být i matoucí. Zdůvodňuji si to tím, že součástí .NET jsou i jazyky, které nejsou schopny v kódu rozeznávat velikost písmen. Přesto myslím, že doporučení používat předpony a přípony u identifikátorů, tzv. maďarskou notaci, je dnes přežitek. Microsoft to doporučoval u předchozích technologií a zbytky tohoto doporučení se zřejmě "prosákly" do .NET frameworku. Zkostnatělí programátoři zřejmě existují i ve vývojových týmech Microsoftu.

4 komentářů:

Anonymní řekl(a)...

Myslím že závěr je až příliš spekulativní. Já se například těmito doporučeními řídím jen mimoděk, protože mi kód připadá pěkný opticky ;-) A to jsem nikdy takové doporučení nečetl, prostě jsem viděl tento zápis všude okolo. Různé styly v různých jazycích mi pomáhají rozlišit se od sebe lépe v mé hlavě. A co se týká přípon a předpon, v doporučených případech se jedná o méně časté entity, kde jejich dodržování není opruz, a přitom silně pomáhá uvědomit si význam. Tvé rozhorčení zřejmě pramení z přívějšího zápisu datových typů - strName atd. - to je fakt humus.

Anonymní řekl(a)...

balicky se snad vetsinou v jave pisou opacne tzn. cz.neo....

Kouba Tomas řekl(a)...

Děkuji za upozornění, to jsem přehlédl. Už jsem to opravil.

Anonymní řekl(a)...

"zkostnateli" programatori... to se mi libi :))) kdyz clovek zacinal v C, tak psal row_count v C++ pak presel na iRowCount (resp. nRowCount) a v C# aby zacal psat rowCount. stejne tak v pripade member variables - m_nRowCount se vzilo docela dukladne a nyni je potreba dusledne pouzivat this.rowCount, aby bylo zrejme odkud se promenna bere. konstanty odjakziva psane MAX_ROW_COUNT taky dostaly na frak a je potreba psat MaxRowCount resp. RowCountMax.

dejou se veci. ze mizi prefixy mi ani tak nevadi, ale postfixy bych uplne nezavrhoval.