Con la maturazione del codebase sto iniziando a non gradire lo schema dei dizionari di passaggio come modo per impacchettare le informazioni per il passaggio dei messaggi o, peggio ancora, per gli argomenti delle funzioni. Richiede che la funzione di invio e ricezione abbiano entrambi un'API non documentata di stringhe letterali.Schema migliore del passaggio di NSDictionaries come parametri?
..in some function..
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
thisObject, @"thisKey",
thatObject, @"thatKey",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info];
....
e poi in chi ascolta 's someClass
- (void)someClassListener:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
ThisObject *ob1 = [info objectForKey:@"thisKey"];
ThatObject *ob2 = [info objectForKey:@"thatKey"];
}
Bisogna ricordare che thisKey
e thatKey
sono le chiavi di tipo ThisObject
e ThatObject
per tale notifica, sicuro che si potrebbe creare alcune costanti in qualche luogo per coloro le chiavi ma questo non risolve il problema.
E diciamo che hai una funzione che richiede 15 argomenti, non hai intenzione di fare una funzione con 15 parametri, sarebbe molto più facile (anche se meno leggibile) passare semplicemente un dizionario ma ora hai il lo stesso problema di cui sopra.
Ho giocato con la creazione di "Classi di messaggi" cancellate nei file di intestazione di questa classe (ovvero due interfacce in un'intestazione) e la Classe messaggio era solo un elenco di oggetti definiti e inviati al metodo che crea un più forte contratto ma questo sembra sbagliato.
Sarebbe bello se potessi fare qualcosa di simile typeDef
un oggetto parametro nell'intestazione, ma che non supporta NSObject
's solo le cose come int
o float
ecc
In sostanza sto cercando di creare un contratto più forte tra il mittente del messaggio e il destinatario del messaggio, siano quelle funzioni o notifiche.
Io dico che le costanti per le chiavi non sono una buona soluzione perché devi ancora cercare la chiave e non sta creando un contratto forte per quale sarà il valore (oggetto), più come un suggerimento. Incapsulare i dati in una classe era una direzione che stavo investigando, ma mi sembra complicato creare una classe per ogni messaggio che voglio passare, che siano 2 argomenti 10, non sei d'accordo? – Shizam
@Shizam, se quei messaggi verrebbero inseriti in dizionari diversi, probabilmente avresti bisogno di più di una classe. Ma, se stai parlando di messaggi che a volte passano due chiavi da un dizionario, e talvolta da 10, allora sarebbe ancora solo un oggetto di classe. – rdelmar
@rdelmar In tutto il nostro programma abbiamo probabilmente 10-15 notifiche univoche, ognuna di quelle notifiche avrebbe bisogno della propria classe per definire le sue proprietà per il messaggio, ecc. – Shizam