É uma prática recomendada adicionar lógica a um configurador de propriedades?


28

Entrei em um projeto e vejo que os outros desenvolvedores estão adicionando muita lógica nos setters de propriedades sintetizadas. Entendo como isso funciona, mas acho que dificulta a compreensão do fluxo do programa; ao ler o código, sempre que vejo self.something = whatever, sempre verifico se somethingo setter foi substituído.

Quais são as suas opiniões sobre esse tópico? Você acha que isso é um sinal de arquitetura ruim ou uma solução elaborada?

Eu ficaria feliz em ler mais sobre isso, se você tiver links / fontes relevantes, é muito difícil obter bons resultados no Google, então decidi perguntar aqui também.

Obrigado por qualquer resposta e observe que estou falando do objetivo C, caso você não tenha visto a tag (mesmo que não deva ser um problema específico do idioma).


5
Que tipo de lógica? Não há nada errado em colocar a lógica de validação, por exemplo. Por outro lado, um setter que despacha alguns eventos, chama um serviço da Web e atualiza a interface do usuário está completamente errado.
Arseni Mourzenko

@ MAINMA Eu concordo que as validações são boas - talvez adicionando alguns observadores também, certo? Você poderia dar alguns exemplos do que considera mais apropriado colocar em um levantador?
Phi

de fato, os observadores estão certos. Quanto às coisas apropriadas para um levantador, deixei desenvolvedores mais experientes responderem a essa pergunta.
Arseni Mourzenko

Respostas:


44

É uma prática recomendada adicionar lógica a um configurador de propriedades?

Não

As propriedades foram inventadas para permitir que os projetistas de classe tenham lógica anexada a uma interface conveniente de acesso e atribuição de campo.

Quanto é muito? Depende das responsabilidades da classe. Aqui estão algumas coisas razoáveis ​​para colocar em um configurador de propriedades:

  • atualizar alguns valores derivados
  • notificar os observadores de que o estado da classe mudou
  • propagar a mudança para algum objeto contido
  • propagar a mudança para uma loja de apoio
  • realizar validação

A programação é mais fácil quando as classes têm interfaces que tornam óbvio o que a classe pode fazer, sem que os chamadores pensem sobre como está sendo feito. Colocar a lógica atrás dos configuradores de propriedades permite que as classes ocultem sua implementação atrás de uma interface simples. Para algumas classes, nenhum método é necessário. Basta girar os botões configurando propriedades e ler a saída obtendo propriedades.


13
Executar validação ...
Robert Harvey

Quão bom é recarregar uma view de coleção ou tableview em um método substituído pelo setter?
Krishnan

15

Normalmente, os setters são usados ​​para alterar o estado de um objeto sem efeitos colaterais significativos ou cálculos pesados; use métodos e funções para isso. O principal motivo da implementação do setter é alterar e manter um estado válido . Portanto, limitar o intervalo, definir sinalizadores para solicitar recálculo ou ajustar propriedades relacionadas é absolutamente aceitável.


7

Não sei sobre o objetivo C, mas, como você diz, parece uma pergunta bastante genérica para qualquer linguagem OO. Antes de tudo, e realmente relacionado a isso, ter ou não setters e getters é uma questão de discussão (em alguns casos, sua existência é justificada pelo uso de uma estrutura ou biblioteca).

Eu acredito que o nome do método deve explicar o que o método faz e todo o método faz. Além disso, a documentação associada a esse método deve descrevê-lo de maneira mais explícita. Nesse sentido, um nome de método no formato "conjunto" + {substantivo} não deve ter efeitos colaterais além de definir o valor de uma variável e essa deve ser a única ação associada a ela. A verificação da validade do argumento é aceitável, mas deve ser descrita em sua documentação.


11
+1 para "ter setters e getters". E outro +1 para "nome do método deve explicar o que faz".
aviv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.