2010-12-13 1 views
2

Lorsque je conçois les modèles pour un domaine, ils finissent presque toujours par avoir une fonctionnalité .IsSomething sur eux. Pour la validation des règles métier, IsValid pour IsValid pour la validation des règles métier, voire IsFraudulent pour un projet en cours (plus de validation des règles métier), etc. Chaque fois que je les vois implémentés par d'autres, ils sont presque toujours utilisés comme méthodes. Mais je me demande s'il y a une raison particulière à cela.Model.Is ___ - Devrait-il s'agir d'une propriété ou d'une méthode?

J'ai tendance à voir les propriétés comme décrivant un objet et des méthodes comme effectuant une sorte d'action. Ceux-ci n'effectuent pas vraiment une action. Ils impliquent du code, car ils sont déterminés dynamiquement lorsqu'ils sont appelés, et ils sont clairement en lecture seule, mais pour moi, ils correspondent toujours à des propriétés plutôt qu'à des méthodes.

Il pourrait potentiellement y avoir un problème de sérialisation avec les propriétés, je suppose. Bien qu'un modèle de domaine riche ait tendance à ne pas bien sérialiser de toute façon étant donné qu'il contient de la logique et des fonctionnalités, chaque fois que je dois déplacer quelque chose à travers une limite de service, je l'aplatisse généralement dans une structure DTO définie.

Mais je me demande si quelqu'un d'autre a un aperçu sur le sujet? Y a-t-il une bonne raison de les mettre en œuvre en tant que méthodes plutôt qu'en tant que propriétés?

(qu'accessoirement, bien que an answer has already been given, les propriétés d'extension serait vraiment aider à la cohérence sur quelque chose comme ça. J'ai plusieurs IsSomething() méthodes d'extension, généralement sur System.String, pour la mise en œuvre logique spécifique au domaine. Mais même si les propriétés sont la manière aller, je veux rester avec des méthodes seulement pour la compatibilité avec les extensions)

+0

Ou vous pouvez croiser les doigts et espérer des propriétés d'extension dans C# 5 :) – SWeko

Répondre

4

J'utiliser une propriété parce que:

  1. Il décrit l'objet d'une certaine façon, de manière conceptuelle sa caractéristique, sa propriété

  2. Il ne demande pas les paramètres

  3. Il récupère simplement certaines données, n'effectue aucune action ou modification autonome

6

en supposant que l'accès à la propriété.

  • A aucun effet secondaire
  • Est « reasonabl y speedy "(ouais, très laineux ...)

alors je ne vois aucune raison de ne pas en faire une propriété. La sérialisation ne devrait pas être un problème - la plupart des schémas de sérialisation permettent de marquer une propriété comme transitoire (c'est-à-dire qu'elle ne doit pas être sérialisée).

+0

Bon point sur les effets secondaires. Jusqu'à présent, cela n'a pas été un problème, mais c'est certainement quelque chose pour moi et les autres développeurs de l'équipe à garder à l'esprit. Dès qu'une propriété "fait quelque chose" autre que simplement renvoyer une description de l'état actuel de l'objet, il devrait s'agir d'une méthode. – David

+0

@David: Eh bien, cela dépend de ce qu'il fait. Il pourrait potentiellement changer une valeur mise en cache ... ou consigner ce qu'il fait. Mais faire des * changements visibles * à l'état serait une mauvaise idée. –

Questions connexes