Evitare la dipendenza circolare

3

Sto costruendo un sistema gps per unità flotta e attualmente e ho bisogno di capire come collegare i miei oggetti.

Ecco lo scenario:

  1. Ogni unità flotta potrebbe aver collegato uno o più dispositivi gps.
  2. Ogni unità flotta può avere uno o più motori.
  3. Il motore di ogni unità di flotta può avere uno o due misuratori di portata del carburante collegati a uno o due dispositivi GPS. A seconda del tipo di motore, il flussometro del carburante può gestire sia il carburante in avanti che il carburante all'indietro, ma a volte ci devono essere due diversi misuratori di portata del carburante, uno per il carburante in avanti e uno per il carburante all'indietro. Ciò che lo rende ancora peggio è che alcuni modelli di dispositivi GPS hanno ingressi per entrambi i misuratori di portata del carburante ma altri no, quindi quando sono necessari due misuratori di portata di carburante è necessario montare due diversi dispositivi GPS.

Quindi, se ho i seguenti oggetti:

FleetUnit , GpsDevice , Engine , FuelFlowMeter

Voglio trovare un modo per collegarli senza avere una dipendenza circolare.

Se l'oggetto FleetUnit ha una lista di GpsDevice oggetti e un elenco di Engine oggetti e GpsDevice oggetto ha un elenco di FuelFlowMeter e FuelFlowMeter ha riferimento a un GpsDevice oggetto e Engine object, penso che ci siano troppe dipendenze circolari e il design non è pulito.

Puoi suggerirmi come gestire questo scenario in cui pochi oggetti si comportano come un grafico?

    
posta Papa-rapa-beo 31.01.2018 - 19:23
fonte

2 risposte

3

Alcune cose qui che potrebbero aiutarti. Pensando al tuo problema qui, una cosa che lo rende complicato è che tu hai la cosa con un po 'di GPS e dei misuratori di carburante in grado di supportare due motori e altri no. Se il tuo obiettivo è quello di mantenere un inventario di questi, quei dettagli potrebbero avere importanza, ma la mia ipotesi è che non sia così. Penso che quello che ti interessa davvero è: per ogni unità, qual è il consumo di carburante per ciascun motore e probabilmente quanto lavoro hanno svolto (distanza, elevazione, ecc.)

Sottolineo questo perché si tratta di un problema di modellazione molto più semplice. Quindi per farlo hai bisogno di qualcosa come queste (rozze) entità:

  • FleetUnit
  • Engine
  • Fuel Reading
  • Location Information

Uno dei grandi problemi che ho su come viene spiegato OO è che gli esempi di una spiegazione implicano o affermano che dovrebbero rappresentare cose concrete del mondo reale come cani e gatti o alberi. Questo non è affatto il caso e la maggior parte delle classi in un programma java non rappresentano entità del mondo reale.

Se per qualche motivo è importante che la tua applicazione sappia che Fuel Reading x è associato all'unità GPS Y, che può essere aggiunto al modello. La chiave qui è che devi progettare le tue classi in base a come devi utilizzarle, non in base alle entità concrete nel tuo dominio problematico.

    
risposta data 31.01.2018 - 20:22
fonte
2

Non stai descrivendo una dipendenza circolare tanto quanto una rete di relazioni. Una relazione può essere qualcosa come "possiede" o "ha un" o "è parte di" o "è associata a".

Nel tuo caso, Fleet Unit "ha" un po 'di GPSDevice s e "ha" un po' di Engine s e "ha" un po 'di FuelFlowMeter s. Un Engine "è associato a" alcuni FuelFlowMeter s. Ogni FuelFlowMeter "è associato a" un Engine . Ecc.

Questi tipi di relazioni avvengono sempre quando descrivono sistemi fisici.

Se è necessario comprendere come rappresentarli nel software, sarà necessario utilizzare le interfacce astratte per definire i componenti e far funzionare le classi di implementazione dei componenti con le interfacce anziché con altre classi di implementazione.

    
risposta data 31.01.2018 - 19:43
fonte

Leggi altre domande sui tag