Projektowanie dobrej funkcji
Zanim napiszesz implementację, warto zaprojektować funkcję: jeden jasny obowiązek, zrozumiała nazwa, wyraźny kontrakt.
Dobre imiona – czasowniki akcji
| Dobrze | Zły |
|---|---|
calculate_total() | do_it() |
normalize_text() | func1() |
draw_polygon() | thing() |
find_max_score() | test2() |
Funkcje zwykle przedstawiają DZIAŁANIE — nazwa powinna być czasownikiem lub zwrotem czasownikowym.
Dla funkcji zwracających True/False,
działają dobrze prefiksy is_, has_,
can_, contains_ są heteroseksualni
Zgłasza się, że wartość boolowska wróci.
Jedna funkcja, jedna jasna odpowiedzialność
def process_everything():
# prosi o opinię
# sprawdzone
# liczy się
# odbitki
# Losowanie
# aktualizuje pięć struktur danych
...
def read_answer(): ...
def normalize_answer(answer): ...
def check_answer(answer, correct): ...
def show_result(correct): ...
Ile linii powinna zajmować funkcja?
Nie ma zasady „maksymalnie 10 linijek”
Kontrakt funkcji
Zanim napiszesz implementację, warto wyraźnie sformułować kontrakt — co funkcja przyjmuje, co zwraca i czy ma efekty uboczne:
| Część kontraktu | calculate_discount(price, percent) |
|---|---|
| Loguj | price: liczba, percent: liczba |
| Wyjście | obniżona cena |
| Skutki uboczne | nie |
| Przykład | calculate_discount(100, 10) → 90 |
Warunki wstępne
Niektóre funkcje oczekują znaczących danych wejściowych, takich jak draw_polygon(sides,
length) zakłada sides >= 3 oraz
length > 0. To warunki wstępne — wymagania dotyczące danych wejściowych, które warto sprawdzić zwykłymi warunkami:
def polygon_angle(sides):
if sides < 3:
return None
return 360 / sides
None przy niepoprawnym wejściu — prosty i działający wariant na tym etapie kursu. Bardziej rygorystyczne metody (na przykład zgłoszenie wyjątek) są omawiane w rozdziałach poświęconych obsłudze błędów.Lista kontrolna projektowania cech
Zanim napiszesz def
- Jaką JEDNĄ pracę ona wykonuje?
- Jakie dane potrzebuje? To są parametry.
- Czy zwraca wynik — i jaki wynik?
- Czy to zmienia coś celowo (efekt uboczny)?
- Jak nazwać ją tak, aby nazwa wyjaśniała akcję?
- Na jakich danych wejściowych powinno być testowane?