Dove mettere la composizione?

4

Nel seguente diagramma ho un Car che ha un Motor .

Un Audi A6 è un Car che ha un Motor di tipo 2.4 L V6 .

Quindi sia la vettura che l'Audi hanno una composizione su un motore. Tuttavia sembra non corretto avere due composizioni su questo schema.

Qual è il modo corretto?

    
posta nowox 17.05.2018 - 15:52
fonte

3 risposte

9

Smetti di usare l'ereditarietà, è lo strumento sbagliato per questo lavoro.

Invece, preferisci tipizzazione compositiva .

class Car
{
     String VIN;
     CarModel ModelType;
     Motor Motor;
}

class CarModel
{
    String Name;
    MotorModel DefaultEngineType;
}

class MotorModel
{
    Strimg Name;
    int Cylinders;
    int Displacement;
}

class Motor
{
    MotorModel MotorType;
    int WearAndTear;
}

Una macchina specifica ha un motore, una macchina da presa ha un motore predefinito associato. L'ereditarietà ha difficoltà a modellarlo.

Usando la digitazione compositiva, è possibile cambiare il motore di un'Audi, e farlo usare un grosso blocco Chevy se sei così inclinato: D

Un CarModel non ha un motore, solo una specifica predefinita per quale tipo di motore dovrebbe essere collocato in quel tipo di auto.

    
risposta data 17.05.2018 - 16:00
fonte
3

La connessione arancione non dovrebbe essere lì, non ha senso. Quello blu dice già tutto al giusto livello. Nota che Auto e Audi A6 non sono entità molto diverse, Car rappresenta solo la parte condivisa di tutti i tipi di auto. E quella parte condivisa ha il rapporto con il motore.

    
risposta data 17.05.2018 - 20:31
fonte
2

Penso che le accurate descrizioni di UML dipenderanno interamente dall'uso. Ad esempio, il modello Audi A6 istanzia direttamente un'istanza di 2,4 L V6? In alternativa, un builder client esegue un tipo di iniezione di dipendenza? Entrambi creeranno risposte diverse alla tua domanda.

Nell'eventualità di creare direttamente l'oggetto, utilizzerei un link di dipendenza poiché devi includere la definizione di quel tipo di motore. Aggiungere stereotipi (raffinare, istanziare, ecc.) Dovrebbe teoricamente chiarire il tuo intento.

Quando si utilizza l'iniezione di dipendenza, aggiungerei l'iniettore client in modo che il diagramma possa apparire più simile a questo: link

    
risposta data 17.05.2018 - 16:08
fonte

Leggi altre domande sui tag