programowanieProgramista iOS

Opisz cechy wzorca 'Programowanie oparte na protokołach' w Swift i powiedz, czym różni się od klasycznego podejścia obiektowego.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W Swift duży nacisk kładzie się na Programowanie oparte na protokołach (POP). Główną ideą POP jest projektowanie architektury, zaczynając od protokołów (interfejsów), a nie od klas bazowych. Protokół daje elastyczność dziedziczenia zachowań przez wiele łańcuchów, zmniejszając powiązania kodu.

Swift pozwala protokołom mieć domyślne implementacje (poprzez rozszerzenia), co sprzyja ponownemu użyciu kodu bez potrzeby hierarchii klas. Klasyczne OOP opiera się na dziedziczeniu między klasami, co ogranicza się tylko do jednego łańcucha dziedziczenia. POP jest wolne od tych ograniczeń, pozwalając na kompozycję i rozszerzalność.

Przykład kodu:

protocol Drivable { func drive() } extension Drivable { func drive() { print("Jazda do przodu!") } } struct Car: Drivable {} let car = Car() car.drive() // Wyświetli: Jazda do przodu!

Pytanie z haczykiem.

Czy można dodać właściwość przechowywaną (stored property) w rozszerzeniu protokołu?

Odpowiedź: Nie, w rozszerzeniach protokołów nie można dodawać właściwości przechowywanych (stored), tylko obliczane (computed) oraz metody. Na przykład,

// Błąd! extension Drivable { var speed: Int = 0 // Błąd kompilacji: Rozszerzenia nie mogą zawierać właściwości przechowywanych }

Przykłady rzeczywistych błędów spowodowanych brakiem znajomości szczegółów tematu.


Historia

W dużym projekcie programiści próbowali dodawać właściwości przechowywane przez rozszerzenia protokołów do śledzenia stanu. Kod kompilował się z błędem, co zmusiło ich do pilnej przebudowy architektury w trakcie sprintu, aby użyć zewnętrznych rozwiązań z objc_get/setAssociatedObject — co pogorszyło czytelność kodu.


Historia

W projekcie zaimplementowano klasę bazową dla różnych typów encji z wykorzystaniem wielokrotnego dziedziczenia przez protokoły. Programista pomylił się w zachowaniu domyślnej implementacji w rozszerzeniu i próbował nadpisać tę metodę w strukturze, oczekując, że wywołana zostanie właśnie implementacja w strukturze. W rezultacie trudno było śledzić kolejność wywoływania metod.


Historia

Podczas skalowania modułu używano protokołów do podziału odpowiedzialności, ale z powodu braku doświadczenia w POP, programiści nie zapewnili jawnych zależności między protokołami. Doprowadziło to do duplikacji kodu i pojawienia się konfliktów interfejsów przy łączeniu kilku rozszerzeń w dużych zespołach deweloperskich.