Einkapseln von Daten für gutes Design und Wartbarkeit in Swift

Betrachten wir das Konzept der Verkapselung, ein wichtiges Konzept von Objekt # 8208 orientierte Programmierung. Die Idee hinter Verkapselung ist, dass Objekte undurchsichtig sein sollte: Sie sollten nicht in der Lage sein zu sagen, was in einer App Daten ist, welche Funktionen es enthält, oder welche Operationen sie ausführt. Dadurch Ihre Objekte flexibel und wieder verwendbar macht.

Dieses Konzept hat sich bereits in den letzten Jahren bewährt. Das Original # 173-Architektur von Ziel # 8208-C bestand aus Gerüste von Objekten (obwohl das Wort # 147-Rahmen # 148- wurde nicht am Anfang verwendet wird). Die Objekte wurden opak, so dass Software-Entwickler nicht in ihnen (oder zumindest waren sie nicht anzunehmen) aussehen könnte. Ein Objekt mit dem Namen (sagen wir) myObject, wurde angenommen, einige Daten zu haben - vielleicht genannt Daten - und diese Daten selbst war off # 8208-Grenzen für Entwickler.

Anstatt die Daten direkt von den Zugriff auf gelernt Entwickler eine Nachricht zu senden an myObject seine Daten zu erhalten. Vereinbarungsgemäß würde die Meldung mit den Namen Object und würde dazu führen, myObject zurückkehren, um die Daten von myObject.

Wenn Sie an diesem Entwurf näher betrachten, myObject ist die Klassen- Object ist der Name der Funktion oder des Verfahrens, die als eine dient Getter. Eine andere Methode genannt (Standardeinstellung) setObjectData ist der Setter. Der Setter ist ein einziger Parameter (in der Regel genannt (newObjectData).

Sie würden nur den Zugang Object entweder Object um es oder setObjectData zu setzen oder zu aktualisieren. Eine interessante und nützliche Konsequenz dieser Konstruktion ist, dass Object (Die gespeicherten Daten durch myObject) Nicht überhaupt existieren.

Die Accessoren (Object und setObjectData) Können mit dynamischen Daten arbeiten, die nie tatsächlich gespeichert werden kann. Mit Kapselung wie diese, würden Sie nie wissen müssen, ob die Daten gespeichert werden oder im laufenden Betrieb berechnet. Alles, was Sie wissen müssen, ist, dass myObject wird für Sie Daten mit Object und nimmt Daten von Ihnen mit setObjectData.

Solange beide Accessoren arbeiten, sei es on the fly berechnet ist, in einer Datenbank gespeichert sind, oder sogar auf dem Mond gespeichert spielt keine Rolle: myObject Verkapselungen seine Daten.

Andere Sprachen Ihnen erlauben würde, die den Zugriff auf Daten direkt eine Syntax wie myObject.objectData, aber weil die tatsächliche Bezugnahme auf die Daten in diesem Fall wäre myObject.objectData () - ein Verfahren oder Funktionsaufruf (die Klammern am Ende beachten) - Kapselung ist abgeschlossen.

Die hypothetische Syntax in den vorstehenden Absätzen gezeigt ist eine generische Version von modernen Syntax oder # 147-Punkt-Syntax # 148- verwendet in Ziel # 8208-C aus den späten 1990er Jahren weiter. Mit dem ursprünglichen Stil des Ziels # 8208-C (manchmal genannt Nachrichtenformat) Ist der Weg das zu senden Object Nachricht an myObject mit Code wie folgt wäre: [MyObject Object].

Schaffung und Erhaltung von Verkapselung wurde ein wichtiger Bestandteil der Zielsetzung # 8208-C Entwicklung. Es ist wahr, dass Kapselung viele der leistungsstarken Funktionen von Ziel # 8208-C bewahrt und macht Wiederverwendung von Code wesentlich einfacher, aber in einigen Fällen kann Verkapselung ein bisschen komplizierter zu schreiben und manchmal auch mehr Ressourcen braucht, um auszuführen.

Obwohl also die Struktur nicht besonders kompliziert, Speichern, Abrufen und den Wert einer Variablen Einstellung erfordert drei Elemente.

Die Komponenten dieser Struktur sind:

  • eine Ist-Größe oder einen Code zu berechnen es (das für Sie alle unsichtbar ist)

  • ein Getter Methode, um den Wert der Variablen zu erhalten (dies ist für Sie sichtbar)

  • eine Setter-Methode den Wert der Variablen (dies ist für Sie sichtbar) einstellen

In den Ziel-# 8208-C 2 (im Jahr 2007 veröffentlicht), benannte Eigenschaften wurden vorgestellt. Sie bieten eine Möglichkeit, um diese Struktur zu vereinfachen, aber sie sind vollständig kompatibel mit ihm. Eine benannte Eigenschaft hat ein Format wie folgt aus:

@property (stark, nonatomic) id detailItem- @ Eigenschaft (schwach, nonatomic) IBOutletUILabel * detailDescriptionLabel-

Die Eigenschaft beginnt mit der Compiler-Direktive @Eigentum gefolgt von Speicher und Verwendungsattribute in Klammern, wie beispielsweise stark, schwach, schreibgeschützt, und nonatomic - die spezifischen Bedeutungen nicht an diesem Punkt wichtig.

Im Anschluss an die in Klammern gesetzten Attribute die Art der Immobilie und dann seinen Namen. Für Objekttypen wird ein Zeiger verwendet. Der Klassentyp Ich würde ist kein Zeiger. Wieder Angelegenheit die Details an dieser Stelle nicht.

Was tut, ist Sache, dass mit einer Eigenschaft Erklärung, der Compiler in der Lage ist, automatisch deklarieren und erstellen Unterstützung variabler, die die Variable selbst, wo die Daten gespeichert sind. Es auch in der Lage ist, einen Getter und einen Setter mit den Konventionen zuvor beschrieben (der Getter zu schaffen, ist der Name der Variablen und der Setter ist setMyVariable).

Mehrere Konventionen kommen hier ins Spiel. Variablennamen beginnen mit einem Kleinbuchstaben. Wenn der Variablenname aus mehreren Wörtern besteht, also nach dem ersten mit Großbuchstaben beginnen (dies wird als camelcase). Methoden und Funktionen beginnen mit Klein Buchstaben- Klassen mit Großbuchstaben beginnen. Die Konventionen erfüllen im Namen eines Setter auf.

Betrachten wir eine Variable mit dem Namen myVariable deren Setter aufgerufen setMyVariable. Dies entspricht der Konvention, die Methoden mit Kleinbuchstaben beginnen, und es entspricht auch dem camelcase-Konvention. Da jedoch das Zusammentreffen dieser beiden Konventionen könnte den Namen vorschlagen setmyVariable, Camelcase hat Vorrang vor anderen Konventionen.

Somit reduzieren genannten Eigenschaften die Menge der Typisierung erforderlichen Eigenschaften zu verwenden, indem Sie den Compiler, die die Arbeit machen zu schaffen, die Getter und Setter-Zugriffs- und die Unterstützung Variable zu schaffen.

In einigen Fällen haben die Entwickler mehr Kontrolle über Angelegenheiten benötigt. Die beiden häufigsten Fälle von diesen waren die folgenden:

  • Wenn ein Entwickler braucht eine Träger Variable einen bestimmten Namen haben und muss in der Lage sein, direkt zuzugreifen.

  • Wenn der Setter oder Getter muss mehr tun, als nur den Wert einer Variable oder erhalten.

Hier ist, wo die Komplexität zu kommen beginnt.

Die automatisierte Eigenschaft Synthesizer synthetisiert eine Unterstützung Variable mit dem Eigenschaftsnamen durch einen Unterstrich vorangestellt. So sichern die Standardvariable für mein Eigentum ist _mein Eigentum. (Sie können dies als eine Option in der Eigenschaft Erklärung.)

Sie können auch Ihre eigenen Accessoren schreiben. Es ist üblich, sie führen zusätzliche Aufgaben weit über die einfache Zugriffs Rollen zu haben. Einer der häufigsten dieser Aufgaben wird zur Festlegung einer Datenbankverbindung, so dass ein Getter einen zuvor gespeicherten Wert für die Eigenschaft erhalten kann.

Es gibt viele andere Variationen dieser Struktur (einschließlich Eigenschaften, die keine Unterstützung Variablen sondern verlassen sich einfach auf einem Getter zu berechnen oder einen Wert auf als # 8208 Bedarfsbasis abgerufen werden). Und genau diesen Teil des Bildes zu vervollständigen, können Sie Eigenschaften mit herkömmlichen Variablen (nackte Variablen sind nicht Teil einer deklarierte Eigenschaft) mischen.

Viele der Argumente gegen die Verwendung von benannten Eigenschaften (und sie haben bitter gewesen) drehen sich um die Tatsache, dass eine benannte Eigenschaften Wert in der Träger variablen Zugriff auf mehrere Rechner-Ressourcen erfordert als nur einen Speicherplatz zugreifen. Mit der heutigen Computer - auch in mobilen Geräten - dies mag wie eine extreme Reaktion scheinen, aber es ist in manchen Kreisen üblich.

Das also ist die Welt der Objekte und Variablen, die Swift-Adressen. Ob alle seine Komplexität und Kombinationen notwendig sind, ist der Rede wert: Alle haben gefunden, Verwendungen in Anwendungen und auch in den Apple-Frameworks, die Cocoa und Cocoa Touch bilden.

Es ist eine weitere Ebene der Komplexität hinsichtlich der Erklärungen # 173-Eigenschaften und Variablen. Die meisten Erklärungen in Klassen von Ziel # 8208-C-Code werden in einer Header-Datei in die platziert @Schnittstelle Abschnitt. (Vereinbarungsgemäß wird diese Datei mit einem .h nach dem Klassennamen benannt.)

Ziemlich vor kurzem (in den späten 2000er Jahren) wurde es üblich ein zweites hinzufügen @Schnittstelle Abschnitt in dem Format einer Klassenerweiterung in den Hauptkörper der Klassendatei (die Datei mit dem .m Erweiterung). Erklärungen in der Header-Datei kann in Abschnitte mit unterschiedlichen Zugriffs gruppiert werden - Öffentlichkeit, Privat-, und geschützt. Öffentlichkeit und Privat- Schnittstellen sind genau das. geschützt Interface-Elemente sind sichtbar für die Klasse selbst und zu einer ihrer Unterklassen.

Schließlich in der Hauptdatei (die .m Erweiterungsdatei), können Sie die Backup-Variable zugreifen, indem Sie ihren Namen, wie in _myBackingVariable. Dies umgeht die Verwendung der Getter und spart ein paar Maschinenzyklen. Es kann auch # 8208-Schritt-Seite eine beliebige # 173 zusätzliche Verarbeitung, die das Getter Does dieser Konvention sehr nützlich sein kann.

Dies ist der Hintergrund von Eigenschaften und Variablen in den Ziel-# 8208-C und jetzt in Swift.

Menü