Diciamo che ho un Car
, che possiede un SpeedBooster
che ogni volta che è active
e l'auto deve spostarsi, aggiungerà una velocità extra configurabile a quella azione in movimento.
Stavo pensando a come progettare-implementare questo usando OOP, e ho finito col dubitare tra due soluzioni diverse:
Soluzione 1
La Car è quella che controlla se il Booster è ON
e calcola essa stessa quella distanza extra che verrà aggiunta alla mossa finale.
Classe SpeedBooster
class SpeedBooster {
private active: boolean;
private speedIncrement: number;
constructor(speedIncrement: number, active = false) {
this.active = active;
this.speedIncrement = speedIncrement;
}
public activate(): void {
this.active = true;
}
public deactivate(): void {
this.active = false;
}
public isActive(): boolean {
return this.active;
}
public getSpeedIncrement(): number {
return this.speedIncrement;
}
}
Classe auto
class Car {
private position: number;
private speedBooster: SpeedBooster;
constructor(speedBooster: SpeedBooster) {
this.position = 0;
this.speedBooster = speedBooster;
}
public move(distance: number): void {
if (this.speedBooster.isActive()) {
let extraDistance = this.speedBooster.getSpeedIncrement() * distance;
let totalDistance = extraDistance + distance;
this.position =+ totalDistance;
} else {
this.position =+ distance;
}
}
// etc...
}
Soluzione 2
La Macchina chiede al Booster solo la distanza aggiuntiva che dovrà aggiungere alla mossa finale. Il Booster conosce lo stato ( ON
/ OFF
) e restituisce la distanza aggiuntiva o 0.
Classe SpeedBooster
class SpeedBooster {
private active: boolean;
private speedIncrement: number;
constructor(speedIncrement: number, active = false) {
this.active = active;
this.speedIncrement = speedIncrement;
}
public activate(): void {
this.active = true;
}
public deactivate(): void {
this.active = false;
}
public calculateExtraDistance(distance) {
if (this.active) {
return this.speedIncrement * distance;
} else {
return 0;
}
}
}
Classe auto
class Car {
private position: number;
private speedBooster: SpeedBooster;
constructor(speedBooster: SpeedBooster) {
this.position = 0;
this.speedBooster = speedBooster;
}
public move(distance: number): void {
let extraDistance = speedBooster.calculateExtraDistance(distance);
this.position =+ distance + extraDistance;
}
// etc...
}
Non ho molta esperienza in OOP, e non ho ancora deciso quale soluzione avrei ancora ... qualcuno osa condividere le proprie opinioni?