Le prime versioni delle mie classi sono state riempite con metodi e definizioni tentacolari per tutto ciò che la classe implementava. Mantenerlo era un inferno. Tutti i miei metodi si stavano perdendo. Erano organizzati dai marchi #pragma, ma il file .m era semplicemente troppo grande. Molti dei miei metodi sarebbero stati parzialmente commentati con nuove funzionalità, penserei di aggiungere un punto ma cambiare idea a metà strada. Era troppo mentale.
Ho riscritto il codice per avere una sottoclasse di view che ha fatto il layout e la gestione di base delle mie sottoview (alcune delle quali erano anche viste personalizzate.) Ho mantenuto le funzionalità davvero ridotte e ho iniziato a sottoclassi la mia vista personalizzata per funzionalità aggiuntive. Ho finito con cose come MenuedCustomView, OverlayCustomView, GradientCustomView. Questo è stato un enorme miglioramento.
In primo luogo, potrei tornare alla sottoclasse di base e affinare davvero le sue responabilità e renderlo super strettamente architettato. In secondo luogo, testare nuove funzionalità era facile e pulito. Vorrei creare una sottoclasse per aggiungere la funzionalità, quindi modificare un simbolo #define nel mio controller, ad esempio TestCustomView o indietro in GradientCustomView o altro. Lo swapping di questa classe era un po 'ingombrante, ma sicuramente funzionava meglio di quando stavo lavorando nella stessa definizione di classe, aggiungendo funzionalità, provandole, ripristinandole, tutte nello stesso file .m. Ho sottoclassi che hanno stub di funzionalità aggiuntive che vorrei aggiungere in futuro, semplicemente non le includo nella mia classe Controller. Quando ho voglia di lavorare no, è super facile da aggiungere al mio progetto.
Poco dopo aver iniziato la sottoclasse di tutto ciò che ho imparato, forse non è sempre la migliore pratica in Objective-C e nel cacao. Sono passato ad aggiungere categorie per molte funzionalità aggiuntive che volevo aggiungere ad una classe. Ovviamente le categorie aggiungono solo metodi e non proprietà, quindi alcune delle funzionalità che stavo aggiungendo erano possibili solo in una sottoclasse. Ora, ho ottenuto una miscela di sottoclassi e categorie per definire i miei oggetti in una gerarchia di file / classi per lo più gestibile e facile da leggere / mantenere.
Mi sono chiesto come Apple mantiene una classe come NSString. È un file .m di grandi dimensioni? Hanno un gruppo di classi ProtoString che aggiungono ciascuna funzionalità separata e quindi le ereditano nell'unica classe NSString? O è un insieme di funzioni base e quindi un gruppo di categorie?
Ho ancora un sacco da imparare sull'architettura di alto livello di una buona applicazione di cacao, ho pensato di condividere la mia progressione.