Un passeur doit-il retourner immédiatement s’il reçoit la même valeur?

Dans les classes qui implémentent INotifyPropertyChanged, je vois souvent ce modèle:

public ssortingng FirstName { get { return _customer.FirstName; } set { if (value == _customer.FirstName) return; _customer.FirstName = value; base.OnPropertyChanged("FirstName"); } } 

Précisément les lignes

  if (value == _customer.FirstName) return; 

me dérange. Je l’ai souvent fait mais je ne suis pas sûr que ce soit nécessaire ni bon. Après tout, si un appelant atsortingbue la même valeur, je ne souhaite pas réaffecter le champ et, en particulier, informer mes abonnés que la propriété a changé lorsque, sémantiquement, elle ne l’a pas été.

Sauf économiser un peu de CPU / RAM / etc. en libérant l’interface utilisateur de la mise à jour de quelque chose qui aura probablement le même aspect à l’écran / what_medium, qu’est-ce qu’on obtient?

Certaines personnes pourraient-elles forcer une actualisation en réaffectant la même valeur à une propriété (cela ne serait toutefois pas une bonne pratique)?

1. Devrions-nous le faire ou pas?

2. pourquoi?

Oui, vous devez retourner immédiatement lorsque le consommateur définit une valeur de propriété égale à la valeur déjà persistante.

Tout d’abord, il n’ya aucune raison de perdre du temps ou des ressources dans le paramétrage de la propriété – la valeur est déjà définie, aucune autre action n’est donc nécessaire. En outre, vous ne devez jamais appeler OnPropertyChanged si la valeur stockée dans le champ de sauvegarde de la propriété n’a pas changé – la méthode est censée être levée lorsque la valeur a été modifiée et non lorsque le setter de la propriété a été appelé.

Cela étant dit, cependant – si le passeur n’avait pas eu d’appel à OnPropertyChanged je n’aurais pas pris la peine de vérifier la valeur en premier. Dans le cas d’un simple installateur qui ne définit que la valeur du champ de sauvegarde et rien d’autre, il sera en réalité plus rapide de toujours définir la valeur plutôt que de vérifier d’abord puis de définir la valeur. Utilisez ce modèle uniquement lorsque le créateur de la propriété dispose d’une logique supplémentaire qui ne doit pas être déclenchée ou qui peut entraîner une pénalité de performance inutile.

Ou vous pouvez faire ceci:

  set { if (value != _customer.FirstName) { _customer.FirstName = value; base.OnPropertyChanged("FirstName"); } } 

Pas besoin de plusieurs chemins de retour.

Pour répondre davantage à votre question, je ne forcerais pas une mise à jour de la propriété si elle était écrasée par la même valeur. Cela ne sert à rien, car vous n’allez probablement pas en tirer profit. (Je pourrais voir un cas où vous voudriez suivre chaque fois que quelqu’un tente de mettre à jour une valeur.)

Le seul argument contre ce modèle (où vous revenez si la valeur n’a pas changé) est le sharepoint vue du puriste selon lequel chaque fonction ne devrait avoir qu’une seule sortie. N’étant pas un puriste, je ne suis pas d’accord. Je ne vois rien de mal à sortir si la valeur n’a pas changé, en évitant la mise à jour de la notification.

La seule situation dans laquelle vous ne devriez pas l’ utiliser, c’est quand vous savez que vous pouvez avoir des données altérées sur votre classe, par exemple sur un object de couche ORM pouvant avoir des valeurs obsolètes par rapport à la firebase database sous-jacente en raison de la modification par un autre utilisateur.

Si cette situation ne vous concerne pas, cachez-vous!


modifier

J’ai mal compris votre question, car vous parlez de setters et non de getters .

Des points similaires s’appliquent. Si l’opération de configuration est coûteuse et n’est supposée avoir aucun effet secondaire (cela ne devrait pas! Les effets secondaires sur les setters sont evil !! 1), alors c’est une optimisation valable.

J’imagine qu’une des raisons de ne pas revenir plus tôt est pour les abonnés qui ont rejoint le parti tard. Ils risquent de ne pas être au courant de l’état actuel de l’object et manqueront l’avis de passeur si vous revenez plus tôt.