Środkowa sekcja kobiety biznesmenki używającej komputera na biurku w biurze

Poprawne nazewnictwo w programowaniu – jak nazywać zmienne, funkcje i klasy

8 min. czytania

Przemyślane, opisowe nazwy zmiennych, funkcji i klas to najtańszy i najskuteczniejszy sposób na poprawę jakości kodu – szczególnie w projektach webowych, gdzie liczą się czytelność i dostępność dla całego zespołu. Dobra nazwa sprawia, że kod staje się samowyjaśniający, zmniejsza zapotrzebowanie na komentarze i skraca czas potrzebny na zrozumienie logiki.

Poniżej znajdziesz praktyczny przewodnik, jak nazywać zmienne, funkcje i klasy w projektach webowych.

Dlaczego nazewnictwo ma aż takie znaczenie?

Najważniejsze powody, dla których nazwy mają krytyczny wpływ na jakość i tempo pracy w projekcie:

  • nazwy są głównym nośnikiem informacji o kodzie – to na nie programista patrzy w pierwszej kolejności, próbując zrozumieć „co tu się dzieje”;
  • złe nazwy utrudniają odbiór i wprowadzają w błąd – nieprecyzyjne lub ogólne pojęcia wymuszają dodatkowe komentarze i debugowanie;
  • dobre nazwy zmniejszają potrzebę komentarzy – jeśli nazwa wymaga komentarza, to zwykle znaczy, że sama jest źle dobrana;
  • spójne nazwy są podstawą czytelnego kodu zespołowego – jedna konwencja w całym projekcie ułatwia pracę wielu osobom.

Z perspektywy dostępności organizacyjnej nazewnictwo pomaga w codziennej współpracy:

  • ułatwia testerom i UX writerom powiązanie fragmentów kodu z elementami interfejsu,
  • redukuje błędy w integracji z semantyką HTML i ARIA (np. gdy nazwa komponentu jasno wskazuje modal, dialog czy przycisk),
  • czyni projekt bardziej „przejrzystym mentalnie” dla osób o różnym poziomie doświadczenia.

Ogólne zasady dobrego nazewnictwa

Używaj nazw opisowych i znaczących

Nazwy powinny jednoznacznie wyjaśniać cel istnienia i przeznaczenie elementu. Dla klas i zmiennych odpowiadaj na pytanie: co to jest; dla funkcji: co to robi. Przykłady: zamiast x użyj userCount; zamiast process()generatePdfInvoice(). IBM zaleca, by nazwy jasno wyrażały cel: dlaczego coś istnieje, co przechowuje lub co wykonuje.

Unikaj skrótów i zlepków liter

Skróty zwykle są wieloznaczne, a zbitki typu usrCnt, cfgMgr pogarszają czytelność. Lepsze są pełne, zrozumiałe słowa: userCount, configManager, primaryButtonLabel.

Nie używaj nazw mylących lub zbyt ogólnych

Stosuj nazwy doprecyzowane kontekstem, aby uniknąć wieloznaczności:

  • nie używaj nazw, które mogą mieć więcej niż jedno znaczenie,
  • unikaj ogólników typu data, info, message; preferuj userRegistrationData, errorMessageForScreenReader,
  • nie różnicuj nazw drobnymi detalami bez spójnej semantyki (np. user, users, userData, userInfo).

Spójność to podstawa

Przyjmij jedną konwencję i trzymaj się jej w całym projekcie:

  • stosuj konsekwentnie camelCase, PascalCase lub snake_case w zależności od warstwy,
  • dla tej samej operacji używaj jednego rdzenia nazwy (np. wszędzie fetch, a nie raz get, raz retrieve),
  • jedno słowo dla jednego pojęcia – nie używaj tego samego słowa do różnych zagadnień.

W CSS i frontendzie świetnie sprawdza się konwencja BEM.

Nie komplikuj – KISS

KISS (Keep It Simple, Stupid) oznacza proste, zwięzłe nazwy bez zbędnych ozdobników. Dobrze, jeśli identyfikator ma 2–4 słowa – zwykle zapewnia to równowagę między precyzją a zwięzłością.

Nie używaj jednowyrazowych nazw (z wyjątkami)

Jednoliterowe identyfikatory są trudne do wyszukiwania i nie niosą kontekstu. Wyjątkiem są lokalne liczniki pętli, np. i, j.

Nie mieszaj języków

Używaj jednego języka w kodzie – najlepiej angielskiego. To ułatwia współpracę i integrację z dokumentacją, API oraz warstwą UI.

Nazewnictwo zmiennych

Zmienne opisują co przechowują

Nazwa zmiennej powinna jasno komunikować, co przechowuje i do czego służy. Przykłady dobrych wzorców:

  • loggedInUser zamiast user – precyzuje stan użytkownika,
  • cartItemCount zamiast count – określa kontekst liczby,
  • primaryButtonAriaLabel zamiast label – jasno wskazuje, że chodzi o etykietę ARIA.

Dobre praktyki:

  • używaj pełnych słów i unikaj skrótów,
  • rezygnuj z pustych etykiet typu part1, sectionA,
  • odzwierciedlaj język domeny biznesowej w nazwach.

Nazwy dla wartości logicznych (boolean)

Stosuj czytelne prefiksy: isVisible, isLoading, hasErrors, shouldFocusInput. Takie nazwy od razu sugerują typ i ułatwiają czytanie warunków.

Magiczne liczby i „liczby też można nazywać”

Unikaj magicznych liczb w kodzie – zastępuj je nazwanymi stałymi.

„Liczby też można nazywać”.

Źle i dobrze w praktyce:

// Źle
if (timeout === 4) {
// ...
}

// Dobrze
const MAX_LOGIN_ATTEMPTS = 4;
if (loginAttempts === MAX_LOGIN_ATTEMPTS) {
// ...
}

Dzięki temu:

  • kod staje się samowyjaśniający,
  • zmiany są prostsze (wartość w jednym miejscu),
  • łatwiej odnaleźć reguły biznesowe w testach i audytach.

Różnicowanie podobnych zmiennych

Nie twórz nazw różniących się subtelnie, jeśli reprezentują różne byty. Jeśli musisz, umieszczaj różnicę na końcu: userAddressHome, userAddressWork (zamiast homeUser, workUser), co ułatwia wyszukiwanie i zmniejsza ryzyko pomyłek.

Nazewnictwo funkcji i metod

Funkcje odpowiadają na pytanie: co to robi?

Nazwy funkcji powinny być czasownikami lub wyrażeniami czasownikowymi i jasno mówić, co robią lub co zwracają. Zalecany wzorzec to „czasownik + rzeczownik”. Przykłady:

  • calculateMonthlyRevenue() zamiast monthlyRevenue() – jasno wskazuje obliczanie,
  • printDocument() zamiast document() – nazwa akcji jest oczywista,
  • checkOrderInfo() zamiast orderCheck() – zachowany naturalny szyk i intencja.

Funkcje zwracające wartość vs procedury

Warto rozróżniać nazewnictwo: metody zwracające mogą opisywać wartość (printer.isReady(), pen.currentColor()), a procedury powinny być jawną akcją (printDocument(), repaginateDocument()).

Gettery, settery i predykaty

Dla akcesorów i metod pytających o stan sprawdzają się standardowe prefiksy:

  • get – np. getUserName();
  • set – np. setUserName(name);
  • is – np. isUserLoggedIn().

Taka konwencja:

  • ułatwia rozpoznanie roli metody,
  • poprawia czytelność warunków,
  • dobrze współgra z frameworkami i narzędziami.

Unikaj nadmiernie ogólnych czasowników

Metody typu handle(), process(), doStuff(), a także niejednoznaczne run() niewiele mówią. Lepiej rozbijać złożone operacje na mniejsze, nazwane precyzyjnie, np. validateForm(), submitForm(), showValidationErrors().

Nazewnictwo klas i typów

Klasy odpowiadają na pytanie: co to jest?

Nazwy klas powinny być rzeczownikami i reprezentować pojęcie, obiekt domenowy lub komponent. Przykłady: User, ShoppingCart, OrderRepository, HomePageLayout. Dla klas stosuj PascalCase.

Spójne sufiksy i wzorce w aplikacjach webowych

Używaj spójnych sufiksów opisujących rolę: Controller, Service, Repository, Component, Page. Nazwa powinna odzwierciedlać konkretną odpowiedzialność (np. odróżnij NotificationService od NotificationClient zamiast wszystko nazywać MainService).

Nazewnictwo w projektach webowych a dostępność

Nazwy komponentów i dostępność

W aplikacjach SPA komponenty często odpowiadają bezpośrednio elementom UI. W praktyce sprawdza się, gdy:

  • nazwa komponentu jasno wskazuje rodzaj i rolę UI, np. ModalDialog, PrimaryButton, AccessibleAccordion,
  • komponenty istotne dla dostępności zawierają to w nazwie, np. ScreenReaderOnlyText, SkipToContentLink,
  • elementy formularzy sygnalizują walidację i etykiety, np. FormFieldWithError, EmailInputField.

Nazwy klas CSS a semantyka

W CSS najlepiej trzymać się jednej konwencji, np. BEM, oraz nazywać klasy przez pryzmat roli, nie wyglądu:

  • trzymaj się wybranej konwencji (np. BEM),
  • opisuj rolę/znaczenie zamiast wyglądu,
  • lepiej primary-button niż blue-btn,
  • lepiej visually-hidden niż sr-only (chyba że sr-only to ustalona konwencja w zespole),
  • klasy dostępności powinny jasno komunikować działanie (np. visually-hidden).

Nazwy atrybutów i identyfikatorów (id)

Id w HTML łączą elementy (np. for w label z id w input) oraz są używane w ARIA (np. aria-labelledby). Stosuj id, które jasno wskazują powiązania (np. login-email-label, login-email-input), unikaj div1, input3, które utrudniają debugowanie.

Konwencje nazewnicze w różnych językach i warstwach

Poniższa tabela syntetyzuje praktyczne zalecenia dla najpopularniejszych warstw w projektach webowych:

Warstwa / język Zmienne i funkcje Klasy / komponenty Stałe Uwagi
JavaScript / TypeScript camelCase PascalCase UPPER_SNAKE_CASE trzymaj jeden rdzeń dla tej samej operacji (np. fetch)
PHP camelCase PascalCase UPPER_SNAKE_CASE konsekwencja i pełne, opisowe nazwy
CSS / SASS kebab-case, BEM (block__element–modifier) $primary-color, $base-font-size nazywaj rolę/znaczenie, nie wygląd
HTML klasy i id: kebab-case id/ARIA powinny odzwierciedlać powiązania

Proces, kultura i narzędzia – jak dbać o nazewnictwo w zespole

Wprowadź reguły i mierz jakość

Ustal normy nazewnictwa, opisz je i egzekwuj narzędziami. W praktyce:

  • spisz zasady w konwencji projektowej (naming convention),
  • dodaj je do dokumentacji technicznej,
  • używaj linterów i formatterów (ESLint, PHP CS Fixer, Stylelint).

Code review – zwracaj uwagę na nazwy

Podczas przeglądu kodu oceniaj nazwy tak samo uważnie, jak logikę:

  • zadaj pytanie: „czy nazwa jasno wyjaśnia, co robi funkcja lub co przechowuje zmienna?”,
  • proponuj lepsze nazwy, gdy widzisz okazję do poprawy,
  • eliminuj skróty i ogólniki na rzecz precyzyjnych określeń.

Refaktoryzuj nazwy bez wahania

Gdy znajdziesz lepszą nazwę, zmień ją we wszystkich miejscach. Nie odkładaj tego – zła nazwa szybko rozprzestrzenia się po kodzie. Wykorzystuj bezpieczne funkcje „rename” w IDE.

Przykłady – złe vs dobre nazwy (web)

Zmienne

Porównanie słabych i dobrych nazw dla zmiennych:

// Źle
let d;
let msg;
let data2;

// Dobrze
let requestDeadline; // opisuje termin, nie tylko „d”
let validationErrorMessage; // zamiast ogólnego msg
let cartItemsData; // konkretny kontekst

Unikaj jednoliterowych i ogólnych nazw – preferuj pełne słowa i kontekst domeny.

Funkcje / metody

Jak przejść od ogólników do precyzyjnych, zrozumiałych akcji:

// Źle
function handle() {
// ...
}

function processData(data) {
// ...
}

// Dobrze
function submitContactForm(formData) {
// ...
}

function normalizeUserResponse(apiResponse) {
// ...
}

Nazwy o wzorcu „czasownik + rzeczownik” jasno komunikują intencję i zakres działania.

Klasy / komponenty

Przykłady nazywania komponentów zgodnie z ich rolą w UI i dostępności:

// Źle
class MainComponent {}
class Helper {}

// Dobrze
class NavigationMenu {}
class SkipToContentLink {}
class AccessibleModalDialog {}