Предельные функции, которые будут вызываться определенными другими функциями в Аде - PullRequest
1 голос
/ 12 октября 2010

Предположим, у меня есть процедура, которую я хочу вызвать только другой конкретной процедурой. Можно ли принудительно установить ограничения для этой процедуры, чтобы на нее могла ссылаться только указанная вызывающая процедура? На самом деле я хочу знать, есть ли другой способ написания кода, чтобы вам не приходилось встраивать / вставлять процедуры в процедуры, чтобы ограничить объем.

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

РЕДАКТИРОВАТЬ: Это для Ада код между прочим.

Ответы [ 3 ]

4 голосов
/ 12 октября 2010

Нет (вообще говоря).

Публичная процедура является публичной процедурой, поэтому она может быть вызвана всем, что «с ней» (если это отдельная процедура) или пакетом, в котором она объявлена.

Есть несколько способов ограничить его видимость, если любой из них может соответствовать вашему подходу к реализации:

  • Объявите процедуру в закрытой части пакета или в теле пакета. Тогда только подпрограммы в этом пакете будут иметь к нему доступ.
  • Объявите поставляющий пакет или подпрограмму как private , тогда те пакеты, которые 'с ним' могут ссылаться только на содержимое поставляющего блока (включая вызов его подпрограмм) в своей частной части или теле пакета.
  • «Приватно» с поставляющим пакетом, чтобы он мог ссылаться только на пакет в своей частной части / теле пакета.

Но, как и Т.Е.Д. говорит, работайте с языком и используйте его возможности, а не пытайтесь воссоздать конструкции другого языка.

3 голосов
/ 12 октября 2010

Ну, если бы вы поместили procedure one в пакет и поместили procedure two в его раздел private, то никакая другая подпрограмма не смогла бы вызвать его (если не записано в пакет или дочерний пакет). ).

Вы также можете создать теговый тип с любыми данными, специфичными для procedure one, и поместить procedure two в его пакет с объектом этого типа в качестве параметра. Тогда другие могут вызвать procedure two, но не с объектом procedure one.

Я немного озадачен тем, почему вы захотите воссоздать ограниченное поведение Ады, хотя и не используете его. Обними язык.

1 голос
/ 13 октября 2010

У меня есть два возможных предложения.Первый немного странный и немного не по теме, но я хотел бы поднять его на тот случай, если вы не знали, так как большинство ответов связано с скрытым отображением кода или изменением отношений

  1. Вы можете рассмотреть возможность использования функций Ada Tasking и использовать «Атрибут звонящего».Обычно это только для задач, и тогда имя «вызывающего» обозначает только вызывающую задачу для принимающей задачи.Но попав внутрь записи принимающей задачи, вы можете использовать имя вызывающего абонента для быстрого завершения или иным образом пометить вызывающего абонента как неправильного или нет ожидаемого абонента.Это, в основном, помещает «швейцара» внутри записи задачи, который может затем решить, продолжить ли это, перевести вызывающего абонента к другой записи или сделать что-то еще.Но опять же, это будет действительно работать, только если у вас есть задача, потребляющая опубликованные вызовы из другой задачи.Это единственное, что мне известно в Аде, где вы можете определить, кто вам звонил, и что-то с этим сделать во время выполнения.

  2. Однако ваш вопрос, похоже, хотел использовать область действия ипоэтому я согласен с тем, что было сказано здесь, и только добавлю, что в Аде обычно есть вложенные процедуры (для удобства чтения), но в дополнение к этому вы можете рассмотреть создание дочерних пакетов и использование иерархии в обратном порядке.Это значит, что дети будут доступны программисту, а родитель будет доступен только детям.Проектируйте родителя так, чтобы он был очень ограничен по объему, так что открытая спецификация родителя абсолютно бесполезна для любого вызывающего абонента, у которого нет частного представления спецификации родителя.Таким образом, у вас есть разделение, и только дети могут получить доступ к функциям родителя и фактически могут вызывать их, потому что они имеют полное представление о типах и определениях родителя.

Удачис вашей проблемой.

...