É 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.