Progettazione MVC, singleton in model con inizializzazione

2

Recentemente ho appreso di MVC (model view controller) e sto cercando di rifattorizzare un programma esistente. Sono in una situazione in cui mi piacerebbe avere esattamente un oggetto di una particolare classe, quindi mi è sembrato evidente che dovrei usare un singleton. Questo singleton verrà utilizzato per mantenere una hashmap di determinate cose. Tuttavia questa hashmap dovrà essere inizializzata quando il singleton viene creato leggendo i nodi da un file xml e memorizzandoli come oggetti di classe.

Ora il mio dilemma è:

  1. Se inizializzo gli attributi xml (leggendo e convertendo in oggetti classe), sto effettivamente facendo cose nella classe del modello che il controller dovrebbe fare, il che non è sicuramente buono.

  2. Se metto il metodo di inizializzazione in una classe controller, dovrei fare riferimento a una classe controller da una classe modello, che non è conforme alla progettazione MVC.

  3. Se metto l'intero singleton nel controller, allora dovrei cercare l'hashmap nel pacchetto controller, che vanifica lo scopo di avere classi modello.

  4. Non posso passare una hashmap premade al singleton come parametro nè perché il costruttore è privato .. Beh, tecnicamente potrei, assegnandolo al metodo getInstance () come parametro, ma sembra un modo sporco di correggere, dal momento che ora o passa null ogni volta, o faccio un altro metodo getInstance () che non accetta un parametro.

In questo momento, il mio codice ha un aspetto simile a questo:

public class CategoryCatalog{

    private static CategoryCatalog categoryCatalog;
    private HashMap<CarOptionCategory, Set<ICarOption>> categoryOptionsMap;

    private CategoryCatalog(){
        categoryOptionsMap = new HashMap<CarOptionCategory, Set<ICarOption>>();
        initialize();
    }

    public static CategoryCatalog getInstance(){
        if(categoryCatalog == null){
            categoryCatalog = new CategoryCatalog();
        }
        return categoryCatalog;
    }

    private void initialize(){
        // TODO: xml
    }
}

Sto trascurando qualcosa o dovrei usare un approccio diverso?

    
posta Babyburger 01.04.2014 - 00:47
fonte

1 risposta

1

Devi usare lo strumento giusto per il problema giusto. MVC viene utilizzato per separare la logica di rappresentazione dalla logica di richiesta di routing (controller) e dalla business logic (il modello).

Per la creazione di oggetti dovresti utilizzare Pattern creativi . Ora, a mio parere,

If I initialize the xml attributes (reading and converting to class objects), I'm effectively doing things in the model class that the controller should be doing, which is definitely not good.

È buono se le classi sono usate dal modello.

If I put the initialization method in a controller class, I would have to refer to a controller class from a model class, which does not conform to the MVC design.

Sì, non farlo perché uno strato a leva bassa non dovrebbe dipendere da un livello superiore.

If I put the whole singleton in controller, then I'd have to look for the hashmap in the controller package, which defeats the purpose of having model classes.

Questo singleton non è un controller, quindi non farlo anche tu.

I can't pass a premade hashmap to the singleton as a parameter neither, because the constructor is private.. Well, I technically could, by giving it to the getInstance() method as a parameter, but it feels like a dirty way of fixing, since I now either pass null every time, or make another getInstance() method that doesn't accept a parameter.

Sì, interromperà l'incapsulamento qui perché la mappa hash è un invariante della tua classe e se accetti una mappa hash significa che l'invariante può essere sovrascritto, forse accidentalmente.

Secondo me questo singleton è una sorta di factory che fornisce classi, se le classi sono usate dal modello, quindi inserisci questo singleton nel pacchetto del tuo modello. dai anche un'occhiata a Spring, lo farà per te in un modo carino.

    
risposta data 01.04.2014 - 08:22
fonte

Leggi altre domande sui tag