Coding standards, cz. 1 – konwencje nazewnictwa

Promuj

Zapraszam na pierwszą część zapowiedzianego cyklu „coding standards”. Będzie ona poświęcona konwencji nadawania nazw.
Pamiętacie PHP? Niemal każdy z nas przez to przechodził. Nie ma chyba drugiego języka programowania, który oferuje taką ilość gotowych funkcji, realizujących najdziwniejsze nawet zadania. Nie ma też niestety drugiego języka, który ma tak niekonsekwentne nazewnictwo[1]. Jak się przed tym uchronić w naszym kodzie? Bez zbędnych szczegółow – oto zasady, które pozwolą na łatwiejsze zrozumienie kodu i sprawniejsze poruszanie się w nim przez szersze „grono”:





1. Używaj angielskiego nazewnictwa

Tutaj chyba nie jest potrzebne żadne wyjaśnienie. Miałem okazję pracować przy projekcie, w którym nazwy klas i funkcji były pisane po polsku. Momentami było wesoło – gdy np. twócy brakowało inwencji napotykało się kwiatki w stylu GetKsiazkiList – nie życzę jednak nikomu ;-)

2. Używaj PascalCase oraz CamelCase

PascalCase, czyli pierwsza litera każdego słowa jest duża, np: PersonName
Stosowany do nazywania: klas, typów enum, wartości enum, zdarzeń, stałych pól, pól tylko do odczytu, interfejsów, metod, namespace’ów oraz property i nazw plików.

CamelCase, czyli litera pierwszego słowa mała, pierwsze litery kolejnych słów duże, np: listCount
Stosowany do nazywania: pól, parametrów w metodach oraz zmiennych lokalnych.

3. Nie używaj notacji Węgierskiej

Wymyślił to człowiek z Microsoftu a teraz Microsoft uważa to za passe ;-) Zmiana typu zmiennej wiąże się ze zmianą wszystkich jej wystąpień w programie. Masakra. Zapis _fieldName również uważany jest za notację węgierską, jednak używam właśnie tego zapisu dla oznaczenia prywatnych pól w klasie. Taki mały, wygodny wyjątek.

4. Nie używaj wielkości liter do rozróżnienia identyfikatorów

O ile dla C# zmienna myVariable oraz myvariable to dwie różne rzeczy, o tyle nie jest to zapis zgodny z CLS (Common Language Specification) i kod, który zawiera podobne cuda, nie będzie nigdy mógł być współdzielony np. w aplikacji napisanej w VB (gdyż VB nie rozróżnia wielkości liter).

5. Nie dodawaj przyrostków klasom, strukturom, typom enumerowanym

Bo i po co? Czy komuś pomoże w zrozumieniu programu nazwanie klasy PersonClass zamiast Person lub LogTypeEnum zamiast LogType? Wątpliwe, nadmiarowe, nieładne i niepotrzebne.

6. Nie używaj liter, które moga być pomylone z cyframi (i odwrotnie)

Naprawdę potrzeba przykładu ;-) ? Ok:

bool lO1 = I1;

7. Do klas wyjątków dołączaj przyrostek

Tutaj dodawanie postfiksu jest wskazane, np. ApplicationException, MyCustomException.

9. Używaj skrótów. Z głową!

Skracaj nazwy – kod będzie czytelniejszy. Rób to jednak z głową. Dobrze znane, ogólnie rozumiane skróty (jak np. LoadUI – UI od UserInterface) są wskazane, jednak konstrukcje typu GetComp zamiast GetComponent… czy za miesiąc sam będziesz pamiętał do czego to było?

10. Parametry nazywaj zgodnie z ich znaczeniem, funkcją – nie typem.

void Add(int intValue1, int intValue2) { ... }
void Add(int value1, int value2) { ... }

Które wg Ciebie czytelniejsze?

11. Namespace’y – używaj ogólnie przyjętego wzorca

Jego struktura to: [firma].[technologia].[komponent nadrzędny].[komponent niższego rzędu], np:
AndrzejCompany.Framework.WebHelpers.Tools

12. Klasy nazywaj używając rzeczownika w liczbie pojedynczej

Klasa ma się nazywać Member, nie Members.

13. Nazwy interfejsu poprzedzaj dużą literą I, sam interfejs określaj przymiotnikiem

Ma to służyć łatwemu odróżnieniu interfejsu od zwykłej klasy. Przymiotnik dlatego, że interfejs ma implementować określone zachowanie, stąd w CLR nazwy: IComparable, ICloneable itd.

14. Dodawaj określenie EventHandler do delegatów powiązanych ze zdarzeniami

Np.

public delegate StartEventHandler(object sender, EventArgs e)

15. Do nazwania zdarzeń (events) używaj czasowników

Np.

public event StartingEventHandler Starting;

16. Zachowuj spójność nazwy klasy i jej pliku, ograniczaj ilość klas w pliku

Np. klasa Person powinna zawierać się w pliku Person.cs. Staraj się nie definiować więcej niż jednej klasy (z zaprzyjaźnionymi, klasami, typami Enum) w jednym pliku. Większe klasy oznacz jako partial i podziel logicznie na kilka plików.




To wszystko, co udało mi się uporządkować z własnych praktyk oraz przykładów i zaleceń znalezionych przy okazji zgłębiania tematu w internecie.

Zapraszam do dyskusji.


Przypisy
  1. wspomnieć najpopularniejsze choćby: strip_tagsstripslashes – raz z underscorem, raz bez. Intuicyjne jak cholera ;-)


Podobne wpisy
Coding standards, cz. 2 – ogólne zasady pisania dobrego kodu
Coding standards – intro

Możesz śledzić odpowiedzi do tego wpisu za pomocą RSS 2.0 feed. Możesz leave a response, or trackback z Twojej własne strony.

Komentarze: 6 »

 
  • Coding standards, cz. 1 – konwencje nazewnictwa | Blog o programowaniu C#, ASP.NET…

    Dziękujemy za publikację – Trackback z dotnetomaniak.pl…

  • michal pisze:

    Jeśli chodzi o nazwy to teoretycznie jest to lepszy pomysł, by używać angielskich nazw, ale jak nazwać np. formatkę do naboru kandydatów, do nadzoru, do wniosków opłat itp. Ciągłe tłumaczenie nazw przy pomocy translatora daje nadzwyczaj zabawne rezultaty – szczególnie dla osób znających dobrze angielski.

  • binary pisze:

    tez zawsze uzywam angielskich nazw, utwierdzilem sie w tym procederze ;) jeszcze bardziej gdy przyszlo mi pracowac z baza danych tworzona przez niemieckich programistow. Wiecie jak jest tabela personalna? Mitarbeiter… A z dzialami? Abteilung.

    Sa jeszcze inne nazwy, niektore slowa maja nawet 20 znakow i nic z nich nie kumam. Masakra.

    Podstawa to uzywac angielskiego ktory w obecnym swiecie jest uwazany za jezyk ogolno przyjety dla prac naukowych itp. (tak jak kiedys lacina a w przyszlosci chinski ;)))

    @michal: „np. formatkę do naboru kandydatów, do nadzoru, do wniosków opłat itp. ”

    wystarczy ze dodasz ze 2 „slowa klucze” w nazwie i juz bedzie o niebo bardziej zrozumiale dla kogos obcojezycznego niz polskie nazwy i to bez znakow diakrytycznych.

    Artykul fajny, moze tylko rozszerzyc go jeszcze w dalszych czesciach o prefixy dla kontrolek.
    Ja osobiscie stosuje:
    lb Label
    tb TextBox
    ci Checkbox
    btn Button

    ale przy rzadziej uzywanych mam czesto dilema ;)

    Pozdr.

  • andrzej andrzej pisze:

    @michal, jesli to kontrolki ascx ja nazwalbym je np: Recrutation, Supervision itd. Chodzi o to aby się kojarzyły. Jeśli to będą ascx lub formatki windows forms – raczej każdy załapie o co chodzi. Nie trzeba dodawać RecruationControl czy RecrutationForm – to wynika z kontekstu IMHO ;-)

    @binary, o widzisz, przeoczyłem faktycznie prefixy kontrolek :) osobiście trochę inaczej je stosuje – nie wiem w sumie skąd to się wzięło ale w firmie, w której pracuję chyba wszyscy robią dokładnie tak samo :
    lbl Label
    tb TextBox
    chk Checkbox
    ddl DropDownList
    btn Button
    imgb ImageButton
    ph PlaceHolder
    p Panel

    Uzbieram jakiś komplecik, poszukam jak robią to inni i rozszerzę artykuł. Dzięki za opinie.

  • Uno pisze:

    Zgadzam sie ze wszystkimi punktami, oprocz interfejsow. Ja bym wywalil literke I (wszak to czysto wegierska notacja), niestety MS poszedl ta droga i wszyscy ciagna tak samo dalej.
    Np:
    void PrintAll(List persons)
    wyglada duzo lepiej niz
    void PrintAll(IList persons)
    bo po co mi w tym miejscu informacja ze List to interfejs (poza tym VS potrafi kolorowac interfejsy inaczej niz inne identyfikatory)?

    Co do prefixowania kontrolek skrotami lb cb itd. to tez mi to sie nie podoba. Duzo lepiej uzywac prefiksu obiektu do ktorego sa przypisane kontrolki lub thisa np:
    string name = personForm.name;
    string name = this.name;

  • Bartosz pisze:

    Widziałem ostatnio kod gdzie osobą tak bardzo zasugerowała się tym co było przykładowo podane w książce, że do każdej klasy i metody dodawała przedrostek My.. np. MyLoad, MyTools, MyPobierzDane i wszystko było „My”.

 

Dodaj komentarz

XHTML: Możesz użyć następujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*