Che cos'è un codice di "invidia per le funzionalità" e perché viene considerato un odore di codice?

47

Questa domanda su SO parla della correzione ciò che l'OP ha pensato è il codice caratteristica dell'invidia . Un altro esempio in cui ho visto questa frase elegante è citato in una risposta data di recente qui in programmers.SE. Anche se ho inserito un commenta a quella risposta per chiedere le informazioni che pensavo sarebbe di aiuto generale ai programmatori che seguono Q & A per capire cosa si intende con il termine invidia caratteristica . Non esitare a modificare tag aggiuntivi se ritieni che sia appropriato.

    
posta Geek 21.09.2013 - 06:07
fonte

2 risposte

80

Invidia per le funzionalità è un termine usato per descrivere una situazione in cui un oggetto ottiene nei campi di un altro oggetto per eseguire una sorta di calcolo o prendere una decisione, piuttosto che chiedere all'oggetto di eseguire il calcolo stesso.

Come esempio banale, considera una classe che rappresenta un rettangolo. L'utente del rettangolo potrebbe aver bisogno di conoscere la sua area. Il programmatore potrebbe esporre i campi width e height e quindi eseguire il calcolo al di fuori della classe Rectangle . In alternativa, Rectangle potrebbe mantenere privati i campi width e height e fornire un metodo getArea . Questo è probabilmente un approccio migliore.

Il problema con la prima situazione, e il motivo per cui è considerato un odore di codice, è perché rompe l'incapsulamento.

Come regola generale, ogni volta che ti trovi a fare ampio uso di campi di un'altra classe per eseguire qualsiasi tipo di logica o computazione, considera di spostare quella logica in un metodo sulla classe stessa.

    
risposta data 21.09.2013 - 06:35
fonte
1

C'è una possibile situazione quando è OK usare estensivamente un altro metodo class / struct - quando la tua classe / struct è un contenitore per i dati. Di solito c'è un po 'che puoi fare con questi dati senza contesto esterno.

Tali classi possono ancora contenere una logica interna, ma più spesso vengono utilizzate come contenitori:

class YourUid {
 public:
  YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
  bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
  bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
  int id_in_workplace;
  int id_in_living_place;
 private:
  int id_in_FBI_database_;
  const DB* FBI_database_;
};

@jhewlett nella sua risposta si riferisce a questo articolo per dimostrare che non dovresti usare estensivamente altri membri della classe, ma c'è un'altra situazione di codice odori descritta qui con il mio esempio:

Long Parameter List. Limit the number of parameters you need in a given method, or use an object to combine the parameters.

    
risposta data 23.09.2013 - 23:58
fonte

Leggi altre domande sui tag