Was ist der effizienteste Weg, um unveränderliche und veränderbare Versionen einer objective-c-Klasse zu erstellen?

9

Angenommen, ich mache eine Objective-C-Klasse, die einen Bruch repräsentiert, und möchte unveränderliche und veränderbare Versionen erstellen.

Wenn Sie den Mustern im Foundation-Framework folgen, können Sie erwarten, dass die Methode fractionByAddingFraction: in der unveränderlichen Version und addFraction: in der änderbaren Version angezeigt wird.

Das Paradoxe, auf das ich stoße, ist, wie man die Bruchteil-Addierlogik nur einmal zwischen den beiden Klassen einbezieht. Es scheint, dass die unveränderliche fractionByAddingFraction: -Methode die veränderbare addFraction: -Methode kennen und nutzen muss, um Code-Duplikation zu vermeiden, und die Einbeziehung der veränderbaren Methoden in die Implementierung der unveränderlichen Klasse bedeutet jedoch, dass sie denkbar sind rief das unveränderliche Objekt auf, das den Punkt besiegt.

Eine kurze Erklärung (oder noch besser, eine Fortsetzung dieses vereinfachten Beispiels) wäre sehr zu begrüßen!

    
user1385983 10.05.2012, 02:12
quelle

2 Antworten

3

Ihre Vorgehensweise ist richtig (wenn Sie wirklich eine veränderbare Unterklasse benötigen, die Sie vermeiden sollten, wenn Sie sie nicht wirklich brauchen). Ich bin nicht ganz klar, wo die Verwirrung hereinkommt. Sie würden addFraction: am einfachsten mit fractionByAddingFraction: implementieren. Es wäre ein wenig ineffizient, aber das ist die Richtung, die am sinnvollsten wäre. Etwas wie:

%Vor%

Aber normalerweise würden Sie wahrscheinlich mit einer privaten _GetInternalStuffByAddingInternalStuffs() Funktion, die beide Klassen verwenden würden, effizienter umgehen.

    
Rob Napier 10.05.2012, 02:22
quelle
0

Die primären Implementierungen von Foundation's Kollektionen betrügen: Es gibt nur eine Implementierung, die eine Unterklasse von NSMutableFoo ist, und sie hat ein privates Veränderbarkeits-Flag. Dies bedeutet, Client-Code kann nicht testen, ob ein bestimmtes Objekt veränderbar ist oder nicht, aber das wäre sowieso nie eine gute Idee außer vielleicht für Debugging und Assertions.

    
Jens Ayton 10.05.2012 06:12
quelle