Musimy porozmawiać o protokołach w Pythonie
Autor: Idego Group

Python znacznie dojrzał i programiści potrzebują nowoczesnych narzędzi. Język oferuje teraz protokoły jako dobrą alternatywę dla abstrakcyjnych klas bazowych (ABC) i dziedziczenia. Ta funkcja obsługuje typowanie strukturalne poprzez duck typing, czyli zasadę, że jeśli coś chodzi jak kaczka i kwacze jak kaczka, to musi być kaczką.
Artykuł pokazuje to na przykładzie „Domowego ZOO". Tradycyjne abstrakcyjne klasy bazowe wymagają jawnych relacji dziedziczenia. Gdy usuniesz zaimplementowaną metodę z klasy potomnej przy użyciu ABC, tworzenie instancji natychmiast kończy się niepowodzeniem. Jednak protokoły opóźniają sprawdzanie typów do czasu wykonania, gdy metody są rzeczywiście wywoływane.
Kluczowe rozróżnienie: ABC używają typowania nominalnego (opartego na dziedziczeniu), podczas gdy protokoły stosują typowanie strukturalne (oparte na interfejsie). Ta różnica zasadniczo zmienia sposób powiązania klas. Klasy implementujące protokół nie muszą po nim dziedziczyć, zmniejszając zależności w całej bazie kodu.
Znaczącą zaletą jest separacja interfejsów. Zamiast zmuszać funkcje do akceptowania całych obiektów z wieloma metodami, protokoły pozwalają programistom definiować dedykowane interfejsy tylko dla konkretnych funkcji. Odpowiada to zasadom SOLID, zapewniając, że kod zależy tylko od niezbędnej funkcjonalności.
Artykuł uwzględnia kompromisy. Protokoły oznaczają rezygnację z jawnych hierarchii klas: dokumentacja staje się mniej oczywista, gdy relacje nie są deklarowane przez dziedziczenie. Ponadto, gdy tworzenie instancji ma pierwszorzędne znaczenie, ABC pozostają lepszym wyborem, ponieważ zapewniają weryfikację w czasie kompilacji.
Protokoły doskonale sprawdzają się przy używaniu instancji poprzez duck typing, zmniejszając sprzężenie przy jednoczesnym umożliwieniu bardziej elastycznej, eleganckiej organizacji kodu.