#ada #encapsulation
#ada #инкапсуляция
Вопрос:
Я новичок в языке ADA, и в процессе обучения я видел много примеров, в которых используется эта функциональность ADA. Мне кажется, что это может быть полезно только для модульного тестирования, чтобы иметь возможность тестировать частные типы и методы родительского пакета, но я не вижу никаких преимуществ для кодирования таким образом, кажется, что это нарушает инкапсуляцию.
Рекомендуется ли использовать их отдельно от модульного тестирования?
Ответ №1:
Дочерние пакеты можно рассматривать как расширение для их родительских.
Его можно использовать, например, для предоставления функций, которые напрямую не связаны с вашим базовым пакетом.
Типичным примером является пакет ввода-вывода.
Представьте себе следующий пакет :
package Temperature is
type Kelvin_Temp is private;
type Celsius_Temp is private;
function build (temp : Positive) return Kelvin_Temp;
function build (temp : Integer) return Celsius_Temp;
function to_celsius (temp : in Kelvin_Temp) return Celsius_Temp;
function to_kelvin (temp : in Celsius_Temp) return Kelvin_Temp;
private
type Kelvin_Temp is 0.0 .. 10_000.0;
type Celsius_Temp is -273.0 .. 10_000.0;
end Temperature;
Этот пакет предоставляет базовые операции, непосредственно связанные с определенными типами.
Что, если вы хотите расширить его, чтобы обеспечить ввод-вывод в текстовом формате? Вы можете поместить операции внутри пакета Temperature, но если вы хотите добавить другие типы ввода-вывода, такие как ввод-вывод базы данных, у вас будет много функций, которые напрямую не связаны с вашими типами внутри того же файла.
Вы можете определить
package Temperature.Text_IO is
procedure Put(temp : Celsius_Temp);
procedure Put(temp : Kelvin_Temp);
end Temperature.Text_IO;
и
package Temperature.Database_IO is
procedure insert (Temp : in Celsius_Temp);
procedure insert (Temp : in Kelvin_Temp);
end Temperature.Database_IO;
Это именно то, что делается с помощью ввода-вывода в стандартной библиотеке
С точки зрения инкапсуляции ваши частные типы будут оставаться закрытыми вне иерархии пакетов, чтобы вы не нарушали инкапсуляцию.
Комментарии:
1. Да, определенно: D
2. Изменил его на insert, который менее подвержен ошибкам, поскольку это не ключевое слово Ada
3. Большое вам спасибо за ваш комментарий! У меня все еще есть вопрос, касающийся ООП. Допустим, у вас есть частный помеченный абстрактный тип Parent_T в родительском пакете. По-прежнему ли рекомендуется создавать родительский дочерний пакет. Дочерний пакет, который также наследует тип Parent_T? Например,
type Child_T is new Parent_T with private;
я видел что-то подобное, и мне это не слишком нравится4. Ну, это может быть другой вопрос 😉 Тем не менее, что вам в этом не нравится? Вы можете сделать это так, как вам больше нравится, дочерний пакет или нет. Лично я не использую дочерний пакет для этого, но вы могли бы взглянуть на это ( en.wikibooks.org/wiki/Ada_Style_Guide/Object-Oriented_Features )
Ответ №2:
Вы можете ознакомиться с этой презентацией, представленной на FOSDEM 2018, в которой обсуждаются (частные) пакеты и обеспечение безопасности:
Комментарии:
1. Это видео очень интересное, спасибо, что поделились им
Ответ №3:
Дочерние пакеты существуют для того, чтобы разрешать программирование с помощью расширения, но при реализации они также предоставляют способ обойти сокрытие информации, которую должны обеспечивать pkg.
Хотя может быть удобно спроектировать иерархию pkg, совместно использующих некоторую скрытую информацию, программирование с помощью расширения, как правило, является плохой идеей, которая подчеркивает простоту записи над простотой чтения и кодирования над разработкой программного обеспечения. Возможно, вас заинтересует статья «Нарушение Закона о конфиденциальности Ada», доступная здесь.
Комментарии:
1. Спасибо за ваш ответ! К сожалению, я не могу прочитать всю статью без оплаты. Это моя точка зрения, но я недостаточно знаю язык для составления окончательного мнения.
2. Предполагается, что эта ссылка обеспечивает бесплатный доступ к статье. Мне нужно будет поговорить с ними. Напишите мне адрес электронной почты, и я отправлю вам копию.
3. Я думал, что здесь поддерживаются личные сообщения, но, похоже, я ошибся. Бумага уже в пути.