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.
design
architecture
Mirco
quelle
quelle
Antworten:
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.
quelle
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
IComponent
Schnittstelle implementiert, wird es im Kontext möglicherweise nicht als Komponente betrachtet. Hat in Pythonmodule
die sehr spezifische technische Bedeutung von etwas, das Sie mit einemimport
Befehl erhalten können. Normalerweise beziehen sich Menschen auf diese kontextspezifischen Bedeutungen.quelle
Wenn wir von bestimmten Sprachen, Frameworks und deren eigenen Interpretationen abstrahieren wollen, lautet die abstrakte Software-Granularitätshierarchie wie folgt:
Einfach und übersichtlich ist das Produkt eine funktionierende Sammlung verbundener Funktionsmodule.
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.
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.
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 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.
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.
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.
quelle
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.
quelle