ProgrammierungiOS Entwickler

Beschreiben Sie die Merkmale des 'Protocol Oriented Programming' in Swift und erläutern Sie, wie es sich vom klassischen objektorientierten Ansatz unterscheidet.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In Swift liegt ein großer Schwerpunkt auf Protocol Oriented Programming (POP). Die Hauptidee von POP besteht darin, die Architektur mit Protokollen (Schnittstellen) zu entwerfen, statt mit Basis-Klassen. Protokolle bieten die Flexibilität, das Verhalten über mehrere Ketten hinweg zu erben, wodurch die Kopplung des Codes verringert wird.

Swift ermöglicht es Protokollen, Standardimplementierungen (über Extensions) zu haben, was die Wiederverwendbarkeit des Codes ohne die Notwendigkeit von Klassenhierarchien fördert. Das klassische OOP stützt sich auf die Vererbung zwischen Klassen, was nur eine Kette der Vererbung erlaubt. POP ist von diesen Einschränkungen befreit, da es Komposition und Erweiterbarkeit ermöglicht.

Code-Beispiel:

protocol Drivable { func drive() } extension Drivable { func drive() { print("Fahre vorwärts!") } } struct Car: Drivable {} let car = Car() car.drive() // Gibt aus: Fahre vorwärts!

Fangfrage.

Kann man ein gespeichertes Property (stored property) in einer Protokoll-Extension hinzufügen?

Antwort: Nein, in Protokollerweiterungen können keine gespeicherten (stored) Eigenschaften hinzugefügt werden, nur berechnete (computed) Eigenschaften und Methoden. Zum Beispiel,

// Fehler! extension Drivable { var speed: Int = 0 // Kompilierungsfehler: Erweiterungen dürfen keine gespeicherten Eigenschaften enthalten }

Beispiele aus der Praxis, die durch Unkenntnis der Feinheiten des Themas entstanden sind.


Geschichte

In einem großen Projekt versuchten die Entwickler, gespeicherte Eigenschaften über Protokollerweiterungen für die Zustandsverfolgung hinzuzufügen. Der Code wurde mit Fehlern kompiliert, was dazu führte, dass die Architektur mitten im Sprint umgestaltet werden musste, um externe Lösungen mit objc_get/setAssociatedObject zu verwenden – was die Lesbarkeit des Codes verschlechterte.


Geschichte

Im Projekt wurde eine Basis-Klasse für verschiedene Entitätstypen implementiert und es wurde Mehrfachvererbung über Protokolle verwendet. Der Entwickler verwechselte das Verhalten der Standardimplementierung in der Extension und versuchte, diese Methode in der struct zu überschreiben, in der Erwartung, dass die Implementierung in der struct aufgerufen wird. Letztlich war es schwierig, die Reihenfolge der Methodenaufrufe nachzuvollziehen.


Geschichte

Beim Skalieren des Moduls wurden Protokolle verwendet, um die Verantwortlichkeiten zu trennen, aber aufgrund fehlender Erfahrung mit POP gewährten die Entwickler keine expliziten Abhängigkeiten zwischen den Protokollen. Dies führte zu Code-Duplikationen und Interface-Konflikten beim Zusammenführen mehrerer Extensions in großen Entwicklungsteams.