problema
Recentemente ho letto molto sul fatto che Singletons sta male e su come l'iniezione di dipendenza (che intendo come "usare le interfacce") sia migliore. Quando ho implementato parte di questo con callbacks / interfacce / DI e aderendo al principio di segregazione dell'interfaccia, ho finito con un bel pasticcio.
Le dipendenze di un genitore dell'interfaccia utente in cui fondamentalmente si univano quelle di tutti i suoi figli, quindi più la gerarchia era un elemento dell'interfaccia utente, più il suo costruttore era gonfio.
Fino in cima alla gerarchia dell'interfaccia utente era una classe Application, contenente le informazioni sulla selezione corrente e un riferimento a un modello 3d che deve riflettere le modifiche. La classe dell'applicazione stava implementando 8 interfacce, e questo è stato solo un quinto dei prodotti (/ interfacce) a venire!
Attualmente lavoro con un singleton che tiene la selezione corrente e gli elementi dell'interfaccia utente che hanno una funzione per aggiornarsi. Questa funzione scorre lungo la struttura dell'interfaccia utente e gli elementi dell'interfaccia utente quindi accedono alla selezione corrente singleton secondo necessità. Il codice mi sembra più pulito in questo modo.
Domanda
Forse un singleton è appropriato per questo progetto?
In caso contrario, c'è un difetto fondamentale nel mio modo di pensare e / o nell'implementazione di DI che lo rende così ingombrante?
Ulteriori informazioni sul progetto
Tipo: Carrello per gli appartamenti, con campane e fischietti
Dimensione: 2 mesi uomo per il codice e l'interfaccia utente
Manutenzione: nessun aggiornamento in corso, ma forse "versione 2.0" successiva
Ambiente: utilizzo di C # in Unity, che utilizza un sistema Componente entità
In quasi tutti i casi, l'interazione dell'utente innesca diverse azioni. Ad esempio, quando l'utente seleziona un elemento
- la parte dell'interfaccia utente che mostra che l'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ù in alto l'interfaccia utente, il prezzo totale complessivo deve essere aggiornato
- è necessario chiamare una funzione corrispondente in una classe su un modello 3d per visualizzare le modifiche lì