Question

Je suis en train de comprendre comment utiliser passif afficher correctement. Il me semble que tous les exemples que je regarde sur passif Voir transgresse la loi de Déméter:

//In the presenter code
myview.mytextfield.text = "whatever";

Alors, quelle est une meilleure mise en œuvre de passif View?

Était-ce utile?

La solution

D'abord, la loi de Déméter, comme la plupart des règles de programmation, est plus d'un principe ou une ligne directrice et il y a des cas où le principe ne s'applique pas. Cela étant dit, la loi de Déméter ne s'applique pas vraiment Passif Voir parce que la raison de la loi n'est pas un problème dans ce cas.

La loi de Déméter tente d'empêcher la dépendance enchaînant tels que:

objectA.objectB.objectC.DoSomething();

Il est évident que si les changements de mise en œuvre de objectB à utiliser à la place objectD alors il va briser la dépendance de objectA et provoquer une erreur de compilation. Si elles sont prises à l'extrême vous liquidez faire la chirurgie de fusil de chasse chaque fois que la chaîne est perturbée par un changement de mise en œuvre.

Dans le cas de Voir Passif

  • Le présentateur dépend d'une interface pour la mise en œuvre de la vue peut changer aussi longtemps que l'interface reste la même.
  • La vue expose généralement des propriétés comme types de données généralisées telles que les types de systèmes et collections. Cela vous permet d'apporter des modifications à l'interface utilisateur sans affecter le présentateur.
  • Pour le présentateur de la vue apparaît comme rien de plus qu'une structure de données, un endroit pour récupérer et de vidage des données. Étant donné que la vue est assez simple, le présentateur ne doit pas même être en mesure de faire de la dépendance Enchaînement.

Ainsi, l'exemple que vous avez donné normalement mis en œuvre:

//from presenter
view.MeaningfulName = "data";

Alors que la vue serait quelque chose comme:

//from view
public string MeaninfulName
{
    get
    {
        return someControl.text;
    }
    set
    {
        someControl.text = value;
    }

L'espoir que cela clarifie les choses un peu.

Autres conseils

Une meilleure mise en œuvre serait d'avoir une API entre le présentateur et la vue. Le présentateur pousserait les données à son point de vue par une seule méthode (définie dans l'interface de la vue). La vue gérerait la nouvelle entrée selon une logique interne.

Par conséquent, le présentateur n'a pas de savoir quoi que ce soit au sujet de la vue et de la loi de Déméter est sûr.

Bon, eh bien, oui, que fait enfreindre la loi de Déméter, qui dit essentiellement que l'interface à un objet ne doit pas révéler la mise en œuvre de l'objet. Mais alors, le second donne beaucoup helluva des conseils pour la mise en œuvre aussi.

Je pense qu'il est temps de demander si vous avez l'interface droit en général. Qu'est-ce que sont ces champs de texte? Qui est en les replaçant dans la vue? Ne devrait pas le point de vue se demander le modèle de données, au lieu de vice-versa?

Peut-être que vous avez besoin du pattern Observer -. Le modèle tient une liste des parties intéressées et les avertit lorsque ses changements d'état internes


Ah, que Voir le passif. N'a pas regardé que dans un long moment. Au fond, je vois deux parties: l'une d'entre elles est que, en rendant le contrôleur (pas le modèle) conduire toutes les mises à jour, pour (je présume) l'efficacité, il expose les méthodes de terrain spécifiques à mettre à jour ces champs. Cela ne viole la loi de Déméter, qui est, après tout, seule une « loi » dans un certain sens métaphorique, comme la loi de Murphy. Il est généralement une bonne idée, cependant. Dans ce cas, je refais la vue et l'utiliser comme une façade pour envelopper les mises à jour du champ individuel.

Vous n'avez pas besoin du modèle d'observateur bien, parce que maintenant vous avez le contrôleur faire toutes les mises à jour. Il ajoute un peu de complexité et proneness erreur au code global, parce que maintenant vous HVE d'écrire le contrôleur pour faire des mises à jour parallèles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top