Ho avuto alcune discussioni relative all'uso di proprietà e variabili di istanza al lavoro, quindi mi piacerebbe trovare una risposta wiki per questo. Ora, so che non esiste un tipo di membro privato reale nell'obiettivo-c, tutto è praticamente pubblico. Tuttavia, sono un po 'preoccupato per il modo in cui dovremmo progettare le nostre classi e anche per rispettare i principi OOP. Mi piacerebbe sentire le opinioni di questi tre approcci progettuali:In che modo i membri pubblici e privati devono essere implementati nell'obiettivo-c?
A. Secondo vari post e anche a un nuovo corso di sviluppo per iPhone della Stanford University, dovresti sempre usare le proprietà ovunque tu possa. Tuttavia, secondo me, questo approccio frena i principi di progettazione OOP perché in questo caso tutti i membri diventano pubblici. Perché devo pubblicare tutte le mie variabili di istanza interne/locali all'esterno? Inoltre, c'è un po 'poco (ma ancora) in testa se si utilizzano setter sintetizzati tramite proprietà, invece utilizzando direttamente ivar locale. Ecco un esempio:
//==== header file =====//
@interface MyClass : NSObject
@property (nonatomic, retain) NSString *publicMemberWithProperty;
@property (nonatomic, retain) NSString *propertyForPrivateMember;
@end
B. Un altro approccio è quello di dichiarare Ivars in file di intestazione (senza dichiarare le proprietà relative) per i soci privati, e nello stesso file di intestazione, di dichiarare le proprietà puri (senza dichiarare Ivars relativi) per membri pubblici. In tal caso, gli ivar verrebbero usati direttamente nella classe. Questo approccio ha senso ma non utilizza tutti i vantaggi delle proprietà perché abbiamo manualmente il rilascio dei vecchi valori prima di impostarne di nuovi. Ecco un esempio:
//==== header file =====//
@interface MyClass : NSObject{
NSString *_privateMember;
}
@property (nonatomic, retain) NSString *publicMemberWithProperty;
@end
C. Dichiarare proprietà puri (senza dichiarare Ivars relativi) per i soci pubblici in file di intestazione, e di dichiararla proprietà puri (senza dichiarare ivars relativi) per i soci privati a interfaccia privata nel file di implementazione . Questo approccio IMHO è più chiaro del primo, ma rimane la stessa domanda: perché dobbiamo avere proprietà per i membri interni/locali? Ecco un esempio: la libertà
//==== header file =====//
@interface MyClass : NSObject
@property (nonatomic, retain) NSString *publicMemberWithProperty;
@end
//==== implementation file =====//
@interface MyClass()
@property (nonatomic, retain) NSString *propertyForPrivateMember;
@end
Questa decisione mi infastidisce un po 'e mi piacerebbe trovare una conferma da rispettive fonti su come le cose dovrebbero essere fatte. Tuttavia, non sono stato in grado di trovare affermazioni così rigide nei documenti Apple, quindi per favore pubblica un link su Apple Docs, se esiste, o su qualsiasi altra teoria che lo chiarisca.
Questa domanda sembra essere molto soggettiva ed è impossibile rispondere nel modo giusto. – Till
La domanda è molto semplice - come dovrebbero essere implementati i membri privati e pubblici in obiettivo-c, e dove potrei trovare la voce severa di Apple su questo. – Centurion
Mi permetto di dissentire ma non approfondirò la discussione. Come suggerimento per dimostrare la mia richiesta, ti sei ricordato che ad es. i corsi di Stanford raccomandano l'uso di proprietà ovunque. – Till