Sto scrivendo codice Java per simulare una catena di approvvigionamento.
La catena di approvvigionamento può essere simulata in entrambi
una calza intermedia o una configurazione di cross-docking.
Così, ho scritto due oggetti del simulatore IstockSimulator
e XdockSimulator
.
Poiché i due oggetti condividono determinati comportamenti
(ad esempio effettuando spedizioni, richiesta in arrivo),
Ho scritto un oggetto simulatore astratto AbstractSimulator
che è una classe genitore dei due oggetti del simulatore.
L'oggetto simulatore astratto ha un metodo runSimulation()
che accetta un parametro di input della classe SimulationParameters
.
Fino ad ora, i parametri di simulazione contengono solo campi
comuni a entrambi gli oggetti del simulatore,
come randomSeed
, simulationStartPeriod
e simulationEndPeriod
.
Tuttavia, ora desidero includere campi specifici per il tipo di simulazione che viene eseguita,
cioè una classe IstockSimulationParameters
per una simulazione di calza intermedia,
e una classe XdockSimulationParameters
per una simulazione cross-docking.
La mia idea attuale è prendere il metodo runSimulation()
fuori dalla classe AbstractSimulator
,
ma per mettere un metodo runSimulation(IstockSimulationParameters)
nella classe IstockSimulator
,
e un metodo runSimulation(XdockSimulationParameters)
nella classe IstockSimulator
.
Tuttavia, temo che questo approccio porti alla duplicazione del codice.
Che cosa dovrei fare?
A cura
Attualmente, la classe AbstractSimulator
definisce il metodo runSimulation
che chiama altri metodi astratti
che sono definiti solo dalle classi figlio concrete.
public abstract class AbstractSimulator {
public void runSimulation(SimulationParameters params) {
int startPeriod = params.startPeriod;
int endPeriod = params.endPeriod;
for (int t = startPeriod; t < endPeriod; ++t) {
submitReports(t);
makeShipments(t);
demandArrives(t);
}
}
protected abstract void submitReports(int t);
protected abstract void makeShipments(int t);
}
Una delle differenze tra IstockSimulator
e XdockSimulator
è quello in una configurazione di calza intermedia,
le strutture di livello 3 presentano segnalazioni alle strutture di secondo livello,
mentre in una configurazione di cross-dock,
le strutture di livello 3 inviano segnalazioni alle strutture di primo livello.
Quindi IstockSimulator
e XdockSimulator
hanno le loro implementazioni dei metodi submitReports
e makeShipments
.
Cosa ha funzionato per me
Grazie per le tue risposte. Ispirato dalle tue risposte e dopo averlo addormentato, Ho trovato la mia risposta basata sul refactoring. Vedi sotto.