O que é um código de "inveja de recurso" e por que é considerado um cheiro de código?

47

Esta pergunta sobre SO fala sobre como corrigir O que o OP pensou é o código inveja de recursos . Outro exemplo em que vi essa frase interessante citada está em uma resposta recente aqui em programadores.SE. Embora eu tenha colocado um comentário a essa resposta pedindo a informação que eu pensei que seria de ajuda geral para programadores seguindo Q & A para entender o que se entende pelo termo recurso-inveja . Por favor, sinta-se à vontade para editar tags adicionais, se achar apropriado.

    
por Geek 21.09.2013 / 06:07
fonte

2 respostas

80

Inveja de recurso é um termo usado para descrever uma situação na qual um objeto recebe nos campos de outro objeto para realizar algum tipo de cálculo ou tomar uma decisão, ao invés de pedir ao objeto para fazer a computação em si.

Como um exemplo trivial, considere uma classe representando um retângulo. O usuário do retângulo pode precisar conhecer sua área. O programador pode expor os campos width e height e, em seguida, fazer o cálculo fora da classe Rectangle . Como alternativa, Rectangle poderia manter os campos width e height como privados e fornecer um método getArea . Esta é sem dúvida uma abordagem melhor.

O problema com a primeira situação, e a razão pela qual é considerado um cheiro de código, é porque quebra o encapsulamento.

Como regra geral, sempre que você estiver fazendo uso extensivo de campos de outra classe para realizar qualquer tipo de lógica ou computação, considere mover essa lógica para um método na própria classe.

    
por 21.09.2013 / 06:35
fonte
1

Existe uma situação possível quando é aceitável usar outros métodos de classe / struct extensivamente - quando sua classe / struct é um recipiente para dados. Geralmente há um pouco que você pode fazer com esses dados sem contexto externo.

Essas classes ainda podem conter alguma lógica interna, mas com mais frequência são usadas como contêineres:

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 em sua resposta refere-se a este artigo para provar que você não deve usar outros membros da classe extensivamente, mas há outra situação cheiros de código descrita lá com os defensores do meu exemplo:

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

    
por 23.09.2013 / 23:58
fonte