web-dev-qa-db-fra.com

Quelle est la différence entre "package" et "module"?

J'utilise Java où nous n'avons que des packages. Je sais qu'il existe d'autres langages de programmation qui incluent également des modules.

Quelle est la différence?

32
OscarRyz

Il est difficile de comparer la sémantique dans le vide. (De quelles autres langues parlez-vous?) Un "module" peut être analogue à une classe Java, ou à un package Java, ou autre chose entièrement, selon sur cet autre langage. Généralement, puisque les "modules" sont généralement issus de langages procéduraux, je pencherais pour dire Java class, mais je pense que la ligne est très floue à ce moment-là et vous pourriez argumenter le paquet de manière assez convaincante.

24
T.J. Crowder

le commentaire d'instanceofTom l'a cloué - Différentes langues ont différentes définitions de paquet et de module. Il n'y a donc pas de réponse indépendante de la langue à cette question.

Je vais essayer d'y répondre du point de vue de certaines des langues que je connais:

  • Java: Il a un concept de packages, qui sont fondamentalement juste un mécanisme pour organiser Java classes, interfaces, etc. en espaces de noms. Ils nécessitent une structure hiérarchique. packages n'ont pas de statut de première classe. Il convient également de noter que les superpackages proposés pour Java 7 sont aussi parfois appelés modules.

  • Modula: modules, même concept que les packages de Java. Ne nécessite pas de structure hiérarchique.

  • C #: namespaces, même concept que les packages de Java. Ne nécessite pas de structure hiérarchique.

  • C++: namespaces, Comme son nom l'indique, ce ne sont que des espaces de noms. Ne nécessite pas de structure hiérarchique.

  • Haskell: modules, même concept que les packages de Java.

  • Scala: packages en Scala sont les mêmes que packages en Java, sauf qu'ils ne nécessitent pas de structures hiérarchiques. Quelques restrictions supplémentaires comme one-public- La classe par fichier a également été assouplie. objects dans Scala sont également appelés modules, et ils bénéficient également du statut de première classe.

  • F #: namespaces en F # sont identiques à C # namespaces. Outre namespaces, F # a également modules qui sont implémentés au niveau CLR en tant que classes .NET avec des méthodes statiques. Ce ne sont pas des entités de première classe.

18
missingfaktor

Il semble que, comme d'autres réponses l'indiquent, la notion de module varie d'une langue à l'autre, certains ne l'ayant même pas (mais une contrepartie correspondante).

Cependant, il semble que de nos jours les modules soient plus un concept et se réfèrent à un ensemble de fichiers de code source qui peuvent être partagés indépendamment. Suivant cette définition, Java ne sont pas des modules car ils contiennent des fichiers compilés en bytecode (fichiers .class). Un système de modules conforme à cette définition doit être introduit dans Java 9 ( voir cet article ) et est présent dans d'autres langages qui ont des gestionnaires de modules ou de packages, nommant souvent directement les modules packages (Outil Go lang/go, Python/pip, PHP/Composer ...) où les packages sont généralement des modules emballés.

5
Josuah Aron

Java Platform Module System ou JPMS a été introduit lors de la sortie de Java-9 . A partir de ce moment Java a à la fois packages et modules. Quelle est donc la différence entre eux?

Qu'est-ce qu'un package?

Un package est un espace de noms qui organise un ensemble de classes et d'interfaces associées.

Qu'est-ce qu'un module?

Un module est une collection de packages Java Java et ressources associées avec un fichier descripteur, qui contient des informations sur les packages/ressources qui sont exposés par ce module, quels packages sont utilisés par le module actuel et d'autres) information.

Nous pouvons penser à un module Java comme niveau d'agrégation supérieur aux packages. Un module vous permet d'organiser quelques packages en une seule unité logique et de les distribuer comme un système entier. De même JPMS fournit un moyen de contrôler quels packages sont visibles par les utilisateurs.

4
Anton Balaniuc

Un package s'apparente plus à un espace de noms C++ qu'à un module. Un module s'apparente plus à une classe englobante qu'à un package.

0
user207421