Christian S.: package oder namespace?

Hi,

ich bastele gerade an meinem eigenen kleinen JavaScript Framework und würde gerne namespace/package ähnliche Strukturen nachbilden. Letztendlich sind das natürlich nur Objekte.

Es sieht letztendlich etwa so aus:

Name.context.irgendwas.MeineKlasse

Nun die Frage: Was ist der Unterschied zwischen einem Package und einem Namespace?

In Java heißt es package, in C# heißt es namespace.

In JavaScript ist package ein reserviertes Wort, was nahelegt, dass der Begriff package für JS angebrachter sei.

In großen Frameworks wird allerdings auch namespace verwendet (MS AJAX, ExtJS, ...)

Mir geht es eigentlich nur um die Terminologie.

Bezeichnet man "Name.context.irgendwas" als Namespace oder als Package? Oder ist es egal?

Gruß
Christian

  1. Hallo,

    Nun die Frage: Was ist der Unterschied zwischen einem Package und einem Namespace?

    Das hängt letztendlich immer von der Programmiersprache, deren Eigenheiten und letztendlich vom Sprachgebrauch ab. Weitere Bezeichnungen für solche Gruppierungsmechanismen sind auch noch Unit, Modul und eben Bibliothek – es gibt da keine globale einheitliche Abgrenzung. Ein Paket stellt einen eigenen Namensraum zur Kapselung dar, ein Namensraum ist wie ein Paket. Man kann also bei JS, in dem das Konzept explizit nachgebildet werden muss, nicht wirklich etwas falsch machen. Alles, was man Dir anbieten kann, ist eine Bauchmeinung, die auf vergangener Erfahrung bei anderen Programmiersprachen beruht.

    In Java heißt es package, in C# heißt es namespace.
    In JavaScript ist package ein reserviertes Wort, was nahelegt, dass der Begriff package für JS angebrachter sei.

    Ich würde für Deinen JS-Variante aber trotzdem Paket vor Namensraum vorziehen. Warum?

    Zum einen, weil Namensraum in Sprachen, die derzeit dieses Konzept benutzen doch einen kleinen Unterschied zum reinen Gruppierungen haben: Man kann gleichzeitig über verschiedene Namen in verschiedenen Namensräumen reden, ohne sie explizit zu qualifizieren. Qualifizierung durch hinzufügen der Namensraum/Paket-Angabe ist erst notwendig, wenn es Konflikte geben könnte. Bei Paketen muss man immer qualifizieren. Ein Paket ist also eher eine Box, in der sich Dinge drin befinden, ein Namensraum ist eher ein zusätzliches Etikett an den Dingen. So ist das bei XML (minus Pakete, natürlich), so bei C# (minus Pakete), es ist ähnlich bei Haskell ...

    ... und zweites, es wird vielleicht in ECMAScript 4 / JavaScript 2.0 so sein. Denn – mal abgesehen von der Frage, ob sich das wirklich mal im Open Web finden wird – dieses kennt Packages, Units und eben auch Namespaces, die man nicht zwangsläufig immer direkt qualifizieren muss. (<http://www.ecmascript.org/es4/spec/overview.pdf@title?PDF zum Querlesen>) Im Sinne von ES4 ist Dein Kapselungsmechanismus eher Paket. Ich fände es nett, wenn die Terminologie ähnlich würde, wenn es denn mal kommt.

    Tim

    1. Hi,

      danke für deine Antwort!

      In Java heißt es package, in C# heißt es namespace.
      In JavaScript ist package ein reserviertes Wort, was nahelegt, dass der Begriff package für JS angebrachter sei.

      Ich würde für Deinen JS-Variante aber trotzdem Paket vor Namensraum vorziehen. Warum?

      Wieso "trotzdem"? Ich tendierte doch schon leicht zu der "package" terminologie, da es von JS schon durch die reservierten Wörter suggeriert wird.
      Das war doch auch deine Tendenz?!

      Zum einen, weil Namensraum in Sprachen, die derzeit dieses Konzept benutzen doch einen kleinen Unterschied zum reinen Gruppierungen haben: Man kann gleichzeitig über verschiedene Namen in verschiedenen Namensräumen reden, ohne sie explizit zu qualifizieren. Qualifizierung durch hinzufügen der Namensraum/Paket-Angabe ist erst notwendig, wenn es Konflikte geben könnte. Bei Paketen muss man immer qualifizieren. Ein Paket ist also eher eine Box, in der sich Dinge drin befinden, ein Namensraum ist eher ein zusätzliches Etikett an den Dingen. So ist das bei XML (minus Pakete, natürlich), so bei C# (minus Pakete), es ist ähnlich bei Haskell ...

      Hm, ganz verstehe ich das nicht... Bei Java schreibt man "imports" und bei C# "using". Was eine package oder namespace einbindet. Und die Klassen eines packages brauchen dann auch nicht mehr vollständig qualifiziert werden.

      Im Sinne von ES4 ist Dein Kapselungsmechanismus eher Paket. Ich fände es nett, wenn die Terminologie ähnlich würde, wenn es denn mal kommt.

      Scheint mir auch so... Wenn was kommt? ES4?

      Gruß!

  2. Moin.

    Vielleicht für dich interessant: http://dean.edwards.name/weblog/2007/12/packages/

    Hier hat jedes package einen namespace-Eigenschaft, die per eval() ausgewertet die package-Variablen im aktuellen Scope (Namensraum ;)) bereitstellt. Im Gegensatz zu with(package){...} wird dabei die Scope-Chain nicht in Mitleidenschaft gezogen.

    Christoph