В чем разница между "пакетом" и "модулем"

Я использую Java, где у нас есть только пакеты. Я знаю, что есть и другие языки программирования, которые также включают модули.

Какая разница?

Спасибо

5 ответов

Решение

Трудно сравнить семантику в пустоте. (Какие еще языки вы имеете в виду?) "Модуль" может быть аналогом Java-класса, или пакета Java, или чего-то другого, полностью, в зависимости от этого другого языка. Обычно, поскольку "модули", как правило, происходят из процедурных языков, я склоняюсь к тому, чтобы произносить класс Java, но я думаю, что в этот момент строка очень нечеткая, и вы можете достаточно убедительно аргументировать пакет.

Система Java Platform Module System или JPMS была представлена, когда был выпущен java-9. Начиная с того времени, Java имеет оба packages а также modules, Так в чем же разница между ними?

Что такое пакет?

Пакет - это пространство имен, которое организует набор связанных классов и интерфейсов.

Что такое модуль?

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

Мы можем рассматривать Java-модуль как более высокий уровень агрегации над пакетами. Модуль позволяет вам организовать несколько пакетов в одну логическую единицу и распределить их как одну целую систему. Также JPMS предоставляет способ контролировать, какие пакеты видны пользователям.

Комментарий instanceofTom прибил его - разные языки имеют разные определения пакета и модуля. Поэтому нет языкового агностического ответа на этот вопрос.

Я постараюсь ответить на него с точки зрения некоторых языков, которые я знаю:

  • Ява: у него есть концепция packages, которые по сути являются просто механизмом организации классов Java, интерфейсов и т. д. в пространства имен. Они требуют иерархической структуры. packageУ них нет статуса первого класса. Также стоит отметить, что superpackages, предложенные для Java 7, также иногда называют modules.

  • Modula: modules, то же самое в концепции для Java packages. Не требует иерархической структуры.

  • C#: namespacesТо же самое в концепции Java packages. Не требует иерархической структуры.

  • C++: namespacesКак видно из названия, это просто пространства имен. Не требует иерархической структуры.

  • Haskell: modules, то же самое в концепции для Java packages.

  • Scala: packageв Скале такие же как packageв Java, за исключением того, что они не требуют иерархических структур. Еще несколько ограничений, таких как один публичный класс на файл, также были смягчены. objects в Scala также называются модулями, и они также имеют первоклассный статус.

  • F#: namespaces в F# такие же, как C# namespaces. Кроме того namespaces, F# также имеет modules которые реализуются на уровне CLR как классы.NET со статическими методами. Они не первоклассные сущности.

Кажется, что, как утверждают другие ответы, понятие модуля варьируется от одного языка к другому, некоторые даже не имеют его (но имеют соответствующий аналог).

Тем не менее, похоже, что в настоящее время модули представляют собой скорее концепцию и относятся к набору файлов исходного кода, которые могут использоваться независимо друг от друга. Следуя этому определению, файлы jar Java не являются модулями, поскольку они содержат файлы, скомпилированные с помощью байт-кода (файлы.class). Система модулей, соответствующая этому определению, должна быть введена в Java 9 ( см. Эту статью) и присутствует в других языках, в которых есть менеджеры модулей или пакетов, часто напрямую именующие пакеты модулей (инструмент Go lang/go, Python/pip, PHP/ Композитор...) где пакет, как правило, упакованные модули.

Пакет больше похож на пространство имен C++, чем на модуль. Модуль больше похож на окружающий класс, чем на пакет.

Другие вопросы по тегам