2010-10-12 5 views
1

Supposons que j'ai une procédure que je souhaite appeler uniquement par une autre procédure spécifique. Est-il possible de forcer des restrictions sur cette procédure afin qu'elle puisse seulement être référencée par la procédure d'appel spécifiée? Vraiment ce que je veux savoir, c'est s'il y a une autre façon d'écrire le code de sorte que vous n'avez pas à imbriquer/intégrer des procédures dans les procédures, pour forcer une portée limitée.Fonctions de limite appelées par d'autres fonctions spécifiques dans Ada

procedure one 
    procedure two 
    begin 
     blah 
    end two; 
begin 
end one; 

EDIT: Ceci est pour Ada Code btw.

Répondre

4

Non (d'une manière générale).

Une procédure publique est une procédure publique, elle peut donc être invoquée par tout ce qui "l'accompagne" (s'il s'agit d'une procédure autonome) ou le paquet dans lequel elle est déclarée.

Il y a quelques façons de contraindre sa visibilité si l'un de ceux-ci pourraient correspondre à votre approche de mise en œuvre:

  • DÉCLARE la procédure dans la partie privée d'un paquet, ou dans le corps de l'emballage. Alors seulement les sous-programmes dans ce paquet y auront accès. Déclarer le paquet ou le sous-programme fournisseur comme private, puis les paquetages avec '' avec '' qui peuvent seulement référencer le contenu de l'unité d'approvisionnement (y compris en invoquant ses sous-programmes) dans leur partie privée ou leur corps de paquet.
  • "Privé avec" le paquet fournisseur, de sorte qu'il ne peut faire référence au paquet qu'au sein de sa partie privée/du paquetage.

Mais comme T.E.D. dit, travailler avec le langage et exploiter ses capacités plutôt que d'essayer de recréer des constructions d'autres langues.

3

Eh bien, si vous deviez mettre procedure one dans un paquet par lui-même et de mettre procedure two dans sa section private, aucune autre routine serait en mesure de l'appeler (à moins écrit dans le paquet ou un paquet d'enfants).

Vous pouvez également créer un type étiqueté avec toutes les données spécifiques à procedure one et mettre procedure two dans son package avec un objet de ce type en tant que paramètre. Ensuite, d'autres peuvent appeler le procedure two, mais pas avec l'objet procedure one. Je suis un peu confus quant à la raison pour laquelle vous voudriez recréer le comportement de scoping d'Ada sans utiliser la portée. Embrasser la langue.

+0

Je suppose que je n'aime vraiment pas beaucoup intégrer du code, et faire des paquets supplémentaires dans ce cas ne fonctionne vraiment pas. Mettre 3 procédures de 20 lignes par exemple, à l'intérieur d'une procédure de 50 lignes, semble désordonné ... J'espérais une façon plus "propre" de le faire, comme peut-être déclarer la fonction dans la section d'élaboration, puis la définir ailleurs, mais ça n'a pas l'air de marcher – onaclov2000

+0

Je suis arrivé là où je l'aime vraiment, et je suis ennuyé par les autres langues qui ne le permettent pas. BTW: Vous n'avez pas vécu jusqu'à ce que vous avez intégré une ** tâche ** à l'intérieur d'un sous-programme. :-) –

1

J'ai deux suggestions possibles. Le premier est un peu étrange et hors sujet un peu, mais je voulais le mettre dans le cas où vous ne saviez pas, puisque la plupart des réponses ont à voir avec cacher la visibilité du code ou l'évolution des relations

  1. Vous pourrait envisager d'utiliser les fonctionnalités Ada Tasking et utiliser l'attribut 'Caller'. Normalement, ceci est seulement pour les tâches et ensuite le nom "appelant" désigne seulement la tâche d'appel à la tâche réceptrice. Mais une fois à l'intérieur de l'entrée de la tâche de réception, vous pouvez utiliser le nom de l'appelant pour terminer rapidement ou signaler l'appelant comme étant incorrect ou pas l'appelant que vous attendiez. Cela met fondamentalement un "portier" à l'intérieur de l'entrée de la tâche qui pourrait alors décider de les laisser continuer, remettre l'appelant dans une entrée différente, ou faire quelque chose d'autre. Mais encore une fois cela ne fonctionnerait vraiment que si vous avez une tâche consommant des appels publiés d'une autre tâche.C'est la seule chose dont je suis conscient dans Ada où vous pouvez détecter qui vous a appelé et faire quelque chose à ce sujet lors de l'exécution. Cependant, votre question semblait vouloir utiliser la portée et donc je suis d'accord avec ce qui a été dit ici et j'ajoute seulement que dans Ada c'est normal d'avoir des procédures imbriquées (pour la lisibilité) mais en plus de cela vous pourriez envisager créer des packages enfants et utiliser la hiérarchie à l'envers. C'est exposer les enfants au programmeur et rendre le parent uniquement accessible aux enfants. Concevoir le parent pour avoir une portée très limitée de telle sorte que la spécification publique du parent ne vaille absolument rien pour un appelant qui n'a pas la vue privée de la spécification du parent. De cette façon, vous avez votre séparation et seuls les enfants peuvent accéder aux fonctions du parent et peuvent les appeler parce qu'ils ont une vue complète des types et des définitions de fonctions du parent.

Bonne chance avec votre problème.

Questions connexes