Design OOP: differenza tra due possibili soluzioni

3

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?

    
posta charliebrownie 05.03.2017 - 01:34
fonte

1 risposta

6

Non c'è bisogno di pensarlo troppo. Entrambi i disegni vanno bene per l'attuale livello di complessità. Sono fermamente convinto che non si possa progettare un software finché non si sono già compiuti progressi significativi. Ad un certo punto in futuro, la tua auto potrebbe effettivamente aver bisogno di sapere se il booster è attivo, ad es. ripararlo o sostituirlo. Ma per il momento, dato che tutta l'attenzione della macchina è la velocità, la seconda soluzione è leggermente più pulita.

    
risposta data 05.03.2017 - 02:54
fonte