Wenn wir unsere Gehirne von Object Oriented Programming
auf Protocol Oriented Programming
umstellen, wie kann ich Folgendes tun?
Nehmen wir an, ich habe ein JSON
-Objekt, das Model
darstellt, {created_time, updated_time, type, ...} und diese Werte sind in 5 Model-Objekten üblich.
ist es richtig zu machen, dass ein Protokoll alle obigen Eigenschaften wie die folgenden enthält
%Vor%und dann stimmen alle 5 Strukturen mit diesem Protokoll überein
Ich würde sagen, das ist eine vollkommen gute Lösung. Die Alternative wäre, eine Basisklasse mit diesen Eigenschaften zu haben und alle fünf dieser Modelle von der Basisklasse zu erben, aber es gibt keinen besonderen Grund, die Vererbung hier zu verwenden.
Ein Protokoll ist nur ein "Vertrag", der garantiert, dass eine Klasse bestimmte Eigenschaften oder Verhaltensweisen hat. Für mich fühlt sich Ihr Beispiel hier sehr "vertraglich" an.
Im Gegensatz dazu impliziert Vererbung eine "ist-a" -Beziehung (z. B. ein Ford ist ein Auto). Für mich fühlt sich das eher wie ein Vertrag als ein "ist-a" -Fall an. Natürlich ist keine der beiden Möglichkeiten falsch, aber denke, dass deine Protokollidee hier gut ist.
Apropos protokollorientierte Programmierung Swift 2 verfügt über Protokollerweiterungen, die Standardimplementierungen erlauben. Dies ersetzt auch viele Fälle, in denen Sie stattdessen eine Superklasse verwenden würden.
In diesem Fall:
%Vor%Wenn alle Eigenschaften und Methoden eine Standardimplementierung durch die Protokollerweiterung haben, müssen Sie selbst keine angeben. Sie können sie jedoch nur "überschreiben", indem Sie sie implementieren.
Sie haben also die richtige Entscheidung und sollten Protokolle so oft wie möglich verwenden.
Der einzige große Nachteil ist, dass es keine super
gibt, wo Sie die Standardimplementierungen explizit aufrufen können. Ein Workaround (siehe Antwort ) würde eine Superklasse erfordern, die das Protokoll fast überflüssig macht.