Problema Di
recente ho letto molto sul fatto che Singleton sia cattivo e su come sia meglio l'iniezione di dipendenza (che intendo come "utilizzo delle interfacce"). Quando ho implementato parte di questo con callback / interfacce / DI e aderendo al principio di segregazione dell'interfaccia, ho finito con un bel casino.
Le dipendenze di un genitore dell'interfaccia utente dove fondamentalmente quelle di tutti i suoi figli si univano, quindi più in alto nella gerarchia era un elemento dell'interfaccia utente, più il suo costruttore era gonfio.
In cima alla gerarchia dell'interfaccia utente c'era una classe Application, che conteneva le informazioni sulla selezione corrente e un riferimento a un modello 3d che deve riflettere le modifiche. La classe di applicazione stava implementando 8 interfacce, e questa era solo una rotatoria di un quinto dei prodotti (/ interfacce) a venire!
Attualmente lavoro con un singleton che contiene la selezione corrente e gli elementi dell'interfaccia utente che hanno una funzione per aggiornarsi. Questa funzione scorre la struttura dell'interfaccia utente e gli elementi dell'interfaccia utente, quindi accede al singleton di selezione corrente, se necessario. Il codice mi sembra più pulito in questo modo.
Domanda
Un singleton è forse appropriato per questo progetto?
Altrimenti, c'è un difetto fondamentale nel mio pensiero e / o implementazione di DI che lo rende così ingombrante?
Ulteriori informazioni sul progetto
Tipo: carrello della spesa per appartamenti, con campane e fischietti
Dimensione: 2 mesi-uomo per il codice e l'interfaccia utente
Manutenzione: nessun aggiornamento in esecuzione, ma forse "versione 2.0" successiva
Ambiente: utilizzo di C # in Unity, che utilizza un'entità Sistema di componenti
In quasi tutti i casi, l'interazione dell'utente attiva diverse azioni. Ad esempio, quando l'utente seleziona un elemento
- la parte dell'interfaccia utente che mostra quell'elemento e la sua descrizione devono essere aggiornati. Per questo, ha anche bisogno di ottenere alcune informazioni da un modello 3d per calcolare il prezzo.
- più avanti nell'interfaccia utente, il prezzo totale complessivo deve essere aggiornato
- una funzione corrispondente in una classe su un modello 3d deve essere chiamata per visualizzare le modifiche lì