Réévaluer ou de réabonnement?


Cet article va vous expliquer provenant des membres dans l'ÉCO. & nbsp C'est le but principal est de décrire la différence entre l'ReEvaluateSubscriber et ReSubscribeSubscriber paramètres lorsque vous dérivez membres dans le code.

l'Une des excellentes caractéristiques de Gras qui ont fait la transition en ÉCO est dérivé membres. & nbsp Un membre dérivé est un peu comme un champ calculé sur un ensemble de données, sauf qu'il n'est calculé que la première demande de sa valeur et cette valeur est mis en cache pour la durée de traitement.

personne FullName comme un exemple. & nbsp nom Complet serait calculé comme

Result := Titre 'FirstName '' LastName

La première étape importante vers la création d'un tel attribut dans l'ÉCO c'est pour marquer l'attribut Dérivé. & nbsp effectivement, Il est possible de spécifier certains 'Dérivation OCL' et ont l'ÉCO système de dériver tout pour vous

titre 'firstName '' lastName

mais cet article est destiné à vous montrer comment gérer beaucoup de scénarios plus complexes.

Avec un typique DataSet champ calculé que vous attendez que la méthode puisse être calculé à chaque fois que la valeur est demandée. & nbsp Si l'objet courant est affiché sous forme de liste dans un DataGrid, puis l'appel de cette méthode pour chaque instance à chaque fois que la grille de données repeint peut être CPU intensive, en particulier si la valeur est calculée à partir de nombreux autres attributs/objets.

Dans l'ÉCO de la méthode est exécutée la première fois que la valeur est demandée, mais le résultat sera mis en cache automatiquement au sein de l'ECO de l'espace. & nbsp Futures demandes de la valeur de cette dérivée membre sera de retour la valeur mise en cache à la place. & nbsp Le potentiel d'économie de CPU est ici évident, surtout avec des routines.

Un code dérivé de la méthode pour un membre a un nom précis de la liste des paramètres, ECO utilise la réflexion pour trouver la méthode. & nbsp La structure est

la fonction DeriveAndSubscribe(ReEvaluateSubscriber,
& nbsp ReSubscribeSubscriber: ISubscriber):

dans notre FullName exemple l'ÉCO pourrait s'attendre à trouver

la fonction FullNameDeriveAndSubscribe(ReEvaluateSubscriber,
& nbsp ReSubscribeSubscriber: ISubscriber): string

Le problème ici, c'est cela. & nbsp Si la valeur de la Dérivée de membre n'est calculée qu'une seule fois, puis mis en cache, ce qui se passe si la valeur du Titre, Prénom, ou Nom changements? & nbsp

L'ÉCO-cadre n'a évidemment aucune idée de ce que nous avons fait pour obtenir la valeur de ce membre, ni d'autres objets/les membres ont été utilisés pour la calculer. & nbsp Pour s'assurer que l'ÉCO jamais renvoie une valeur incorrecte il a besoin de savoir lorsque ce membre doit être recalculée. & nbsp En fait, ce qu'il faut savoir, c'est lorsque ce membre doit être marquée comme 'non Valide', il ne sera pas recalculé jusqu'à ce que sa valeur est requise.

L'ÉCO-cadre utilise une sorte de pattern observer pour regarder les objets pertinents/membres, chaque fois que l'un de ces sont modifiés de la EcoSpace marquera le membre dérivé non valide (dérivant d'un membre par 'Dérivation OCL' place de ces abonnements automatiquement). & nbsp Ainsi, notre code maintenant ressemble à quelque chose comme ceci

la fonction FullNameDeriveAndSubscribe(ReEvaluateSubscriber, ReSubscribeSubscriber: ISubscriber): string
begin
& nbsp Résultat := Titre 'FirstName '' LastName
& nbsp //Maintenant, on nous place ou 'Abonnements'
& nbsp Auto.AsIObject().Propriétés['Titre'].SubscribeToValue(ReEvaluateSubscriber)
& nbsp Auto.AsIObject().Propriétés ['Prenom'].SubscribeToValue(ReEvaluateSubscriber)
& nbsp Auto.AsIObject().Propriétés['LastName'].SubscribeToValue(ReEvaluateSubscriber)
fin

Le 'ReEvaluateSubscriber' est un observateur de l'objet qui est passé pour nous à partir de quelque part dans le fonctionnement interne de l'ÉCO-cadre. & nbsp Tout ce que nous devons faire est de nous assurer de vous abonner à tous les objets pertinents/membres. & nbsp Chaque fois que l'un de ces éléments à charge ont leur valeur modifiée, la ReEvaluateSubscriber dira à l'ÉCO cadre que la valeur d'une ou d'un membre doit être 'Réévalué' la prochaine fois qu'il est demandé.

Réévaluer ou de Réabonnement?
Ce qui m'amène au dernier point. & nbsp Il y a deux abonnés transmis à notre méthode, 'ReEvaluateSubscriber' et 'ReSubscribeSubscriber', de sorte que fait l'autre, et quand doit-il être utilisé?

Dans l'exemple précédent, nous avons utilisé la ReEvaluateSubscriber parce que nous avons seulement besoin de savoir quand les valeurs de Titre, Prénom, ou Nom du changement. & nbsp Dans un exemple plus complexe, nous pouvons avoir besoin de faire quelque chose de structurellement plus compliqué, comme une itération à travers tous les OrderLine d'un PurchaseOrder et à la souscription aux membres de ces objets liés à la place.

Dans ce genre de situation, ce qui se passe si une nouvelle OrderLine est ajouté? & nbsp nous ne pouvons pas Nous ont déjà souscrit à un objet qui n'existait pas au point, nous avons placé nos abonnements? & nbsp Ce que si un OrderLine est retiré ou supprimé?

C'est exactement ce que le ReSubscribeSubscriber est pour. & nbsp Cet abonné doit être déclenchée à chaque fois que nous voulons dire 'Vidage de tous les abonnements, j'ai placé la dernière fois, nous allons commencer à nouveau'. & nbsp Fondamentalement, il n'est pas les 'Valeurs' des éléments qui sont en train de changer, nous devons remplacer nos abonnements, car il y a plus de/moins d'objets à prendre en considération.

la fonction OrderValueDeriveAndSubscribe(ReEvaluateSubscriber,
& nbsp ReSubscribeSubscriber: ISubscriber): Decimal
var
& nbsp CurrentOrderLine: OrderLine
begin
& nbsp Result := 0
& nbsp pour CurrentOrderLine en Soi.OrderLines ne
& nbsp commencer
& nbsp & nbsp & nbsp Result := Result CurrentOrderLine.LineValue
& nbsp & nbsp & nbsp //Abonnez-vous pour les membres de l'actuel objet enfant
& nbsp & nbsp & nbsp CurrentOrderLine.AsIObject().Propriétés['LineValue'].SubscribeToValue(ReEvaluateSubscriber)

& nbsp fin
& nbsp //Enfin, si l'Auto.OrderLines liste des changements apportés
& nbsp //nous avons besoin de mettre au rebut l'ensemble de nos abonnements et de commencer à nouveau.
& nbsp Auto.AsIObject().Propriétés['OrderLines'].SubscribeToValue(ReSubscribeSubscriber)
fin

Conclusion
j'espère que cela a été une révélation pour les capacités de code de dérivés de membres dans l'ÉCO. & nbsp Si vous ne l'avez pas déjà fait, je vous recommande de lire Rolf Lampa l'article de navigation Dynamique pour de meilleures performances, il a été écrit pour le Gras, mais les principes sont les mêmes.









Reevaluer ou de reabonnement?


Reevaluer ou de reabonnement? : Plusieurs milliers de conseils pour vous faciliter la vie.


Cet article va vous expliquer provenant des membres dans l'ECO. & nbsp C'est le but principal est de decrire la difference entre l'ReEvaluateSubscriber et ReSubscribeSubscriber parametres lorsque vous derivez membres dans le code.

l'Une des excellentes caracteristiques de Gras qui ont fait la transition en ECO est derive membres. & nbsp Un membre derive est un peu comme un champ calcule sur un ensemble de donnees, sauf qu'il n'est calcule que la premiere demande de sa valeur et cette valeur est mis en cache pour la duree de traitement.

personne FullName comme un exemple. & nbsp nom Complet serait calcule comme

Result := Titre 'FirstName '' LastName

La premiere etape importante vers la creation d'un tel attribut dans l'ECO c'est pour marquer l'attribut Derive. & nbsp effectivement, Il est possible de specifier certains 'Derivation OCL' et ont l'ECO systeme de deriver tout pour vous

titre 'firstName '' lastName

mais cet article est destine a vous montrer comment gerer beaucoup de scenarios plus complexes.

Avec un typique DataSet champ calcule que vous attendez que la methode puisse etre calcule a chaque fois que la valeur est demandee. & nbsp Si l'objet courant est affiche sous forme de liste dans un DataGrid, puis l'appel de cette methode pour chaque instance a chaque fois que la grille de donnees repeint peut etre CPU intensive, en particulier si la valeur est calculee a partir de nombreux autres attributs/objets.

Dans l'ECO de la methode est executee la premiere fois que la valeur est demandee, mais le resultat sera mis en cache automatiquement au sein de l'ECO de l'espace. & nbsp Futures demandes de la valeur de cette derivee membre sera de retour la valeur mise en cache a la place. & nbsp Le potentiel d'economie de CPU est ici evident, surtout avec des routines.

Un code derive de la methode pour un membre a un nom precis de la liste des parametres, ECO utilise la reflexion pour trouver la methode. & nbsp La structure est

la fonction DeriveAndSubscribe(ReEvaluateSubscriber,
& nbsp ReSubscribeSubscriber: ISubscriber):

dans notre FullName exemple l'ECO pourrait s'attendre a trouver

la fonction FullNameDeriveAndSubscribe(ReEvaluateSubscriber,
& nbsp ReSubscribeSubscriber: ISubscriber): string

Le probleme ici, c'est cela. & nbsp Si la valeur de la Derivee de membre n'est calculee qu'une seule fois, puis mis en cache, ce qui se passe si la valeur du Titre, Prenom, ou Nom changements? & nbsp

L'ECO-cadre n'a evidemment aucune idee de ce que nous avons fait pour obtenir la valeur de ce membre, ni d'autres objets/les membres ont ete utilises pour la calculer. & nbsp Pour s'assurer que l'ECO jamais renvoie une valeur incorrecte il a besoin de savoir lorsque ce membre doit etre recalculee. & nbsp En fait, ce qu'il faut savoir, c'est lorsque ce membre doit etre marquee comme 'non Valide', il ne sera pas recalcule jusqu'a ce que sa valeur est requise.

L'ECO-cadre utilise une sorte de pattern observer pour regarder les objets pertinents/membres, chaque fois que l'un de ces sont modifies de la EcoSpace marquera le membre derive non valide (derivant d'un membre par 'Derivation OCL' place de ces abonnements automatiquement). & nbsp Ainsi, notre code maintenant ressemble a quelque chose comme ceci

la fonction FullNameDeriveAndSubscribe(ReEvaluateSubscriber, ReSubscribeSubscriber: ISubscriber): string
begin
& nbsp Resultat := Titre 'FirstName '' LastName
& nbsp //Maintenant, on nous place ou 'Abonnements'
& nbsp Auto.AsIObject().Proprietes['Titre'].SubscribeToValue(ReEvaluateSubscriber)
& nbsp Auto.AsIObject().Proprietes ['Prenom'].SubscribeToValue(ReEvaluateSubscriber)
& nbsp Auto.AsIObject().Proprietes['LastName'].SubscribeToValue(ReEvaluateSubscriber)
fin

Le 'ReEvaluateSubscriber' est un observateur de l'objet qui est passe pour nous a partir de quelque part dans le fonctionnement interne de l'ECO-cadre. & nbsp Tout ce que nous devons faire est de nous assurer de vous abonner a tous les objets pertinents/membres. & nbsp Chaque fois que l'un de ces elements a charge ont leur valeur modifiee, la ReEvaluateSubscriber dira a l'ECO cadre que la valeur d'une ou d'un membre doit etre 'Reevalue' la prochaine fois qu'il est demande.

Reevaluer ou de Reabonnement?
Ce qui m'amene au dernier point. & nbsp Il y a deux abonnes transmis a notre methode, 'ReEvaluateSubscriber' et 'ReSubscribeSubscriber', de sorte que fait l'autre, et quand doit-il etre utilise?

Dans l'exemple precedent, nous avons utilise la ReEvaluateSubscriber parce que nous avons seulement besoin de savoir quand les valeurs de Titre, Prenom, ou Nom du changement. & nbsp Dans un exemple plus complexe, nous pouvons avoir besoin de faire quelque chose de structurellement plus complique, comme une iteration a travers tous les OrderLine d'un PurchaseOrder et a la souscription aux membres de ces objets lies a la place.

Dans ce genre de situation, ce qui se passe si une nouvelle OrderLine est ajoute? & nbsp nous ne pouvons pas Nous ont deja souscrit a un objet qui n'existait pas au point, nous avons place nos abonnements? & nbsp Ce que si un OrderLine est retire ou supprime?

C'est exactement ce que le ReSubscribeSubscriber est pour. & nbsp Cet abonne doit etre declenchee a chaque fois que nous voulons dire 'Vidage de tous les abonnements, j'ai place la derniere fois, nous allons commencer a nouveau'. & nbsp Fondamentalement, il n'est pas les 'Valeurs' des elements qui sont en train de changer, nous devons remplacer nos abonnements, car il y a plus de/moins d'objets a prendre en consideration.

la fonction OrderValueDeriveAndSubscribe(ReEvaluateSubscriber,
& nbsp ReSubscribeSubscriber: ISubscriber): Decimal
var
& nbsp CurrentOrderLine: OrderLine
begin
& nbsp Result := 0
& nbsp pour CurrentOrderLine en Soi.OrderLines ne
& nbsp commencer
& nbsp & nbsp & nbsp Result := Result CurrentOrderLine.LineValue
& nbsp & nbsp & nbsp //Abonnez-vous pour les membres de l'actuel objet enfant
& nbsp & nbsp & nbsp CurrentOrderLine.AsIObject().Proprietes['LineValue'].SubscribeToValue(ReEvaluateSubscriber)

& nbsp fin
& nbsp //Enfin, si l'Auto.OrderLines liste des changements apportes
& nbsp //nous avons besoin de mettre au rebut l'ensemble de nos abonnements et de commencer a nouveau.
& nbsp Auto.AsIObject().Proprietes['OrderLines'].SubscribeToValue(ReSubscribeSubscriber)
fin

Conclusion
j'espere que cela a ete une revelation pour les capacites de code de derives de membres dans l'ECO. & nbsp Si vous ne l'avez pas deja fait, je vous recommande de lire Rolf Lampa l'article de navigation Dynamique pour de meilleures performances, il a ete ecrit pour le Gras, mais les principes sont les memes.


Réévaluer ou de réabonnement?

Réévaluer ou de réabonnement? : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation