Gibt es einen Unterschied zwischen einer Komponente und einem Modul?

30

Ich habe ein kleines Problem mit den Begriffen Modul und Komponente. In meinen Augen handelt es sich bei einem Modul um gebündelte Klassen, die nur über eine genau definierte Schnittstelle zugänglich sind. Sie verbergen alle Implementierungsdetails und sind wiederverwendbar. Module definieren Module, von denen sie abhängen.

Was ist der Unterschied zu Bauteilen? Ich habe es in einigen Büchern nachgeschlagen, aber die Beschreibung der Komponenten ist sehr ähnlich.

Mirco
quelle
5
Welche Sprache? Welche architektur Ihre Definition des Moduls funktioniert. Ich stelle mir eine Komponente als etwas vor, das in eine GUI eingesteckt wird, während ein Modul nicht in eine GUI eingesteckt werden kann. Module können in einer GUI funktionieren, wenn sie von GUI-Konstrukten umschlossen / unterstützt werden.
Guy Coder
3
Siehe Class vs. Component vs. Control. Hinweis: Ich antworte nicht, da in Ihrer Frage weder die Sprache noch die Architektur erwähnt wird.
Guy Coder
Ja, in diesem Fall denke ich an die Definitionen im Allgemeinen
Mirco
2
Ich bin nicht nach Punkten, mehr nachdem ich sichergestellt habe, dass Sie eine gültige Antwort erhalten. Wenn Sie dies für gültig halten, können Sie Ihre Frage bearbeiten und den Link als die von Ihnen bevorzugte Antwort hinzufügen. Ich werde es nicht als Antwort posten, da die Frage zu allgemein ist und eine bestimmte Antwort andere in Schwierigkeiten bringen kann.
Guy Coder
Ja, ich denke meine Frage ist sehr allgemein und die Antwort hängt wirklich von der verwendeten Sprache oder Umgebung ab. Nerver glaubte, dass es für diese Begriffe so viele unterschiedliche Definitionen gibt
Mirco

Antworten:

12

Die Begriffe sind ähnlich. Ich stelle mir ein "Modul" im Allgemeinen größer als eine "Komponente" vor. Eine Komponente ist ein einzelnes Teil, normalerweise von relativ geringem Umfang, möglicherweise für allgemeine Zwecke. Beispiele hierfür sind Steuerelemente der Benutzeroberfläche und "Hintergrundkomponenten" wie Zeitgeber, Einfädelungsassistenten usw. Ein "Modul" ist ein größeres Teil des Ganzen, normalerweise etwas, das eine komplexe primäre Funktion ausführt, ohne von außen gestört zu werden. Dies kann die Klassenbibliothek einer Anwendung sein, die die Integration mit E-Mail oder der Datenbank ermöglicht. Es kann so groß sein wie eine einzelne Anwendung einer Suite, z. B. das "Debitorenmodul" einer ERP- / Buchhaltungsplattform.

Ich denke auch, dass "Module" austauschbarer sind. Komponenten können repliziert werden, wobei neue wie alte aussehen, aber in gewisser Weise "besser" sind. In der Regel hängt das Design des Systems jedoch stärker von einer Komponente ab (oder von einem Ersatz, der dem spezifischen Verhalten dieser Komponente entspricht). In Nicht-Computer-Begriffen kann eine "Komponente" der Motorblock eines Autos sein; Sie können innerhalb des Motors basteln oder ihn sogar komplett ersetzen, aber das Auto muss einen Motor haben und sehr strengen Spezifikationen wie Abmessungen, Gewicht, Montagepunkten usw. entsprechen, um den "serienmäßigen" Motor des Autos zu ersetzen wurde ursprünglich entworfen, um zu haben. Ein "Modul" impliziert andererseits eine "Plug-in" -Funktionalität; was auch immer das Modul ist, Es kann so leicht kommuniziert werden, dass das Modul mit minimaler Auswirkung auf andere Teile des Systems entfernt und / oder ausgetauscht werden kann. Das elektrische System eines Hauses ist sehr modular aufgebaut. Sie können alles mit einem 120V15A-Stecker in jede 120V15A-Buchse stecken und erwarten, dass das, was Sie anschließen, funktioniert. Die Hausverkabelung kümmert sich nicht weniger darum, was wo eingesteckt ist, vorausgesetzt, der Strombedarf in einem einzelnen Zweig des Systems überschreitet nicht die Sicherheitsgrenzen.

KeithS
quelle
4
Alle Antworten haben mir sehr geholfen, aber ich kann nur eine annehmen. Also akzeptiere ich KeithS, weil er die niedrigste Wiederholung hat
Mirco
12

Die generische Bedeutung von Modul ist eine Gruppe von wiederverwendbarem Code, der nicht an ein bestimmtes Programm gebunden ist. Dies kann alles sein, von einer ganzen Reihe von GUI-Bibliotheken bis hin zu einer einzelnen Klasse.

Die generische Bedeutung von Komponente ist ein Modul mit der zusätzlichen Einschränkung der Substituierbarkeit über eine bestimmte Schnittstelle. Wenn Sie eine GUI-Widget-Komponente erstellen, kann sie überall dort verwendet werden, wo ein Widget erwartet wird, ohne dass der aufrufende Code geändert werden muss. Module unterliegen im Allgemeinen keiner solchen Einschränkung. Qt und GTK + sind Module, aber ich kann nicht eines für das andere tauschen, ohne viel Arbeit im Code zu haben, der es aufruft, deshalb sind sie keine Komponenten.

Viele Frameworks oder Programmiersprachen verwenden die Begriffe, um etwas viel Spezifischeres zu bedeuten, weshalb die Leute nach dem Kontext fragen. Etwas mag eine Komponente im allgemeinen Sinne sein, aber wenn es keine sehr spezifische IComponentSchnittstelle implementiert, wird es im Kontext möglicherweise nicht als Komponente betrachtet. Hat in Python moduledie sehr spezifische technische Bedeutung von etwas, das Sie mit einem importBefehl erhalten können. Normalerweise beziehen sich Menschen auf diese kontextspezifischen Bedeutungen.

Karl Bielefeldt
quelle
Ihre Definition ist in Ordnung, aber Ihr Beispiel (Qt vs. GTK +) ist fehlerhaft (obwohl ich damit einverstanden bin, dass ich keine von ihnen auch eine Komponente nennen würde). IMHO Qt und GTK + enthalten Hunderte kleiner Komponenten, was zu einer sehr breiten Sammlung von Schnittstellen führt. Das macht es sehr unwahrscheinlich, dass jemand jemals die Zeit investieren wird, um einen schnittstellenkompatiblen Ersatz für einen von ihnen zu schaffen, und das ist meiner Meinung nach der Grund, warum sie keine Komponenten sind. Nur weil zwei Softwareteile nicht ausgetauscht werden können, werden sie jedoch nicht als Komponenten disqualifiziert, sondern nur als Komponenten mit einer gemeinsamen Schnittstelle.
Doc Brown
8

Wenn wir von bestimmten Sprachen, Frameworks und deren eigenen Interpretationen abstrahieren wollen, lautet die abstrakte Software-Granularitätshierarchie wie folgt:

Product - application, library, service
  Module - GUI, core logic, data, etc...
    Component - purpose specific collection of objects
      Object - collection of primitives
        Primitive - numbers, functions, etc...
  • Produkt

Einfach und übersichtlich ist das Produkt eine funktionierende Sammlung verbundener Funktionsmodule.

  • Modul

Wie der Name schon sagt, ist die Motivation eines Moduls Modularität. Entgegen vieler Behauptungen impliziert dies nicht wirklich die Wiederverwendung von Code. Es gibt viele Module, die nicht wirklich wiederverwendbar sind und zu nichts passen, wofür sie nicht entwickelt wurden.

Es ist wichtig, verschiedene Softwareschichten zu trennen, um die Implementierung und Wartung von Software zu vereinfachen. Sollte eine Neuimplementierung eines Frontends in einem anderen GUI-Framework erforderlich sein, kann dies durch Modularität auf einfache und sichere Weise und ohne Unterbrechungen geschehen Code überall.

Ein Modul kapselt eine Sammlung von Komponenten, die alle einem in den Modulanforderungen definierten gemeinsamen Zweck dienen. Ein Modul sollte in sich abgeschlossen und vollständig sein und zwar nicht wirklich für sich allein verwendbar, es sollte jedoch in der Lage sein, mit jeder konformen Implementierung zusammenzuarbeiten.

  • Komponente

In Bezug auf die Granularität befindet sich die Komponente zwischen dem Modul und dem Objekt. Der Zweck einer Komponente besteht darin, eine Sammlung von Allzweckobjekten zu einer zweckspezifischen Einheit zusammenzufassen.

Wie der Name schon sagt, ist die Komponente im Gegensatz zum Modul nicht "in sich geschlossen", sondern Teil eines größeren funktionalen Ganzen.

  • Objekt

Objekte sind die kleineren Bausteine ​​von Bauteilen. Objekte sind Sammlungen von Primitiven und verbinden sie, um einer niedrigeren Ebene zu dienen, die universeller ist und dennoch einen bestimmten Zweck hat.

  • Primitive

Primitive sind die kleinste, einfachste und niedrigste Stufe der Softwareentwicklungsgranularität. Grundsätzlich handelt es sich nur um ganzzahlige und reelle Zahlen und Funktionen / Operatoren, obwohl die meisten Sprachen ihre eigenen zusätzlichen "erstklassigen Bürger" haben.

Mit Primitiven kann man sehr wenig anfangen, und gleichzeitig ist es auf einem so niedrigen Niveau, dass man praktisch alles damit erreichen kann. Es ist nur sehr, sehr wortreich, wahnsinnig kompliziert und unglaublich langwierig, wenn man direkt mit Primitiven arbeitet.

  • Was hat das alles zu bedeuten?

Wie oben bereits erwähnt, ist das direkte Arbeiten mit Primitiven eine äußerst schlechte Idee. Nicht nur, weil es für die heutige Softwareentwicklung unglaublich komplex, langsam und mühsam ist, sondern auch extrem aufdringlich und hinderlich für Tests und Wartung.

Wenn alle diese konzeptionellen Teile in die Softwareentwicklung einbezogen werden, wird dies einfacher, schneller, einfacher und sicherer. Man macht kein Haus aus Atomen, egal wie vielseitig und universell Atome sind. Das wäre eine sinnlose Übung. Ihre Atome sind Ihre Primitiven, Ton ist Ihr Objekt, Ziegel sind Ihre Komponenten, Wände, Boden und Dach sind Ihre Module, zusammengesetzt manifestieren sie das Endprodukt.

Menschen erfinden eigentlich nichts, wir entdecken nur Dinge, die es bereits im Universum gibt, und kopieren sie dann und wenden sie auf unser Leben an. Dieselbe Granularitätshierarchie ist dem Universum selbst eigen, von Atomen und sogar darunter bis hin zu organischen Molekülen, Proteinen, Geweben, Organen, Organismen und darüber. Die Realität selbst folgt demselben Prinzip - sie kombiniert kleine, einfache, funktionsbeschränkte und zweckbezogene abstrakte Dinge größere, komplexere, funktionalere Dinge und spezifischere Dinge.

  • Terminologie-Vorbehalte

Technisch sind sie alle "Objekte", sie sind alle "Komponenten" der Softwareentwicklung, sie sind alle "modular" genug, um zusammenpassen zu können, sie sind alle "Produkte" in dem Sinne, wie sie produziert wurden und so weiter. ..

Hier geht es nicht um Terminologie oder Nomenklatur, sondern darum, wie sich das Vergrößern und Verkleinern auf verschiedene Aspekte von Kreativität und Produktivität auswirkt. Und darüber, wie wichtig es ist, nicht nur all diese verschiedenen Ebenen zu nutzen, sondern auch nicht zu versuchen, ein Ziel auf der falschen Ebene zu erreichen, was nur kontraproduktiv sein kann.

dtech
quelle
1
Ihre Version des Moduls klingt wie ein Paket.
JM Becker
1
@JMBecker Eigentlich kann ein Paket in Bezug auf die Granularität aus einer Sammlung von Objekten bis hin zu einem eigenständigen Produkt bestehen. Das Verpacken ist für die Wiederverwendung von Code eher eine Annehmlichkeit als ein Glied in der Granularitätskette.
Dtech
3

Das hängt von Ihrem Kontext ab. Das Modul wird bereits verwendet, um in einigen Sprachen auf DLL-Ebenengruppen zu verweisen, in anderen auf 'package' oder 'assembly'. Die Komponente wird sowohl für COM-Aufgaben als auch für Entity Based Component-Aufgaben verwendet, die in der Spieleentwicklung üblich sind.

Allgemein ausgedrückt, beziehen sich Modul und Komponente in der Regel auf ein Codebündel, das sich hinter einer genau definierten Schnittstelle befindet. Im Allgemeinen bezieht sich das Modul auf größere Bündel. Oft gibt es eine Reihe von Schnittstellen und das Modul ist in der Regel in der Lage, eigenständig zu sein.

Komponenten hingegen sind in der Regel kleinere Codebündel, oftmals kleiner als eine vollständige Klasse. Mit ihrem Namen neigen sie dazu, Bestandteil von etwas Größerem zu sein. Manchmal ist das die Anwendung selbst, aber mit der zunehmenden Verwendung von Komposition im Klassendesign bedeutet dies häufiger eine Komponente eines größeren Objekts. Die gut definierten Schnittstellen für Komponenten ermöglichen es der App auch, Komponenten gegeneinander auszutauschen. Module neigen dazu, diese Austauschbarkeit nicht zu haben.

Telastyn
quelle