[Normalmente pubblico su StackOverflow ma dal momento che questa è più una domanda di progettazione / teoria piuttosto che una domanda di codice, darò un'occhiata qui]
La maggior parte delle mie applicazioni attualmente utilizza un modello di oggetti di base che ho scritto originariamente 6 anni fa e che è cresciuto al bisogno, come con la maggior parte delle mie cose, è stato codificato così com'è, senza pensare prima a un progetto. Parte di essa è troppo rigida, una parte è mal progettata e ancora più è goffo. Così ho deciso di ricominciare da zero piuttosto che provare ad aggiornare una nuova API su quella esistente. E ho anche deciso di mappare prima l'intera API in anticipo, quindi scrivere il codice per esso.
Fin qui l'approccio sta dando i suoi frutti e suppongo di avere un buon modello di birrificazione. Tuttavia, ho un dilemma nel nuovo design. Se si considerano i modelli di automazione offerti da cose come Microsoft Word, la maggior parte degli oggetti primari ha una proprietà denominata Application
che punta a un oggetto principale. Il mio modello di oggetti esistente segue praticamente lo stesso principio e lo sto usando anche nel nuovo.
L'API corrente ha tuttavia un mix di approcci. Alcuni oggetti memorizzano un riferimento a tale oggetto radice. Altri no, e la proprietà semplicemente guarda un oggetto "servizio" singleton, che nel suo cuore ha un ServiceContainer
per cercare oggetti registrati. Sì, un localizzatore di servizi. Alcuni lo fanno passare attraverso un costruttore, altri lo cercano quindi memorizzano un riferimento. Normalmente mi piace la coerenza, ma questo è un casino.
Il mio nuovo design non sta cambiando questo approccio - gli oggetti avranno ancora una proprietà indietro dell'oggetto radice con l'idea che tutti gli oggetti si comportano allo stesso modo e non devo (manualmente) andare a cercare un'applicazione quando scrivere il codice per una determinata implementazione.
Con quelle informazioni di base fuori mano, ecco la mia domanda. Ogni oggetto dovrebbe contenere un riferimento all'oggetto radice, o non dovrebbe memorizzare un riferimento diretto, ma cercare in qualche modo, cioè da un singleton o da un localizzatore di servizi.
Con il primo approccio, userò più memoria, 4 byte extra per oggetto per oggetto, mentre al momento ho compilato tutto come 32 bit. Anche se questo non suona molto e sono sicuro che non creerò molte migliaia di oggetti, preferisco che l'API di base sia il più efficiente possibile, senza dubbio le app su cui sono incollato vincono essere! Questo approccio significa anche che dovrò passare il riferimento a quell'oggetto in ogni singolo costruttore, non un grosso problema per il codice reale, ma rendere i test di scrittura un po 'più complicati.
Quest'ultimo approccio significa che risparmio la memoria, ma poi continuo a usare la cattiva pratica di un localizzatore di servizi, e suppongo che ci sia almeno un accenno a un problema di prestazioni dato che la ricerca di un riferimento non è sufficiente essere veloce come restituire uno diretto.
Oppure, esiste un altro approccio che usano modelli di oggetti di grandi dimensioni che non ho considerato sopra? Come accennato, normalmente mi tuffo, faccio qualcosa che funziona e poi lo lascio da solo fino a quando non si rompe o ne ho bisogno per fare qualcos'altro.
Immagino che la risposta sarà "conserva solo il riferimento e smetti di lamentarti" ma è meglio avere un'idea delle opinioni di altre persone!