Nieczytelne nazwy funkcji to identyfikatory nieopisujące działania kodu, utrudniające jego utrzymanie.
Na czym polega problem z nieczytelnymi nazwami funkcji
Nieczytelna nazwa funkcji to taka, która nie pozwala szybko ustalić, jakie działanie wykonuje dana część programu. Przykładami mogą być identyfikatory f1(), go(), proc() albo abc(), jeśli w projekcie nie towarzyszy im dodatkowy, jednoznaczny kontekst. Problem występuje również wtedy, gdy nazwa jest zbyt ogólna, na przykład handleData(), mimo że funkcja w rzeczywistości filtruje rekordy, zapisuje je do pliku i generuje komunikat dla użytkownika. Sama poprawność składniowa takiego kodu nie oznacza, że jego znaczenie jest czytelne.
Nazwa funkcji powinna wskazywać przede wszystkim na czynność oraz, w razie potrzeby, na obiekt, którego ta czynność dotyczy. Identyfikator calculateInvoiceTotal() przekazuje więcej informacji niż calculate(), a loadUserPreferences() jest dokładniejszy niż load(). W przypadku funkcji zwracających wartość warto uwzględnić czasownik sugerujący odczyt lub obliczenie, natomiast funkcje zmieniające stan mogą używać czasowników takich jak update, save, remove albo reset. Konkretna konwencja zależy od języka i projektu, ale sens nazwy powinien być możliwy do odczytania bez analizowania całej implementacji.
Skutki dla utrzymania i diagnozowania programu
Nieczytelne identyfikatory zwiększają koszt każdej późniejszej zmiany. Programista, który trafia na wywołanie funkcji o nazwie process(), musi otworzyć jej definicję, przeanalizować instrukcje warunkowe, sprawdzić typ wartości zwracanej i prześledzić wszystkie miejsca użycia. Przy funkcji o nazwie validateNetworkConfiguration() część tej informacji jest dostępna od razu. Ma to znaczenie podczas naprawiania błędu, przeglądu kodu oraz odtwarzania działania aplikacji po dłuższej przerwie.
Niejasne nazwy utrudniają także ocenę przepływu danych. Gdy kilka funkcji nazywa się podobnie, na przykład updateData(), processData() i changeData(), trudno określić, która z nich tylko sprawdza dane, która je przekształca, a która zapisuje wynik. Może to prowadzić do błędnego użycia funkcji, wielokrotnego wykonywania tej samej operacji albo pominięcia koniecznego kroku. W kodzie obsługującym pliki, konfigurację systemu lub urządzenia peryferyjne nieprecyzyjna nazwa może również ukrywać operację powodującą trwałą zmianę, taką jak usunięcie pliku albo nadpisanie ustawień.
Zasady tworzenia jednoznacznych identyfikatorów
Przy zmianie nazwy warto opisać działanie funkcji możliwie konkretnie, ale bez wpisywania do identyfikatora całej implementacji. Nazwa parseJsonConfig() informuje o formacie danych i rodzaju czynności, podczas gdy doEverythingWithConfig() nie określa żadnego użytecznego szczegółu. Dobrze, gdy nazwa odpowiada rzeczywistemu zakresowi odpowiedzialności funkcji. Jeżeli funkcja jednocześnie pobiera dane, je waliduje i zapisuje, sama zmiana identyfikatora może nie wystarczyć; taki kod może wymagać podziału na mniejsze funkcje, na przykład fetchRecords(), validateRecords() i saveRecords().
Należy zachować spójność nazewnictwa w całym projekcie. Jeśli odczyt ustawień jest oznaczany jako load, nie powinno się bez powodu używać w innym miejscu słowa fetch dla tej samej operacji. Nazwy powinny również odróżniać czynności podobne, lecz nieidentyczne, takie jak findUserById(), findUsersByRole() i countUsersByRole(). Warto unikać skrótów zrozumiałych tylko dla autora kodu, nazw zależnych od chwilowego interfejsu oraz identyfikatorów opisujących sposób wykonania zamiast celu. Po zmianie nazw trzeba sprawdzić wszystkie wywołania, testy, dokumentację i komunikaty diagnostyczne, aby nie pozostawić niespójnych odwołań.
Znaczenie czytelnego kodu w pracy serwisu komputerowego
W aplikacjach używanych na laptopach i komputerach PC czytelne nazwy funkcji ułatwiają analizę problemów związanych między innymi z uruchamianiem programu, zapisem konfiguracji, obsługą sterowników, komunikacją z urządzeniami oraz przetwarzaniem plików. Podczas diagnostyki istotne jest rozróżnienie funkcji, która tylko odczytuje stan podzespołu lub systemu, od funkcji, która zapisuje ustawienia albo wykonuje operację naprawczą. Jednoznaczne identyfikatory pomagają szybciej powiązać komunikat z logu z konkretnym fragmentem kodu i ograniczyć ryzyko modyfikacji niewłaściwego miejsca.
Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów, komputerów PC i podzespołów, a w przypadku aplikacji używanych na tych urządzeniach czytelny kod ułatwia techniczną diagnostykę oraz późniejsze utrzymanie oprogramowania. Przy ocenie problemu warto zwrócić uwagę nie tylko na sam komunikat błędu, lecz także na nazwy funkcji widoczne w logach, dokumentacji lub narzędziach deweloperskich. Jeżeli identyfikatory nie opisują wykonywanych operacji, analiza może wymagać dodatkowego prześledzenia kodu, konfiguracji i kolejności wywołań. Uporządkowane nazewnictwo zmniejsza liczbę pomyłek podczas poprawek i ułatwia przekazanie projektu innemu programiście.