Navigation dynamique pour de meilleures performances
Réduction ou de la suppression de code de navigation de l'interface utilisateur en ajoutant des dérivés des liens et, dans le même temps, l'amélioration de la performance.
Modélisation des structures de classe prend un peu de la pensée, et la pensée et le dessin, et après que le démarrage à l'aide du modèle, alors vous allez passer la terrible beaucoup de code en parcourant les liens de afin de récupérer trivial info dans une structure de l'objet. La navigation en même parfois compliqué lien-chemins plus et plus encore une fois la puissance du CPU, et il faut aussi beaucoup de code redondant et/ou expressions qui accèdent à la même chemins de navigation, encore et encore. Dans l'architecture Audacieuse vous mettrait également redondante des abonnements à partir de nombreux endroits différents à la même cible de l'abonnement pour les mêmes chemins, plus d'une fois.
Mais avec des caractères Gras, vous pouvez souvent directement à l'adresse inutile de navigation, licenciés à la navigation de code/ocl-expressions et gain de diminution de la charge CPU par l'ajout de dérivés associations en faisant plutôt rares persistante des liens plus utile et plus 'intelligent'. Et, de plus, directement dans votre modèle votre modèle en même temps refléter plus précisément les parties du modèle est réellement utilisée. Et comment le faire.
Un exemple peut montrer une situation typique où l'ajout de nombreux dérivés de liens, d'étendre le modèle avec le plus d'informations utiles, le résultat sera plus efficace, moins redondant et un code plus lisible. Si nous parlions d'artisanats traditionnels vous aurait probablement pensé que je plaisantais, parce que nous avons l'habitude de ne pas nous sauver de plus en plus de problèmes en ajoutant plus de relations entre les objets...! Mais je ne plaisante pas - vous fait bénéficier de tous les avantages mentionnés par l'ajout de quelques lignes simples à l'aide du modèle de Gras.
EXEMPLE
Un camion de combinaison peut nous servir d'un exemple. L'exemple de modèle sera constitué d'unités sur Véhicule, quelques Parcelles et une excursion d'objet en gardant tout le voyage d'infos et de calculs. Avec ces trois catégories de base nous allons finir l'écriture de près de 50% de code (ou expressions) dans les algorithmes de navigation dans la structure de base qui n'a que trois persistante des liens... Tel codage est trivial, prend du temps et n'ajoute rien de valeur pour le système.
d'Abord un 'RIL la représentation d'un monde' de l'exemple avant de les représenter à l'aide d'un diagramme de classes UML ('RIL' est mes initiales) :
Fig 1: Cette combinaison de Véhicules contenant des Colis, mais seulement à l'avant de la plupart des VehicleUnit conserve Voyage d'infos sur les distances, les événements et les calculs économiques.
Ignorer les arts aspects de l'illustration. Pour plusieurs raisons, ne sont pas discutées ici, le VehicleUnits illustré ci-dessus a toujours un voyage d'objet connecté, mais seulement à l'avant de la plupart des voyage de l'objet à représenter l'ensemble de la combinaison. L'autre voyage les objets/les calculatrices sont 'démobilisés' jusqu'à ce que la remorque (peut-être) est déconnecté du camion, et puis la bande annonce sera valide (avant'la plupart') TripHolder sur son propre.
Imaginez vous affichez une des unités sur Véhicule ou de l'une des Parcelles dans une INTERFACE utilisateur et vous auriez probablement envie d'en savoir plus sur le voyage infos, peut-être la distance parcourue, les adresses visitées, le visting d'ordre, de coûts ou de revenus par km etc (tous administrés par le voyage de l'objet).
Il y a seulement trois relations dans ce modèle, mais encore vous devez réfléchir à deux fois lorsque vous essayez de naviguer correctement en essayant de trouver la 'calculatrice' (ici pour représenter un 'voyage de la classe').
Ce serait encore pire si vous souhaitez mettre en œuvre un certain générique de la logique ou des calculs pour les VehicleUnits parce que vous auriez toujours vous assurer que vous accédez au 'front de la plupart des véhicules de l'unité' (appelons cela le 'transporteur') et à partir de là, allez directement sur le voyage d'info (le calculateur).
Dans l'application réelle il y a tellement d'infos intégrés dans cette structure de base que les trois liens seraient consultés/naviguer encore et encore tellement de fois que plusieurs centaines de lignes de code (et/ou des expressions OCL) serait écrit 'ici, là et partout'. L'une des mauvaises choses avec cela est que si vous l'avez explicitement traverser ces liens à chaque fois que vous avez besoin d'accéder à un objet/attribut à l'autre extrémité de la structure, vous aurez besoin pour exécuter cette logique dans le CPU à chaque fois.
une Autre chose mauvaise, c'est que votre cœur de métier de la logique serait de 'noyer' dans le code et les expressions de traiter avec cette triviale de navigation comme 'if then else, for i :=' et d'attribuer des chèques. C'est là dérivé des liens peuvent beaucoup aider à éviter une logique mess (dérivé des attributs aussi, bien sûr).
Fig 2: Un simple modèle de classe de l'illustration ci-dessus pourrait ressembler à quelque chose comme ceci :
Le problème de navigation est plus évident dans ce modèle de classe que dans le 'RIL monde de l'illustration'.
Si j'ai sélectionnée une Parcelle dans une interface graphique, liste et besoin d'info dans le voyage de l'objet je ne pouvais pas être sûr de l'exact chemin de navigation pour les 'mobilisés' voyage de l'objet qui est l'un pour le voyage valide info. Exemple:
Si le colis a été chargé sur une remorque, l'expression ' vehicleUnit.voyage ' renverrait un démobilisés voyage à l'objet, mais si le colis a été chargé sur le véhicule, il serait de retour le désiré 'mobilisé' voyage de l'objet. Cette complication est une raison suffisante pour y ajouter un dérivé lien de régler le problème directement dans le modèle, de sorte que l'on n'a jamais une fois aurait à considérer lors de la conception d'algorithmes ou de naviguer dans la structure. Je serait certainement ajouter un lien appelé 'EffectiveTrip' comme suit :
Fig 3: Un lien appelé 'EffectiveTrip' a été ajoutée au modèle. (J'essaie toujours de laisser la couleur bleue représente 'persistants' (='freeze') et orange représentant un 'dérivé' pour les liens).
Comme je l'ai déjà peut prévoir que ce lien sera accessible pour de nombreuses combinaisons de véhicules (dans les grilles, etc) Je voudrais le code de la dérivation de l'optimisation de la logique ici pour trouver le 'front de la plupart des véhicules' et qui signifie de la traversée de la remorque/transporteur de lien et de s'arrêter quand le transporteur de liaison est nulle (=IsFrontMost). À partir de là, nous pouvons référence du voyage de l'objet directement. Mais je sais aussi que pour trouver de l'avant de la plupart des véhicules (la combinaison transporteur) est très typique et arrivera même plus souvent que l'accès à la voyage de l'objet lui-même. Je sais déjà que le EffectiveTrip lien peut utiliser un dérivé lien! Ajoutons tout de suite en lui donnant le nom de 'CombinationFirst'.
j'ai choisi le nom de 'CombinationFirst' parce qu'alors, vous réalisez immédiatement les typiques dans cette situation. C'est une liste typique de la manipulation de problème. Vous pouvez déjà imaginer l'utilité d'un autre dérivé du lien qu'on peut appeler 'CombinationLast' et même d'un troisième lien appelé 'CombinationUnits'!
je peux vous assurer que ces liens seront fréquemment utilisé et donc le 'coût' de leur évaluation sera payé déjà la deuxième fois que vous utilisez l'un d'eux !
Fig 4: Ne pas également à l'origine des liens nécessitent CPU afin d'être évalués...? vous pourriez vous demander. La réponse est, oui, bien sûr - mais une fois seulement - si l'abonné éléments ne changent pas. Et ce n'est pas très probable, mais le très 'hot spot' de la structure sera utilisé dans de nombreux endroits dans la logique d'accès aux objets de la croix plus très souvent et ce faisant les liens déjà renvoie directement aux instances que vous souhaitez accéder. Regardez le 'mess' ci-dessous... ! :
Ce une solution de haute performance à l'aide du modèle en tant qu'outil pour l'optimisation, et en même temps les liens supplémentaires sont clarifier/en indiquant directement dans le modèle de l'utilisation prévue de cette structure spécifique !
Pour ceux d'entre vous qui pensent que j'ai enfin eu le fou, je peux dire que je n'ai pas. Au lieu de cela j'ai augmenté la vitesse des calculs et de toutes les activités liées à cette structure dans un monde réel de l'application avec plusieurs milliers de pourcents par rapport à définir de façon explicite le chemin de navigation complet, chaque fois que la combinaison de voyage ou d'un Véhicule spécifique de l'unité (ou de l'attribut dans l'un d'eux) a été consulté !
Tous les types de données sont stockées dans cette structure et plus de 30 dérivé des attributs pour les différents accède à des fins de calcul de la structure avant en arrière tout le temps de fournir le client de l'utilisateur en temps réel les calculs de revenus/km et les distances, la distance d'actions de totaux, de partager des actions de... etc, etc.
Le truc, c'est de laisser un dérivé lien utiliser les autres liens aussi souvent cul possible, alors même que la nécessité de réévaluer les liens quand les choses changements diminue!
La dernière déclaration peut être vérifié très clairement avec un exemple qui montre combien il est important de 'RÉUTILISATION' tout ce que vous tirent à chaque niveau plus élevé (à l'égard de laquelle une partie de la structure est plus susceptible de changement et de la partie est plus 'statique'). Avec 'réutilisation' je veux dire 'la CPU de travail déjà fait' dans la détermination de la liaison. Plus à ce sujet pourrait faire l'objet d'un article distinct.
Maintenant, regardez le code. Nous avons besoin de trouver le voyage de l'objet (pour une reson), à partir d'une Parcelle, mais nous ne savons pas à qui VehicleUnit nous sommes chargé de sorte que nous commençons à nous en utilisant le lien 'EffectiveTrip' qui 'se cache' la logique de la détermination de voyage pour lequel l'objet est 'mobilisé' (j'.e 'efficace') :
fonction TParcel.CalculateTrip_Something...: Double var TripObj : TTrip commencer TripObj := vehicleUnit.effectiveTrip // c'est ça! ... |
Facile, c'est un code clair. Les détails sur la façon dont nous avons mis la main sur le bon de voyage de l'objet ne doit pas être mélanger la logique d'affaires ayant trait à l'accès ou de calculs dans la structure de l'objet.
Dans notre monde réel, l'application VehicleUnits et des Parcelles de la commune est super classe (non montré ici). Un véhicule peut être chargé sur un autre véhicule, comme tous les autres colis, de sorte que le code ci-dessus est encore plus simple dans mon dernier modèle générique où la dérivée lien est 'virtuel surdéfini' dans les différentes sous-classes. Mon code final qui va comme ceci :
commencer TripObj := effectiveTrip // c'est ça! |
Le Colis trouverez la validité de son voyage à l'aide de cette commande, quel que soit le degré de complexité de la trajectoire peut être. Ceci est montré dans la figure 5 où une commune de la super-classe est le propriétaire de la persistance et de la dérivée lien pour le voyage de classe et la EffectiveTrip-link est d'abord mises en œuvre dans le TParcel et puis surdéfini pour la VehicleUnit classe comme indiqué ci-dessous.
Fig 5: Ici, j'ai modifié le modèle pour devenir plus générique permettant à toute 'planable objet' la réalisation d'un lot d'autres planable objets - et que le modèle va plus générique les noms de rôle faire trop.
Voyage d'info s'applique directement pour un Colis (via AbstractPlanPortion) parce qu'une entreprise de transport de planifier un colis soit livré avec, par exemple, un avion qui les totaux ne nous intéresse pas - mais nous sommes toujours intéressés à maintenir une trace de tout voyage événements impliqués dans le transport proprement dit, et de la documentation et des transactions figurant sur le colis lui-même etc. Mais cela signifie aussi que quand il y a besoin d'avoir accès à la 'efficace' voyage de l'objet nous faisons également de la nécessité d'effectuer de très compliqué vérifie tous les cours de la structure d'essayer de savoir dans quel contexte le (bon, 'mobilisé') voyage de l'objet peut être trouvé... Cela va vraiment faire de notre logique, un peu compliqué pour une chose si simple que de simplement récupérer des données à partir de la structure. Un véritable cauchemar en fait...
Cette complication d'une simple chose n'est pas tout à fait unique. Ce qui est unique, c'est comment elle peut être traitée avec l'utilisation Audacieuse de la technologie avec son dérivé des liens.
Le Colis peut être le TripHolder lui-même, ou si le Colis est chargé sur un transporteur, il ne sais pas si il est chargé sur le support qui tient réellement le voyage d'info. Nous avons vraiment besoin de faire quelques navigatiion ici. Dans une situation comme cela, vous pouvez facilement imaginer combien de codage et de la complexité des expressions OCL serait à accéder à l'information dans la structure. Votre cœur de métier de la logique serait de 'noyer' dans la navigation des logiques lorsque tout simplement de récupérer des choses insignifiantes de la structure et le CPU serait de passer beaucoup de temps à trouver Votre chemin(s) pour la cible d'objets de données.
Enfin : Trois (3) persistante des liens de la tenue de la structure de l'ensemble fini dans une autre période de cinq (5) très utile dérivé des liens ! Le résultat est que l'application s'exécute beaucoup plus rapidement et logique d'entreprise est tenu de plus en dehors de trivial de navigation à l'infini de la traversée de structures d'objets.
Avant d'inscrire le code le plus efficace pour l'optimisation de la codé en dur dérivations des liens, je voudrais, pour conclure, que, avec ces liens, vous pouvez, à partir de n'importe où dans la structure, aller n'importe où - directement - par lien de référencement membres avec des noms entièrement en précisant ce que vous avez l'intention d'accès, et ce sera fait dans la manière la plus efficace que vous pouvez venir avec l'aide de l'ordinaire architecture Audacieuse.
Avec 'efficace', je veux dire 'toujours un accès direct à la cible souhaitée instance de l'objet' (sauf pour la première évaluation qui dans mon cas n'arrive qu'une fois pour des centaines d'accès...).
Ce n'est qu'une partie des concepts que nous avons utilisés consciemment afin de rendre possible ce qui n'était pas possible avant : utilisation régulière, mais 'clean design', modélisé et structurée, orientée objet classes d'affaires performants de haute performance en temps réel (re)faire des calculs très avancée pour les calculs de trajet (non abordé ici). Sur un seul CPU (serveur d'application) pour plusieurs clients.
la Dérivation de code, avec des commentaires
Dans le code ci-dessous j'ai souligné tout à la référence interne de la dérivée de liens ('la réutilisation efficace de déjà évalué les résultats').
j'ai aussi utilisé des variables locales, ainsi, éviter l'interne 'look up' de l'audace de membres plus d'une fois (=> éviter répété le déclenchement de l'intérieur gras d'événements, etc).
L'efficacité de l'ensemble du concept discuté, et les modalités de codage ci-dessous est vérifiée à l'aide de ProDelphi profiler (très haute précision ( -3%) sur la mesure des performances du code).
{ TParcel }
procédure TParcel._EffectiveTrip_DeriveAndSubscribe(...) // Si le chargement des transporteurs (efficace) voyage est retourné, // sinon le trajet local (le cas échéant). var CarrierObj: TVehicleUnit ResultValue : TTrip begin M_batchHolder.DefaultSubscribe(Abonné, breResubscribe) CarrierObj := batchHolder s'il est Affecté(CarrierObj) begin CarrierObj.M_EffectiveTrip.DefaultSubscribe(Abonné, breResubscribe) ResultValue := CarrierObj.EffectiveTrip fin else begin M_trip.DefaultSubscribe(Abonné, breResubscribe) ResultValue := voyage fin M_EffectiveTrip.BoldObject := ResultValue fin
{ TVehicleUnit }
procédure TVehicleUnit._EffectiveTrip_DeriveAndSubscribe(...) var HaulerObj: TVehicleUnit ResultValue, TripObj: TTrip begin ResultValue := nil M_CombinationFirst.DefaultSubscribe(Abonné, breResubscribe) HaulerObj := CombinationFirst // la traversée est déjà fait ici s'il est Affecté(HaulerObj) begin HaulerObj.M_Trip.DefaultSubscribe(Abonné, breResubscribe) TripObj := HaulerObj.voyage s'il est Affecté(TripObj) begin TripObj.M_IsMobilized.DefaultSubscribe(Abonné) si TripObj.IsMobilized puis ResultValue := TripObj fin fin M_EffectiveTrip.BoldObject := ResultValue fin
procédure TVehicleUnit._CombinationFirst_DeriveAndSubscribe(...) // Ce lien sera le rapide 'short cut', utilisé par beaucoup de beaucoup de // les fonctions dans le présent champ d'application et les autres liens et attributs, ainsi // le sens de l'optimisation, de ne pas 'extras' ou 'candy' dans le modèle. var LoopObj: TVehicleUnit begin LoopObj := Self // Traverse avant LoopObj.M_hauler.DefaultSubscribe(Abonné, breResubscribe) alors que Assigné(LoopObj.Le transporteur) ne begin LoopObj := LoopObj.Transporteur LoopObj.M_hauler.DefaultSubscribe(Abonné, breResubscribe) fin M_CombinationFirst.BoldObject := LoopObj fin
procédure TVehicleUnit._CombinationLast_DeriveAndSubscribe(DerivedObject: TObject Abonné: TBoldSubscriber) var LoopObj: TVehicleUnit begin LoopObj := Auto LoopObj.M_trailer.DefaultSubscribe(Abonné, breResubscribe) alors que Assigné(LoopObj.remorque) ne begin LoopObj := LoopObj.remorque LoopObj.M_trailer.DefaultSubscribe(Abonné, breResubscribe) fin M_CombinationLast.BoldObject := LoopObj fin
procédure TVehicleUnit.CombinationUnits_DeriveAndSubscribe(...) var LoopObj: TVehicleUnit ResultList: TBoldObjectList begin M_CombinationUnits.Clair ResultList := TBoldObjectList.Créer M_CombinationFirst.DefaultSubscribe(Abonné, breResubscribe) LoopObj := CombinationFirst repeat ResultList.Ajouter(LoopObj) LoopObj.M_trailer.DefaultSubscribe(Abonné, breResubscribe) LoopObj := LoopObj.remorque jusqu'à ce que LoopObj = nil enfin M_CombinationUnits.AddList(ResultList) FreeAndNil(ResultList) fin fin
procédure TVehicleUnit._CombinationLoadItems_DeriveAndSubscribe(DerivedObject: TObject Abonné: TBoldSubscriber) // Une liste de la collecte de tous (lot)des objets chargés sur n'importe quelle unité dans la // le véhicule. Mis en œuvre pour des raisons de commodité et de // clearification. var UnitCnt, i: Integer UnitObj: TVehicleUnit begin M_CombinationLoadItems.Clair CombinationUnits.DefaultSubscribe(Abonné, breResubscribe) UnitCnt := CombinationUnits.Le comte si UnitCnt > 0, alors begin for i := 0 to UnitCnt-1 do begin UnitObj := CombinationUnits[i] UnitObj.loadedItems.EnsureObjects UnitObj.loadedItems.DefaultSubscribe(Abonné) // Collecter toutes si UnitObj.loadedItems.Count > 0 then M_CombinationLoadItems.AddList(UnitObj.loadedItems) fin fin fin |
// Rolf Lampa
(Actuel de l'adresse mail: rolf-dot-lampa-à-rilnet-dot-com)
& nbsp
Navigation dynamique pour de meilleures performances
Navigation dynamique pour de meilleures performances : Plusieurs milliers de conseils pour vous faciliter la vie.
Reduction ou de la suppression de code de navigation de l'interface utilisateur en ajoutant des derives des liens et, dans le meme temps, l'amelioration de la performance.
Modelisation des structures de classe prend un peu de la pensee, et la pensee et le dessin, et apres que le demarrage a l'aide du modele, alors vous allez passer la terrible beaucoup de code en parcourant les liens de afin de recuperer trivial info dans une structure de l'objet. La navigation en meme parfois complique lien-chemins plus et plus encore une fois la puissance du CPU, et il faut aussi beaucoup de code redondant et/ou expressions qui accedent a la meme chemins de navigation, encore et encore. Dans l'architecture Audacieuse vous mettrait egalement redondante des abonnements a partir de nombreux endroits differents a la meme cible de l'abonnement pour les memes chemins, plus d'une fois.
Mais avec des caracteres Gras, vous pouvez souvent directement a l'adresse inutile de navigation, licencies a la navigation de code/ocl-expressions et gain de diminution de la charge CPU par l'ajout de derives associations en faisant plutot rares persistante des liens plus utile et plus 'intelligent'. Et, de plus, directement dans votre modele votre modele en meme temps refleter plus precisement les parties du modele est reellement utilisee. Et comment le faire.
Un exemple peut montrer une situation typique ou l'ajout de nombreux derives de liens, d'etendre le modele avec le plus d'informations utiles, le resultat sera plus efficace, moins redondant et un code plus lisible. Si nous parlions d'artisanats traditionnels vous aurait probablement pense que je plaisantais, parce que nous avons l'habitude de ne pas nous sauver de plus en plus de problemes en ajoutant plus de relations entre les objets...! Mais je ne plaisante pas - vous fait beneficier de tous les avantages mentionnes par l'ajout de quelques lignes simples a l'aide du modele de Gras.
EXEMPLE
Un camion de combinaison peut nous servir d'un exemple. L'exemple de modele sera constitue d'unites sur Vehicule, quelques Parcelles et une excursion d'objet en gardant tout le voyage d'infos et de calculs. Avec ces trois categories de base nous allons finir l'ecriture de pres de 50% de code (ou expressions) dans les algorithmes de navigation dans la structure de base qui n'a que trois persistante des liens... Tel codage est trivial, prend du temps et n'ajoute rien de valeur pour le systeme.
d'Abord un 'RIL la representation d'un monde' de l'exemple avant de les representer a l'aide d'un diagramme de classes UML ('RIL' est mes initiales) :
Fig 1: Cette combinaison de Vehicules contenant des Colis, mais seulement a l'avant de la plupart des VehicleUnit conserve Voyage d'infos sur les distances, les evenements et les calculs economiques.
Ignorer les arts aspects de l'illustration. Pour plusieurs raisons, ne sont pas discutees ici, le VehicleUnits illustre ci-dessus a toujours un voyage d'objet connecte, mais seulement a l'avant de la plupart des voyage de l'objet a representer l'ensemble de la combinaison. L'autre voyage les objets/les calculatrices sont 'demobilises' jusqu'a ce que la remorque (peut-etre) est deconnecte du camion, et puis la bande annonce sera valide (avant'la plupart') TripHolder sur son propre.
Imaginez vous affichez une des unites sur Vehicule ou de l'une des Parcelles dans une INTERFACE utilisateur et vous auriez probablement envie d'en savoir plus sur le voyage infos, peut-etre la distance parcourue, les adresses visitees, le visting d'ordre, de coûts ou de revenus par km etc (tous administres par le voyage de l'objet).
Il y a seulement trois relations dans ce modele, mais encore vous devez reflechir a deux fois lorsque vous essayez de naviguer correctement en essayant de trouver la 'calculatrice' (ici pour representer un 'voyage de la classe').
Ce serait encore pire si vous souhaitez mettre en œuvre un certain generique de la logique ou des calculs pour les VehicleUnits parce que vous auriez toujours vous assurer que vous accedez au 'front de la plupart des vehicules de l'unite' (appelons cela le 'transporteur') et a partir de la, allez directement sur le voyage d'info (le calculateur).
Dans l'application reelle il y a tellement d'infos integres dans cette structure de base que les trois liens seraient consultes/naviguer encore et encore tellement de fois que plusieurs centaines de lignes de code (et/ou des expressions OCL) serait ecrit 'ici, la et partout'. L'une des mauvaises choses avec cela est que si vous l'avez explicitement traverser ces liens a chaque fois que vous avez besoin d'acceder a un objet/attribut a l'autre extremite de la structure, vous aurez besoin pour executer cette logique dans le CPU a chaque fois.
une Autre chose mauvaise, c'est que votre cœur de metier de la logique serait de 'noyer' dans le code et les expressions de traiter avec cette triviale de navigation comme 'if then else, for i :=' et d'attribuer des cheques. C'est la derive des liens peuvent beaucoup aider a eviter une logique mess (derive des attributs aussi, bien sûr).
Fig 2: Un simple modele de classe de l'illustration ci-dessus pourrait ressembler a quelque chose comme ceci :
Le probleme de navigation est plus evident dans ce modele de classe que dans le 'RIL monde de l'illustration'.
Si j'ai selectionnee une Parcelle dans une interface graphique, liste et besoin d'info dans le voyage de l'objet je ne pouvais pas etre sûr de l'exact chemin de navigation pour les 'mobilises' voyage de l'objet qui est l'un pour le voyage valide info. Exemple:
Si le colis a ete charge sur une remorque, l'expression ' vehicleUnit.voyage ' renverrait un demobilises voyage a l'objet, mais si le colis a ete charge sur le vehicule, il serait de retour le desire 'mobilise' voyage de l'objet. Cette complication est une raison suffisante pour y ajouter un derive lien de regler le probleme directement dans le modele, de sorte que l'on n'a jamais une fois aurait a considerer lors de la conception d'algorithmes ou de naviguer dans la structure. Je serait certainement ajouter un lien appele 'EffectiveTrip' comme suit :
Fig 3: Un lien appele 'EffectiveTrip' a ete ajoutee au modele. (J'essaie toujours de laisser la couleur bleue represente 'persistants' (='freeze') et orange representant un 'derive' pour les liens).
Comme je l'ai deja peut prevoir que ce lien sera accessible pour de nombreuses combinaisons de vehicules (dans les grilles, etc) Je voudrais le code de la derivation de l'optimisation de la logique ici pour trouver le 'front de la plupart des vehicules' et qui signifie de la traversee de la remorque/transporteur de lien et de s'arreter quand le transporteur de liaison est nulle (=IsFrontMost). A partir de la, nous pouvons reference du voyage de l'objet directement. Mais je sais aussi que pour trouver de l'avant de la plupart des vehicules (la combinaison transporteur) est tres typique et arrivera meme plus souvent que l'acces a la voyage de l'objet lui-meme. Je sais deja que le EffectiveTrip lien peut utiliser un derive lien! Ajoutons tout de suite en lui donnant le nom de 'CombinationFirst'.
j'ai choisi le nom de 'CombinationFirst' parce qu'alors, vous realisez immediatement les typiques dans cette situation. C'est une liste typique de la manipulation de probleme. Vous pouvez deja imaginer l'utilite d'un autre derive du lien qu'on peut appeler 'CombinationLast' et meme d'un troisieme lien appele 'CombinationUnits'!
je peux vous assurer que ces liens seront frequemment utilise et donc le 'coût' de leur evaluation sera paye deja la deuxieme fois que vous utilisez l'un d'eux !
Fig 4: Ne pas egalement a l'origine des liens necessitent CPU afin d'etre evalues...? vous pourriez vous demander. La reponse est, oui, bien sûr - mais une fois seulement - si l'abonne elements ne changent pas. Et ce n'est pas tres probable, mais le tres 'hot spot' de la structure sera utilise dans de nombreux endroits dans la logique d'acces aux objets de la croix plus tres souvent et ce faisant les liens deja renvoie directement aux instances que vous souhaitez acceder. Regardez le 'mess' ci-dessous... ! :
Ce une solution de haute performance a l'aide du modele en tant qu'outil pour l'optimisation, et en meme temps les liens supplementaires sont clarifier/en indiquant directement dans le modele de l'utilisation prevue de cette structure specifique !
Pour ceux d'entre vous qui pensent que j'ai enfin eu le fou, je peux dire que je n'ai pas. Au lieu de cela j'ai augmente la vitesse des calculs et de toutes les activites liees a cette structure dans un monde reel de l'application avec plusieurs milliers de pourcents par rapport a definir de façon explicite le chemin de navigation complet, chaque fois que la combinaison de voyage ou d'un Vehicule specifique de l'unite (ou de l'attribut dans l'un d'eux) a ete consulte !
Tous les types de donnees sont stockees dans cette structure et plus de 30 derive des attributs pour les differents accede a des fins de calcul de la structure avant en arriere tout le temps de fournir le client de l'utilisateur en temps reel les calculs de revenus/km et les distances, la distance d'actions de totaux, de partager des actions de... etc, etc.
Le truc, c'est de laisser un derive lien utiliser les autres liens aussi souvent cul possible, alors meme que la necessite de reevaluer les liens quand les choses changements diminue!
La derniere declaration peut etre verifie tres clairement avec un exemple qui montre combien il est important de 'REUTILISATION' tout ce que vous tirent a chaque niveau plus eleve (a l'egard de laquelle une partie de la structure est plus susceptible de changement et de la partie est plus 'statique'). Avec 'reutilisation' je veux dire 'la CPU de travail deja fait' dans la determination de la liaison. Plus a ce sujet pourrait faire l'objet d'un article distinct.
Maintenant, regardez le code. Nous avons besoin de trouver le voyage de l'objet (pour une reson), a partir d'une Parcelle, mais nous ne savons pas a qui VehicleUnit nous sommes charge de sorte que nous commençons a nous en utilisant le lien 'EffectiveTrip' qui 'se cache' la logique de la determination de voyage pour lequel l'objet est 'mobilise' (j'.e 'efficace') :
fonction TParcel.CalculateTrip_Something...: Double var TripObj : TTrip commencer TripObj := vehicleUnit.effectiveTrip // c'est ça! ... |
Facile, c'est un code clair. Les details sur la façon dont nous avons mis la main sur le bon de voyage de l'objet ne doit pas etre melanger la logique d'affaires ayant trait a l'acces ou de calculs dans la structure de l'objet.
Dans notre monde reel, l'application VehicleUnits et des Parcelles de la commune est super classe (non montre ici). Un vehicule peut etre charge sur un autre vehicule, comme tous les autres colis, de sorte que le code ci-dessus est encore plus simple dans mon dernier modele generique ou la derivee lien est 'virtuel surdefini' dans les differentes sous-classes. Mon code final qui va comme ceci :
commencer TripObj := effectiveTrip // c'est ça! |
Le Colis trouverez la validite de son voyage a l'aide de cette commande, quel que soit le degre de complexite de la trajectoire peut etre. Ceci est montre dans la figure 5 ou une commune de la super-classe est le proprietaire de la persistance et de la derivee lien pour le voyage de classe et la EffectiveTrip-link est d'abord mises en œuvre dans le TParcel et puis surdefini pour la VehicleUnit classe comme indique ci-dessous.
Fig 5: Ici, j'ai modifie le modele pour devenir plus generique permettant a toute 'planable objet' la realisation d'un lot d'autres planable objets - et que le modele va plus generique les noms de role faire trop.
Voyage d'info s'applique directement pour un Colis (via AbstractPlanPortion) parce qu'une entreprise de transport de planifier un colis soit livre avec, par exemple, un avion qui les totaux ne nous interesse pas - mais nous sommes toujours interesses a maintenir une trace de tout voyage evenements impliques dans le transport proprement dit, et de la documentation et des transactions figurant sur le colis lui-meme etc. Mais cela signifie aussi que quand il y a besoin d'avoir acces a la 'efficace' voyage de l'objet nous faisons egalement de la necessite d'effectuer de tres complique verifie tous les cours de la structure d'essayer de savoir dans quel contexte le (bon, 'mobilise') voyage de l'objet peut etre trouve... Cela va vraiment faire de notre logique, un peu complique pour une chose si simple que de simplement recuperer des donnees a partir de la structure. Un veritable cauchemar en fait...
Cette complication d'une simple chose n'est pas tout a fait unique. Ce qui est unique, c'est comment elle peut etre traitee avec l'utilisation Audacieuse de la technologie avec son derive des liens.
Le Colis peut etre le TripHolder lui-meme, ou si le Colis est charge sur un transporteur, il ne sais pas si il est charge sur le support qui tient reellement le voyage d'info. Nous avons vraiment besoin de faire quelques navigatiion ici. Dans une situation comme cela, vous pouvez facilement imaginer combien de codage et de la complexite des expressions OCL serait a acceder a l'information dans la structure. Votre cœur de metier de la logique serait de 'noyer' dans la navigation des logiques lorsque tout simplement de recuperer des choses insignifiantes de la structure et le CPU serait de passer beaucoup de temps a trouver Votre chemin(s) pour la cible d'objets de donnees.
Enfin : Trois (3) persistante des liens de la tenue de la structure de l'ensemble fini dans une autre periode de cinq (5) tres utile derive des liens ! Le resultat est que l'application s'execute beaucoup plus rapidement et logique d'entreprise est tenu de plus en dehors de trivial de navigation a l'infini de la traversee de structures d'objets.
Avant d'inscrire le code le plus efficace pour l'optimisation de la code en dur derivations des liens, je voudrais, pour conclure, que, avec ces liens, vous pouvez, a partir de n'importe ou dans la structure, aller n'importe ou - directement - par lien de referencement membres avec des noms entierement en precisant ce que vous avez l'intention d'acces, et ce sera fait dans la maniere la plus efficace que vous pouvez venir avec l'aide de l'ordinaire architecture Audacieuse.
Avec 'efficace', je veux dire 'toujours un acces direct a la cible souhaitee instance de l'objet' (sauf pour la premiere evaluation qui dans mon cas n'arrive qu'une fois pour des centaines d'acces...).
Ce n'est qu'une partie des concepts que nous avons utilises consciemment afin de rendre possible ce qui n'etait pas possible avant : utilisation reguliere, mais 'clean design', modelise et structuree, orientee objet classes d'affaires performants de haute performance en temps reel (re)faire des calculs tres avancee pour les calculs de trajet (non aborde ici). Sur un seul CPU (serveur d'application) pour plusieurs clients.
la Derivation de code, avec des commentaires
Dans le code ci-dessous j'ai souligne tout a la reference interne de la derivee de liens ('la reutilisation efficace de deja evalue les resultats').
j'ai aussi utilise des variables locales, ainsi, eviter l'interne 'look up' de l'audace de membres plus d'une fois (=> eviter repete le declenchement de l'interieur gras d'evenements, etc).
L'efficacite de l'ensemble du concept discute, et les modalites de codage ci-dessous est verifiee a l'aide de ProDelphi profiler (tres haute precision ( -3%) sur la mesure des performances du code).
{ TParcel }
procedure TParcel._EffectiveTrip_DeriveAndSubscribe(...) // Si le chargement des transporteurs (efficace) voyage est retourne, // sinon le trajet local (le cas echeant). var CarrierObj: TVehicleUnit ResultValue : TTrip begin M_batchHolder.DefaultSubscribe(Abonne, breResubscribe) CarrierObj := batchHolder s'il est Affecte(CarrierObj) begin CarrierObj.M_EffectiveTrip.DefaultSubscribe(Abonne, breResubscribe) ResultValue := CarrierObj.EffectiveTrip fin else begin M_trip.DefaultSubscribe(Abonne, breResubscribe) ResultValue := voyage fin M_EffectiveTrip.BoldObject := ResultValue fin
{ TVehicleUnit }
procedure TVehicleUnit._EffectiveTrip_DeriveAndSubscribe(...) var HaulerObj: TVehicleUnit ResultValue, TripObj: TTrip begin ResultValue := nil M_CombinationFirst.DefaultSubscribe(Abonne, breResubscribe) HaulerObj := CombinationFirst // la traversee est deja fait ici s'il est Affecte(HaulerObj) begin HaulerObj.M_Trip.DefaultSubscribe(Abonne, breResubscribe) TripObj := HaulerObj.voyage s'il est Affecte(TripObj) begin TripObj.M_IsMobilized.DefaultSubscribe(Abonne) si TripObj.IsMobilized puis ResultValue := TripObj fin fin M_EffectiveTrip.BoldObject := ResultValue fin
procedure TVehicleUnit._CombinationFirst_DeriveAndSubscribe(...) // Ce lien sera le rapide 'short cut', utilise par beaucoup de beaucoup de // les fonctions dans le present champ d'application et les autres liens et attributs, ainsi // le sens de l'optimisation, de ne pas 'extras' ou 'candy' dans le modele. var LoopObj: TVehicleUnit begin LoopObj := Self // Traverse avant LoopObj.M_hauler.DefaultSubscribe(Abonne, breResubscribe) alors que Assigne(LoopObj.Le transporteur) ne begin LoopObj := LoopObj.Transporteur LoopObj.M_hauler.DefaultSubscribe(Abonne, breResubscribe) fin M_CombinationFirst.BoldObject := LoopObj fin
procedure TVehicleUnit._CombinationLast_DeriveAndSubscribe(DerivedObject: TObject Abonne: TBoldSubscriber) var LoopObj: TVehicleUnit begin LoopObj := Auto LoopObj.M_trailer.DefaultSubscribe(Abonne, breResubscribe) alors que Assigne(LoopObj.remorque) ne begin LoopObj := LoopObj.remorque LoopObj.M_trailer.DefaultSubscribe(Abonne, breResubscribe) fin M_CombinationLast.BoldObject := LoopObj fin
procedure TVehicleUnit.CombinationUnits_DeriveAndSubscribe(...) var LoopObj: TVehicleUnit ResultList: TBoldObjectList begin M_CombinationUnits.Clair ResultList := TBoldObjectList.Creer M_CombinationFirst.DefaultSubscribe(Abonne, breResubscribe) LoopObj := CombinationFirst repeat ResultList.Ajouter(LoopObj) LoopObj.M_trailer.DefaultSubscribe(Abonne, breResubscribe) LoopObj := LoopObj.remorque jusqu'a ce que LoopObj = nil enfin M_CombinationUnits.AddList(ResultList) FreeAndNil(ResultList) fin fin
procedure TVehicleUnit._CombinationLoadItems_DeriveAndSubscribe(DerivedObject: TObject Abonne: TBoldSubscriber) // Une liste de la collecte de tous (lot)des objets charges sur n'importe quelle unite dans la // le vehicule. Mis en œuvre pour des raisons de commodite et de // clearification. var UnitCnt, i: Integer UnitObj: TVehicleUnit begin M_CombinationLoadItems.Clair CombinationUnits.DefaultSubscribe(Abonne, breResubscribe) UnitCnt := CombinationUnits.Le comte si UnitCnt > 0, alors begin for i := 0 to UnitCnt-1 do begin UnitObj := CombinationUnits[i] UnitObj.loadedItems.EnsureObjects UnitObj.loadedItems.DefaultSubscribe(Abonne) // Collecter toutes si UnitObj.loadedItems.Count > 0 then M_CombinationLoadItems.AddList(UnitObj.loadedItems) fin fin fin |
// Rolf Lampa
(Actuel de l'adresse mail: rolf-dot-lampa-a-rilnet-dot-com)
& nbsp
Navigation dynamique pour de meilleures performances
By commentfaire
Navigation dynamique pour de meilleures performances : Plusieurs milliers de conseils pour vous faciliter la vie.