openlang

Входит ли uses из раздела interface в API?

В модуле Delphi уже есть разделение, которое другие языки всё изобретают заново. Всё, что объявлено выше implementation, видно модулям, которые подключают этот. Всё, что ниже, принадлежит только самому модулю, и тип или процедуру, объявленные лишь там, снаружи даже назвать нельзя.

Недооценивают обычно другое, а именно где стоит uses. Модуль из uses в разделе interface становится тем, на что могут опираться ваши публичные объявления, поэтому изменение его интерфейса расходится дальше, чем нужно. Если он нужен только телам процедур, перечислите его в uses раздела implementation. Компилятор говорит то же самое по-своему. Модули могут зависеть друг от друга взаимно, но не через цикл, составленный только из uses в разделах interface.

Открывая старый настольный проект, я первым делом читаю разделы interface и их списки uses. Короткий раздел interface с коротким списком uses ближе всего к опубликованной поверхности модуля из того, что даёт Pascal, и поддерживать это ничего не стоит.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Если приватность на уровне библиотеки, а не класса, большая часть этого получается и без двух разделов. В Dart идентификатор, начинающийся с _, виден везде в своей библиотеке, включая файлы part, и нигде за её пределами. Публичное лицо пакета обычно один файл в lib/, который делает export со списками show, а настоящий код лежит в lib/src, и другим пакетам импортировать его напрямую не положено. По сути та же идея, что и ваш раздел interface, просто разложенная на файл и соглашение о папках.

  2. Ссылка на ответ

    Стоит добавить, что это работает, только если jar действительно запущен с module path. Положите тот же jar в classpath, и он попадёт в безымянный модуль, где список exports ничего не делает. Доступ на уровне пакета дешевле и работает в обоих случаях, и для старого приложения меня вполне устраивает он плюс соглашение об именах. Сколько мест придётся менять, чтобы добавить дескриптор модуля в приложение, где его никогда не было? Обычно больше, чем кто-либо закладывает.