KVC mal einfach - für Cocoa und Java

Die lästige Tipparbeit der Getter und Setter kann bei einigen Klassen in recht monotone, aber aufwändige Arbeit ausarten.
Gut, dass es kleine Helferlein gibt, die das Ganze automatisch erledigen.

Wer in Java entwickelt ist mit Eclipse gut beraten – über das Menü Source > Generate Getters and Setters können die Methoden automatisch generiert werden.
Entsprechende JavaDoc-Kommentare müssen jedoch noch „von Hand“ getippt werden.

Für Cocoa gibt es das kleine, aber mehr als nützliche Tool Accessorizer.
Die entsprechenden Variablendeklarationen werden in das linke Textfeld eingegeben oder kopiert.
Nun kann man sich aus diesen Variablen automatisch die Deklaration (inkl. Headerdoc-Kommentaren), Implementierung, Methoden für die Speicherung mit NSCoder, sowie die Deklaration von init und dealloc generieren lassen.
Bei init muss man nur noch die entsprechenden Default-Werte eintragen.
Accessorizer Screenshot

[more]

Sehr nützlich ist auch die Generierung von Indexed Accessors, wenn man z. B. mit einem NSMutableArray arbeitet.

Beispiele des generierten Codes:

Variablen:


NSString *_firstname;
NSString *_lastname;
NSMutableArray *_orders;

Das Präfix für Member-Variablen kann man unter Options einstellen. Hier ist ein Unterstrich eingestellt, aber es können auch andere Werte (z. B. ein leerer String für kein Präfix) verwendet werden.

Deklaration:


/*!
* @method firstname
* @abstract the getter corresponding to setFirstname
* @result returns value for firstname
*/
- (NSString *)firstname;
/*!
* @method setFirstname
* @abstract sets firstname to the param
* @discussion 
* @param newFirstname 
*/
- (void)setFirstname:(NSString *)newFirstname;
	

/*!
* @method lastname
* @abstract the getter corresponding to setLastname
* @result returns value for lastname
*/
- (NSString *)lastname;
/*!
* @method setLastname
* @abstract sets lastname to the param
* @discussion
* @param newLastname
*/
- (void)setLastname:(NSString *)newLastname;

/*!
* @method orders
* @abstract the getter corresponding to setOrders
* @result returns value for orders
*/
- (NSMutableArray *)orders;
/*!
* @method setOrders
* @abstract sets orders to the param
* @discussion
* @param newOrders
*/
- (void)setOrders:(NSMutableArray *)newOrders;

Das Präfix „new“ vor einer zu setzenden Variable ist ebenfalls in den Optionen einstellbar (Standardwert ist „a“).

Implementierung:


// init
- (id)init
{
    if (self = [super init]) {
        [self setFirstname: <(NSString *)newFirstname>];
        [self setLastname: <(NSString *)newLastname>];
        [self setOrders: <(NSMutableArray *)newOrders>];
    }
    return self;
}
	

//===========================================================
// firstname
//===========================================================
- (NSString *)firstname { return _firstname; }
- (void)setFirstname:(NSString *)newFirstname
{ if (_firstname != newFirstname) { [newFirstname retain]; [_firstname release]; _firstname = newFirstname; }
}

//===========================================================
// lastname
//===========================================================
- (NSString *)lastname { return _lastname; }
- (void)setLastname:(NSString *)newLastname
{ if (_lastname != newLastname) { [newLastname retain]; [_lastname release]; _lastname = newLastname; }
}

//===========================================================
// orders
//===========================================================
- (NSMutableArray *)orders { return _orders; }
- (void)setOrders:(NSMutableArray *)newOrders
{ if (_orders != newOrders) { [newOrders retain]; [_orders release]; _orders = newOrders; }
}

//===========================================================
// dealloc
//===========================================================
- (void)dealloc
{ [_firstname release]; [_lastname release]; [_orders release];

_firstname = nil; _lastname = nil; _orders = nil; [super dealloc]; }

Das Verhalten der Setter, sowie der dealloc-Methode ist über die Optionen einstellbar.

Indexed Accessors: (in diesem Fall nur orders)


///////  _orders  ///////
	

- (unsigned int)countOfOrders;
- (id)objectInOrdersAtIndex:(unsigned int)index;
- (void)insertObject:(id)anObject inOrdersAtIndex:(unsigned int)index;
- (void)removeObjectFromOrdersAtIndex:(unsigned int)index;
- (void)replaceObjectInOrdersAtIndex:(unsigned int)index withObject:(id)anObject;

/* Implementierung */
/////// _orders ///////

- (unsigned int)countOfOrders
{ return [[self orders] count];
}

- (id)objectInOrdersAtIndex:(unsigned int)index
{ return [[self orders] objectAtIndex:index];
}

- (void)insertObject:(id)anObject inOrdersAtIndex:(unsigned int)index
{ [[self orders] insertObject:anObject atIndex:index];
}

- (void)removeObjectFromOrdersAtIndex:(unsigned int)index
{ [[self orders] removeObjectAtIndex:index];
}

- (void)replaceObjectInOrdersAtIndex:(unsigned int)index withObject:(id)anObject
{ [[self orders] replaceObjectAtIndex:index withObject:anObject];
}

Das Programm kann die Implementierung auch in Java ausgeben, allerdings halte ich hier Eclipse für das bessere Programm.

Beide Programme können eine Menge (Tipp)Arbeit ersparen und dabei auch Fehler verringern.


Ähnliche Artikel

Dein Kommentar:

Sämtliche Html-Tags werden gelöscht, der Kommentar kann mit Textile formatiert werden.
Vor dem Absenden müsst ihr euch einmal die Vorschau ansehen.