È meglio passare l'intero oggetto o usare un setter?

0

Ecco il mio codice iniziale che vorrei modificare utilizzando il modello di progettazione della strategia.

class Bar
{
  int a;
  int b;
  ...
}

Class Foo
{
  Bar *bar;

  bool action1(){ 
    // this function does a lot of work that only uses "bar.a"
  }
  bool action2(){ 
    // this function does also a lot of work that only uses "bar.a"
  }
  void command(){
    ...
    Bar bar2 = new Bar(); 
    bar = bar2; // this function modifies the attribute bar.
    ...
  }

  ...
}

Sto provando a separare il codice di action1 e action2 dalla classe Foo creando un oggetto strategia che implementerà tali azioni. Non so quale di queste implementazioni sia migliore.

Prima soluzione:

class ActionStrategy {
  Bar *bar;

  bool action1();
  bool action2();
}

Class Foo
{
  Bar *bar;
  ActionStrategy strategy

  bool action1(){ 
    strategy.action1();
  }
  bool action2(){ 
    strategy.action2();
  }
  void command(){
    ...
    Bar bar2 = new Bar(); 
    bar = bar2; // this function modifies the attribute bar.
    ...
  }

  ...
}

Seconda soluzione:

class ActionStrategy {
  int a;

  bool action1();
  bool action2();
}

Class Foo
{
  Bar *bar;
  ActionStrategy strategy

  bool action1(){ 
    strategy.action1();
  }
  bool action2(){ 
    strategy.action2();
  }
  void command(){
    ...
    Bar bar2 = new Bar(); 
    setBar(bar2); // this function modifies the attribute bar.
    ...
  }

  void setBar(Bar* target) {
    bar = target;
    strategy.a = target->a;
  }

  ...
}
    
posta Issam T. 28.04.2014 - 18:57
fonte

1 risposta

1

La risposta potrebbe essere "nessuno dei due". Nessuna delle tue soluzioni sembra separare nettamente la responsabilità per la variabile a e i due metodi.

La risposta che stai cercando dipende da ciò che a rappresenta effettivamente e da cosa i metodi stanno facendo. Una volta compreso, puoi seguire il principio della responsabilità unica e decidere dove posizionare la variabile e i metodi.

Al momento, le tue soluzioni sembrano spingere troppe conoscenze riguardo a e i metodi che agiscono su a a classi che non hanno responsabilità per a . Forse i metodi dovrebbero essere spostati in Bar ; avere Foo istanziare Bar passando un valore di a ; e hanno Foo chiama i metodi off di Bar .

    
risposta data 28.04.2014 - 19:06
fonte

Leggi altre domande sui tag