В чем разница между "пакетом" и "модулем"
Я использую Java, где у нас есть только пакеты. Я знаю, что есть и другие языки программирования, которые также включают модули.
Какая разница?
Спасибо
5 ответов
Трудно сравнить семантику в пустоте. (Какие еще языки вы имеете в виду?) "Модуль" может быть аналогом Java-класса, или пакета Java, или чего-то другого, полностью, в зависимости от этого другого языка. Обычно, поскольку "модули", как правило, происходят из процедурных языков, я склоняюсь к тому, чтобы произносить класс Java, но я думаю, что в этот момент строка очень нечеткая, и вы можете достаточно убедительно аргументировать пакет.
Система Java Platform Module System или JPMS была представлена, когда был выпущен java-9. Начиная с того времени, Java имеет оба packages
а также modules
, Так в чем же разница между ними?
Что такое пакет?
Пакет - это пространство имен, которое организует набор связанных классов и интерфейсов.
Что такое модуль?
Модуль представляет собой набор связанных пакетов Java и связанных ресурсов с файлом дескриптора, который содержит информацию о том, какие пакеты / ресурсы предоставляются этим модулем, какие пакеты используются текущим модулем, и некоторую другую информацию.
Мы можем рассматривать Java-модуль как более высокий уровень агрегации над пакетами. Модуль позволяет вам организовать несколько пакетов в одну логическую единицу и распределить их как одну целую систему. Также JPMS предоставляет способ контролировать, какие пакеты видны пользователям.
Комментарий instanceofTom прибил его - разные языки имеют разные определения пакета и модуля. Поэтому нет языкового агностического ответа на этот вопрос.
Я постараюсь ответить на него с точки зрения некоторых языков, которые я знаю:
Ява: у него есть концепция
package
s, которые по сути являются просто механизмом организации классов Java, интерфейсов и т. д. в пространства имен. Они требуют иерархической структуры.package
У них нет статуса первого класса. Также стоит отметить, чтоsuperpackage
s, предложенные для Java 7, также иногда называютmodule
s.Modula:
module
s, то же самое в концепции для Javapackage
s. Не требует иерархической структуры.C#:
namespaces
То же самое в концепции Javapackage
s. Не требует иерархической структуры.C++:
namespaces
Как видно из названия, это просто пространства имен. Не требует иерархической структуры.Haskell:
module
s, то же самое в концепции для Javapackage
s.Scala:
package
в Скале такие же какpackage
в Java, за исключением того, что они не требуют иерархических структур. Еще несколько ограничений, таких как один публичный класс на файл, также были смягчены.object
s в Scala также называются модулями, и они также имеют первоклассный статус.F#:
namespaces
в F# такие же, как C#namespace
s. Кроме тогоnamespace
s, F# также имеетmodules
которые реализуются на уровне CLR как классы.NET со статическими методами. Они не первоклассные сущности.
Кажется, что, как утверждают другие ответы, понятие модуля варьируется от одного языка к другому, некоторые даже не имеют его (но имеют соответствующий аналог).
Тем не менее, похоже, что в настоящее время модули представляют собой скорее концепцию и относятся к набору файлов исходного кода, которые могут использоваться независимо друг от друга. Следуя этому определению, файлы jar Java не являются модулями, поскольку они содержат файлы, скомпилированные с помощью байт-кода (файлы.class). Система модулей, соответствующая этому определению, должна быть введена в Java 9 ( см. Эту статью) и присутствует в других языках, в которых есть менеджеры модулей или пакетов, часто напрямую именующие пакеты модулей (инструмент Go lang/go, Python/pip, PHP/ Композитор...) где пакет, как правило, упакованные модули.
Пакет больше похож на пространство имен C++, чем на модуль. Модуль больше похож на окружающий класс, чем на пакет.