Dobieranie trafnych nazw w kodzie to często wymagające zadanie. Myślę, że niemal każdy programista zgodzi się z tym stwierdzeniem.

Ten temat został poruszony w publikacjach takich jak: Czysty kod. Podręcznik dobrego programisty czy Kod doskonały. Jak tworzyć oprogramowanie pozbawione błędów i na blogu Digital Digressions by Stuart Sierra.

W poniższej notce chciałbym rozszerzyć kwestię dobierania nazw o własne spostrzeżenia.

#1 - A może wyrażenie zamiast nazwy?

Pracując z wysokopoziomowym językiem, takim jak Python, zwykle oceniam czy wybrana część kodu może zostać ujęta w formie wyrażenia.
Drobne wyrażenia często bowiem mówią więcej niż sama nazwa i przede wszystkim nie wymagają dodatkowego skoku do treści funkcji, aby zrozumieć jej działanie.

Więcej na temat wyrażeń można znaleźć w tym wpisie.

#2 - Oceń zakres użycia

Dobra nazwa, podobnie jak abstrakcja, współgra z resztą kodu dopóki ukrywa nieistotne szczegóły. W takiej sytuacji łatwiej jest się skupić na tym co istotne. Tutaj pomocna wskazówka: im mniejszy zakres użycia wybranej zmiennej, tym łatwiej o dobór ogólnej nazwy.

Temat abstrakcji został omówiony tutaj.

Przykład 1:

def xmin(a, b):
    return a if a < b else b

Funkcja xmin porównuje dwie dowolne wartości. Mogą to być np. ceny, ale z perspektywy definicji funkcji nie ma to większego znaczenia, dlatego w tym przypadku nazwy a i b są zupełnie wystarczające.

Przykład 2:

def cheapest_product(products):
    return min(products, key=lambda p: p.price)

Funkcja cheapest_products przyjmuje różne produkty, mogą to być np. książki, filmy, ubrania i stąd nazwa products mimo że ogólna, jest wystarczająca. W definicji lambda użyto także nazwę p, ponieważ jej zakres użycia jest wąski.

Przykład 3:

Poniższa funkcja sprawdza czy komponenty na stronie są posortowane rosnąco względem osi Y.

def ordered(xs):
    for i in len(range(xs) - 1):
        if xs[i] > xs[i+1]:
            return False
    return True
    
    
print(ordered([w.y for w in widgets]))

W kodzie została wyodrębniona funkcja ordered, która odpowiada na pytanie, czy wybrana sekwencja jest posortowana rosnąco. Warto zauważyć, że ta funkcja jest oderwana od przypadku użycia, nie pojawia się tutaj nazwa widgetu, lecz tylko xs, która oznacza sekwencję wartości.

Podsumowanie

Wszystkie trzy przykłady pozwalają na stosowanie krótkich i ogólnych nazw, ponieważ funkcje są oderwane od ich kontekstu.