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 zdrową alternatywę dla abstrakcyjnych klas bazowych (ABC) i dziedziczenia. Ta funkcja rozwiązuje typowanie strukturalne poprzez duck typing — zasadę, że jeśli coś chodzi jak kaczka i kwacze jak kaczka, to musi być kaczką.
Artykuł demonstruje 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 fundamentalnie zmienia sposób działania sprzężenia. 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ł uznaje kompromisy. Protokoły poświęcają jawne hierarchie klas — dokumentacja staje się mniej oczywista, gdy relacje nie są deklarowane przez dziedziczenie. Ponadto, gdy tworzenie instancji jest pierwszorzędne, ABC pozostają lepszym wyborem, ponieważ zapewniają weryfikację w czasie kompilacji.
Wniosek podkreśla, że 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.