Est-il considéré comme une mauvaise pratique d'ajouter de la logique dans un configurateur de propriétés?

28

J'ai sauté sur un projet et je vois que les autres développeurs ajoutent beaucoup de logique dans les setters des propriétés synthétisées. Je comprends comment cela fonctionne, mais je pense que cela rend difficile la compréhension du déroulement du programme; en lisant le code, chaque fois que je voisself.something = whatever , je vérifie toujours si somethingle setter est surchargé.

Quelles sont vos opinions sur ce sujet? Pensez-vous que ce soit un signe de mauvaise architecture ou une solution élaborée?

Je serais heureux de lire plus à ce sujet si vous avez des liens / sources pertinents, il est tout simplement trop difficile d'obtenir de bons résultats Google, j'ai donc décidé de demander ici également.

Merci pour toute réponse et veuillez noter que je parle de l'objectif C au cas où vous n'auriez pas vu la balise (même si cela ne devrait pas être un problème spécifique à la langue, je suppose).

phi
la source
5
Quelle sorte de logique? Il n'y a rien de mal à mettre la logique de validation, par exemple. D'un autre côté, un setter qui envoie quelques événements, appelle un service Web et met à jour l'interface utilisateur est complètement faux.
Arseni Mourzenko
@MainMa Je suis d'accord pour dire que les validations sont bien - peut-être en ajoutant quelques observateurs aussi, non? Pourriez-vous peut-être donner quelques exemples de ce que vous jugez plus approprié de mettre dans un setter?
phi
en effet, les observateurs ont raison. Quant aux choses qui conviennent à un setter, j'ai laissé des développeurs plus expérimentés répondre à cette question.
Arseni Mourzenko

Réponses:

44

Est-il considéré comme une mauvaise pratique d'ajouter de la logique dans un configurateur de propriétés?

Non

Des propriétés ont été inventées pour permettre aux concepteurs de classe d'avoir une logique attachée à une interface pratique d'accès et d'affectation sur le terrain.

Combien c'est trop? Cela dépend des responsabilités de la classe. Voici quelques éléments qu'il est raisonnable de placer dans un configurateur de propriétés:

  • mettre à jour certaines valeurs dérivées
  • informer les observateurs que l'état de classe a changé
  • propager le changement à un objet contenu
  • propager le changement dans un magasin de sauvegarde
  • effectuer la validation

La programmation est plus facile lorsque les classes ont des interfaces qui rendent évident ce que la classe peut faire, sans faire réfléchir les appelants sur la façon dont cela est fait. Mettre la logique derrière les setters de propriétés permet aux classes de cacher leur implémentation derrière une interface simple. Pour certaines classes, aucune méthode n'est requise. Tournez simplement les boutons en définissant les propriétés et lisez la sortie en obtenant les propriétés.

Kevin Cline
la source
13
Effectuer la validation ...
Robert Harvey
À quel point est utile de recharger une vue de collection ou une vue de table dans une méthode remplacée par un setter?
Krishnan
15

Les setters sont généralement utilisés pour changer l'état d'un objet sans effets secondaires significatifs ni calculs lourds; utilisez des méthodes et des fonctions pour cela. La principale raison de la mise en œuvre du setter est la modification et le maintien d'un état valide . Ainsi, limiter la plage, définir des indicateurs pour demander un nouveau calcul ou ajuster les propriétés associées est tout à fait correct.

Rob van der Veer
la source
7

Je ne connais pas l'objectif C, mais comme vous le dites, cela semble une question assez générique pour tout langage OO. Tout d'abord et en fait lié à cela, la question de savoir si avoir des setters et des getters en premier lieu est un sujet de discussion (dans certains cas, leur existence est justifiée par l'utilisation d'un cadre ou d'une bibliothèque).

Je crois que le nom de la méthode devrait expliquer ce que fait la méthode et toute la méthode. De plus, la documentation associée à cette méthode doit la décrire de manière plus explicite. En ce sens, un nom de méthode sous la forme "set" + {substantif} ne devrait pas avoir d'effets secondaires autres que la définition de la valeur d'une variable et cela devrait être la seule action qui lui est associée. Vérifier que l'argument est valide, est acceptable mais il doit être décrit dans sa documentation.

DPM
la source
1
+1 pour "l'opportunité d'avoir des setters et des getters". Et un autre +1 pour "nom de la méthode devrait expliquer ce qu'il fait".
aviv