Aujourd'hui, au travail, un de mes collègues a examiné mon code et m'a suggéré de supprimer une propriété de type ensemble et d'utiliser une méthode à la place.
Comme nous étions tous les deux occupés à autre chose, il m'a dit de regarder la Property Design
section du livre "Framework Design Guidelines". Dans le livre, l'écrivain vient de dire d'éviter:
Propriétés avec le setter ayant une accessibilité plus large que le getter
Et maintenant je me demande pourquoi il n'est pas recommandé d'avoir une propriété set-only? Quelqu'un peut-il clarifier pour moi?
design
code-quality
code-reviews
code-smell
Prashant Cholachagudda
la source
la source
Password
propriété sur uneUser
classe. Vous pouvez le définir, mais vous ne pouvez pas l'obtenir. Vous pourriez alors avoir uneHashedPassword
propriété en lecture seule . Appeler l'ensemble ferait du hachage et changerait laHashedPassword
propriété. Je ne vous crierais pas si vous faisiez ça.Réponses:
Je pense que cela peut avoir à voir avec les attentes. Les propriétés de jeu uniquement sont rares et les propriétés sont généralement utilisées pour les jeux "stupides" juste pour stocker une valeur sans trop de traitement. Si vous faites beaucoup de travail dans un setter, il est préférable d'utiliser une méthode - les gens s'attendent à ce que les méthodes prennent potentiellement beaucoup de temps à exécuter et aient potentiellement des effets secondaires. L'implémentation d'un type de comportement similaire dans une propriété peut entraîner un code qui viole les attentes.
Voici une section pertinente des directives d'utilisation des propriétés de Microsoft :
la source
Parce que cela n'a tout simplement aucun sens dans la plupart des cas. Quelle propriété pourriez-vous avoir que vous pouvez définir mais pas lire?
Si OO est censé mieux représenter le monde réel, une propriété set only est susceptible de suggérer que votre modélisation est assez décalée.
Modifier : Voir également: /programming/4564928/are-set-only-properties-bad-practice qui dit essentiellement que ce n'est pas intuitif et qu'une propriété set only est fondamentalement une méthode sous un autre nom, vous devez donc utiliser un méthode.
la source
Foo Foo { private get; set; }
? Je n'appellerais pas ça écrire seulementEh bien, j'imagine que si vous pouvez définir une propriété sur quelque chose sans l'obtenir, vous ne saurez jamais si quelque chose d'autre change / écrase la valeur que vous définissez. Cela peut être un problème si vous comptez sur la valeur que vous définissez et que vous ne pouvez pas (pour une raison quelconque) la conserver jusqu'au moment où vous souhaitez l'obtenir.
L'utilisation d'une méthode au lieu d'une propriété set-only sera légèrement moins déroutante pour un utilisateur. Le nom de la méthode indique généralement set- ou get- , mais les noms de propriété n'indiquent généralement pas que quelque chose ne peut être défini et ne peut être obtenu. Je suppose que si la propriété était quelque chose comme "ReadOnlyBackgroundColour", cela ne serait pas déroutant pour les autres codeurs, mais cela aurait juste l'air bizarre.
la source
C'est un sujet très ancien mais qui m'a sauté aux yeux à ce stade tardif et j'aimerais avoir quelques commentaires alors que j'essaie de défendre les propriétés en écriture seule ...
J'ai un ensemble de
ActiveReport
classes qui font partie d'un site Web qui sont instanciées et exécutées sur postback après un certain nombre de sélections d'utilisateurs.Le code VB ressemble à ceci:
Ces rapports utilisent des tripes génériques,
CommonReader
prennent une procédure stockée et un tableau deSqlParameter
s par défaut , chacun ayant une propriété WriteOnly associée qui, selon la conception du rapport, peut être transmise en tant que paramètre lors de l'instanciation ou définie par l'utilisateur après l'instanciation avant appel de laRun
méthode des rapports .Donc, comme je le vois, avoir une propriété en écriture seule dans ce cas
SqlParameter
s sont un peu génériquesSqlParameter
s sont des classes et non des valeurs primitives, les propriétés WriteOnly permettent une interface plus simple pour définir les paramètresVoilà mes pensées.
Puis-je le convertir en méthode à la place? certes mais l'interface semble ... moins sympa
contre
la source