Rückgabe von Mutable und Rückgabe von unveränderbaren (Nicht-Member-) Objekten

8

Ich sehe kaum, dass der zweite verwendet wird und ich frage mich warum?

  • Weder würde die Unterstützung unterbrechen für Situationen, in denen ein NSArray erwartet wird (da es eine Unterklasse ist).
  • Es würde auch nicht die Kapselung durchbrechen durch Aufdecken von veränderlichen Interna.

Unter der Voraussetzung, dass es nie ein veränderlicher Ivar ist, der zurückgegeben wird, (was sowieso vernünftig sein sollte)
Ich kann im Moment nur an Vorteile denken, wenn ich die zweite benutze.

  • Tatsächlich ist veränderlich. Und das Stummschalten ist hier sicher , also warum verhindern Sie das ?
  • Sie müssen [[[foo fooBar] mutableCopy] autorelease] nicht aufrufen, wodurch unnötigerweise zusätzlicher Speicher zugewiesen wird und unnötig Zeit verschwendet .

Hier sind die Methodenvarianten:

%Vor%

Ich frage als mein Projekt hat eine Reihe von Methoden mit dem gleichen Muster Und in most der Zeiten wird das zurückgegebene -Array nachträglich geändert (zusammengeführt, bearbeitet usw.).
Also denke ich, dass vollkommen in Ordnung sein sollte um NSMutableArrays zurückzugeben, aber niemand scheint es zu tun .

NSMutableArray , NSMutableSet , NSMutableDictionary ... es ist im Grunde das gleiche Geschäft.

    
mtree 13.06.2011, 13:55
quelle

3 Antworten

2

Ich nehme an, die erste Variation wurde bevorzugt, weil Polymorphie bevorzugt wurde.

In beiden Fällen geben beide Methoden eine Instanz von NSMutableArray zurück. Der einzige Unterschied besteht darin, dass die erste Methode diese Tatsache vor dem Aufrufer versteckt. Mit anderen Worten, die erste Variante ist nicht sicherer als die zweite. Es verwendet im Wesentlichen Polymorphie, um dem Aufrufer mitzuteilen, dass jeder Typ von NSArray zurückgegeben werden kann. Wenn Sie diese Flexibilität in Ihrem Code benötigen, hat es definitiv seine Vorteile. (Wenn Sie beispielsweise aus irgendeinem Grund eine benutzerdefinierte Unterklasse NSArray zurückgeben müssen, wird Ihr Code auf dieser Ebene nicht unterbrochen.)

Sie scheinen es jedoch vorzuziehen, dem Aufrufer eine Kommunikationsabsicht zu geben - d. h., dass Sie tatsächlich veränderbare Arrays zurückgeben - was ebenfalls in Ordnung ist. Um alle glücklich zu machen (wenn es so etwas gibt ...), empfehle ich, die 2. Methode umzubenennen auf:

%Vor%

Als Nebenbemerkung denke ich, dass das Folgende ein etwas effizienterer Weg ist, ein existierendes unveränderliches Array in ein veränderliches Array umzuwandeln:

%Vor%

(korrigiere mich, wenn ich mich bei dieser Annahme irre).

Ich hoffe, dies beantwortet Ihre Frage ...

    
octy 13.06.2011, 15:35
quelle
4

Eine Erläuterung zur Verwendung von Mutable versus Immutable finden Sie in der Apple Dokumentation unter Objektwechselbarkeit .

Im Allgemeinen ist es am besten, eine unveränderbare Version zurückzugeben, es sei denn, Sie haben ausdrücklich die Absicht, dass das zurückgegebene Objekt immer ein unveränderliches Objekt ist, das jeder Client ändern kann. Sie sollten Ihre Schnittstellen basierend auf der Absicht der Schnittstelle und nicht außerhalb der aktuellen Implementierung erstellen. Es ist möglich, dass sich die Anforderungen ändern und Sie die Implementierung von fooBar so ändern müssen, dass eine Instanzvariable zurückgegeben wird. Indem Sie änderbare Arrays zurückgeben, stellen Sie sicher, dass Sie nicht nur Ihre Instanzvariablen, sondern auch Ihre aktuelle Implementierung kapseln.

Sie haben also möglicherweise einen gültigen Platz, um ein veränderbares Array zurückzugeben (ich weiß es nicht), aber Sie sehen den meisten Code, der unveränderliche Arrays weiterleitet, weil er ihre Variablen und ihre Implementierungen vollständig kapselt.

    
David V 13.06.2011 15:32
quelle
0

Eine Methode zurückzugeben, die eine veränderbare Instanz zurückgibt, die verdächtig aussieht.

Als Aufrufer müssen Sie die ursprüngliche Methodensignatur in Frage stellen und sich fragen, ob es wirklich sicher ist, den zurückgegebenen Wert zu ändern. Schließlich kann die Klasse versehentlich einen Zeiger auf den internen Status zurückgeben.

Wenn das Profiling zeigt, dass diese Kopie tatsächlich teuer ist, ändere ich normalerweise die Methodensignatur, um deutlich zu machen, dass die Veränderbarkeit beabsichtigt ist. Vielleicht mit etwas wie:

%Vor%

Auf diese Weise ist klar, dass die Veränderlichkeit des Ergebnisses beabsichtigt ist.

    
Jon Hess 13.06.2011 17:26
quelle