UML: utilizzo l'aggregazione o la composizione in questo caso?

1

Vorrei disegnare uno schizzo UML per comunicare parte di un software, ma il tipo di relazione tra le classi non mi sembra molto chiaro.

Diciamo che voglio recuperare periodicamente gli ordini recenti dal database e aggiornare una vista grafica con i dettagli dell'ordine.

Questo è un esempio di pseudo codice molto semplificato ma la mia implementazione è java

//Order objects contain information about a single order
class Order
{
    private String orderNumber;
    private String buyerName;
    public Order(String number, String name)
    {
    //initialize fields
    }
    //public getters 
}

ora ho una classe chiamata Model che ha una singola funzione statica per il recupero degli ordini in un intervallo di tempo:

class Model
{
    private Model()
    {}
    public static List<Order> getOrders(LocalDateTime from, LocalDateTime until)
    {
    //...get order objects from database and return
    }
}

Model.getOrders() è accessibile dalla mia classe Controller che è responsabile del recupero di oggetti Order e dell'aggiornamento periodico di una vista

class Controller implements Runnable
{
    private RecentOrdersView target; //view to update

    private Controller()
    {
    }
    public Controller getInstance(RecentOrdersView input)
    {
    //...singleton 
    //compose the returned object with the view, so it needs which view to update
    }

    public void Run()
    {
    //... client code runs this function periodically
    List<Order> recentOrders = Model.getOrders(...);//get Orders

        for(int i=0; i<recentOrders.size(); i++)
        {
         target.updateView(recentOrders.get(i).getOrderNumebr(),
                           recentOrders.get(i).getBuyerName());
        }
    }

}

Come potresti aver indovinato c'è una classe per la mia vista come segue:

class RecentOrdersView
{
    private RecentOrdersView()
    {
    }
    public RecentOrdersView getInstance()
    {
    //...singleton implementation
    }

    public void updateView(String orderNumber, String buyerName,...)
    {
    //...update the view based on the parameters
    }
}

quindi il controllore e la vista sono implementati come singleton, ma il modello è accessibile tramite la funzione statica pubblica. Il codice cliente è responsabile di metterlo insieme:

class Client
{
    public static void main(String[] args) 
    {

    RecentOrderView view = RecentOrdersView.getInstance();
    Runnable controller= Controller.getInstance(view);
    //schedule controller to run periodically
    }
}

Ora voglio creare un diagramma UML per questa configurazione, tuttavia non so se dovrei usare l'aggregazione o la composizione tra Controller , Model e Order

la mia ipotesi migliore è la seguente:

Ho selezionato la relazione di composizione tra Client e RecentOrdersView e Controller , perché Client possiede un'istanza di ciascuno. Ho anche selezionato una relazione di aggregazione tra RecentOrdersView e Controller , perché Controller contiene un riferimento di RecentOrdersView (anche se non lo possiede).

dove sono confuso sono le relazioni tra Order , Controller e Model . Specifiche:

Relazione tra Model e Controller : So che Controller chiama una funzione statica in Model , ma poiché non ci sono istanze di oggetti, non sono sicuro di cosa fare

Relazione tra Model e Order : Voglio quasi usare la composizione perché Model istanzia% Order oggetti, ma poiché ciò accade in una funzione statica non c'è un proprietario immediato, gli oggetti Order vengono passati torna a Controller

Relazione tra Controller e Order : inside Controller method Run() è dove Order oggetti escono dall'ambito, ma Controller object non è quello che ha istanziato direttamente quegli oggetti. dovrei usare la composizione qui?

Grazie per aver letto questa lunga domanda. Apprezzo molto anche i consigli sul modello di progettazione generale utilizzato.

    
posta ForeverStudent 17.06.2016 - 18:45
fonte

1 risposta

2

Ecco una buona spiegazione sulla differenziazione di associazione, aggregazione e composizione .

Ma ecco una cosa. Se provi a mostrare tutto il tuo sistema è in grado (o ogni descrizione del tuo sistema) sullo stesso diagramma, finirai per esaurire le relazioni o finirai a riutilizzare i tipi di relazione con significati molto diversi sullo stesso diagramma.

Stai mostrando diversi tipi di cose sullo stesso diagramma singolo. L'ordine è per lo più un'entità informativa. Il modello è in gran parte anche informativo (è la raccolta di ordini), ma, naturalmente, ha alcuni comportamenti di basso livello (CRUD) attorno alla persistenza. Mentre il controller e la vista sono per lo più entità comportamentali.

Se scegli di utilizzare più di un diagramma, puoi aiutare a chiarire le cose sia per te che per i consumatori della tua documentazione.

Ad esempio, potrei suggerire che un diagramma di sequenza possa illustrare più efficacemente l'interazione (la relazione dinamica) tra un controllore, il modello e un ordine. (Personalmente, esiterei a descrivere la relazione tra controllore / ordine come anche una semplice associazione perché quella relazione non è mai materializzata in modo formale o persistita per qualsiasi durata.)

Un diagramma di oggetti (o diagramma a blocchi, piuttosto che un diagramma di classe) può essere efficace nel mostrare i singleton a vita intera (primordiali) (oggetti, a volte sottosistemi e moduli), come il modello e la sua relazione con, diciamo, il oggetto controller di primo livello. In quanto tali sono bravi a mostrare il design al più alto livello.

Un diagramma di classe per mostrare la relazione di composizione tra modello e ordini (che presumo non può esistere o non ha senso senza essere nel modello).

(Tecnicamente, la relazione del diagramma di classe tra la classe controller e la classe ordine è tramite un tipo restituito su un metodo in Model, questo è uno dei motivi per cui esiterei a descriverlo come un'associazione tra controller di classi e ordine, tuttavia, questo probabilmente non è poi così interessante per un diagramma di livello superiore inteso a mostrare la progettazione del sistema, specialmente quando potresti usare un altro diagramma per mostrarlo.)

    
risposta data 17.06.2016 - 20:41
fonte

Leggi altre domande sui tag