44 votes

Différentes façons d'implémenter la fonctionnalité 'indicateur sale'

Presque chaque programmeur a fait cela une fois dans sa vie: la configuration de certains drapeau si la valeur d'une variable changé. Il y a toujours beaucoup de propriétés et vous souhaitez garder une trace si quelque chose a changé

  1. dans toute la propriété
  2. dans une propriété spécifique
  3. ou dans un ensemble de propriétés

Je suis intéressé par les différentes façons de mettre en œuvre le "sale-drapeau" de la fonctionnalité pour les situations ci-dessus, en plus de la norme de l'objet large sale drapeau a été mis à jour à chaque changement de propriété. Il doit y avoir quelque chose de mieux que de mettre le "sale = true" dans chaque setter: il semble juste laid et c'est un travail fastidieux.

24voto

Otávio Décio Points 44200

Pour mon DAO, je conserve une copie des valeurs d'origine telles qu'elles ont été extraites de la base de données. Lorsque je l'envoie pour qu'il soit mis à jour, je compare simplement les valeurs d'origine au courant. Cela coûte un peu en traitement mais c'est beaucoup mieux que d'avoir un drapeau sale par propriété.

EDIT pour justifier davantage de ne pas avoir d'indicateur "dirty": si la propriété retourne à sa valeur d'origine, il n'y a aucun moyen de le refléter, l'indicateur "dirty" continue en mode "sale" car la valeur d'origine a été perdue.

10voto

Bertvan Points 1529

J'ai utilisé une Entité de base de classe, fournir Sale/Retiré de la Logique.

Lors de l'écriture de l'Entité sous-classes, vous pourriez faire quelque chose comme:

public string Name
{
    get { return name; }
    set { setValue("Name", value); }
}

Cela fonctionne bien, mais a la "laide chaîne' desease...

Aujourd'hui, vous pouvez utiliser des Expressions Lambda exclure les chaînes:

set {setValue(x => x.Name, value);}

Ou, et je pense que c'est la meilleure solution, vous pouvez utiliser l'AOP:

http://www.postsharp.org/

De cette façon, vous pouvez définir des actions par des Attributs. Vous créez un attribut et de préciser que lorsque l'utilisateur modifie la propriété associée, l'entité devient sale.

En outre, vous pouvez garder une liste de propriétés dans votre classe (Entité de base) qui va mémoriser les modifications des propriétés, et d'accéder à cette liste à partir de votre AOP Code.

8voto

J'ai créé une classe appelée DirtyValue<T> qui a une valeur d'origine et une valeur actuelle. Lors de sa première utilisation, il définit à la fois la valeur d'origine et la valeur actuelle. Les appels successifs définissent uniquement la valeur actuelle.

Vous pouvez savoir si cela a changé en comparant les deux, avec une propriété en lecture seule appelée IsDirty (). En utilisant cette technique, vous pouvez également accéder à la valeur d'origine.

6voto

dwc Points 12676

Si vous définissez un indicateur "sale", réalisez que vous conservez l'état. À un moment donné, vous devez prendre une mesure basée sur cet état, sinon vous n’auriez pas besoin de garder le drapeau. La question devient alors la suivante: existe-t-il un autre moyen de déclencher l'action nécessaire? Envoi de messages de quelque sorte? Qui consomme l'état "sale" et agit, et existe-t-il une interface plus propre pour cette notification?

5voto

AShelly Points 17389

Dans certaines situations, avec un enregistreur de données de la tâche et un lecteur indépendant de la tâche, j'ai donné à chacun une tâche updateCount variable. Le producteur incréments de son compte à chaque fois qu'il écrit. Chaque fois que le lecteur se réveille et trouve son compte moins que le producteur du comte, il ne fait pas de mise à jour avec les valeurs actuelles. Vous avez besoin d'un peu d'un traitement spécial pour le compteur de dépassement, mais cela est assez simple à mettre en œuvre.

J'ai utilisé avec succès cette technique dans les simulations où le producteur est le physique de la boucle, et le lecteur est l'affichage en 3d.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X