web-dev-qa-db-ja.com

コンポーネントとモジュールの間に違いはありますか

モジュールとコンポーネントという用語に少し問題があります。私の考えでは、モジュールはバンドルされたクラスであり、明確に定義されたインターフェースを介してのみアクセス可能です。それらはすべての実装の詳細を隠し、再利用可能です。モジュールは、依存するモジュールを定義します。

コンポーネントの違いは何ですか?いくつかの本で調べましたが、コンポーネントの説明は非常に似ています。

32
Mirco

用語は似ています。私は一般的に「モジュール」は「コンポーネント」よりも大きいと考えています。コンポーネントは単一のパーツであり、通常はスコープが比較的小さく、おそらく汎用です。例としては、UIコントロール、タイマー、スレッドアシスタントなどの「バックグラウンドコンポーネント」などがあります。「モジュール」は全体の大きな部分であり、通常、外部の干渉なしに複雑な主要機能を実行するものです。これは、電子メールまたはデータベースとの統合を提供するアプリケーションのクラスライブラリである可能性があります。 ERP /会計プラットフォームの「売掛金モジュール」など、スイートの単一のアプリケーションと同じ大きさになる場合があります。

また、「モジュール」はより互換性があると考えています。コンポーネントは複製することができ、新しいコンポーネントは古いコンポーネントのように見えますが、何らかの点で「優れています」が、通常、システムの設計はコンポーネントに厳密に依存します(またはそのコンポーネントの非常に特定の動作に準拠するように設計された交換)。コンピュータ以外の用語では、「コンポーネント」は自動車のエンジンブロックである場合があります。エンジン内でいじくり回すこともできますが、完全に交換することもできますが、車にはエンジンが必要です。また、車に搭載されている「純正」のエンジンを交換するには、寸法、重量、取り付け位置などの非常に厳しい仕様に準拠している必要があります。もともと持っているように設計されました。一方、「モジュール」は「プラグイン」タイプの機能を意味します。そのモジュールが何であれ、システムの他の部分への影響を最小限に抑えてモジュールを取り外したり交換したりできるように、軽量な方法で通信できます。家の電気システムは非常にモジュール化されています。 120V15Aプラグのあるものは、120V15Aレセプタクルに何でも接続でき、接続しているものが機能することを期待できます。システムの単一のブランチでの電力需要が安全な制限を超えない限り、家の配線はどこに何が接続されているかを気にすることができませんでした。

13
KeithS

moduleの一般的な意味は、再利用可能なコードのグループであり、1つの特定のプログラムに関連付けられていません。これは、GUIライブラリのセット全体から単一のクラスに至るまで、すべての場合があります。

componentの一般的な意味は、特定のインターフェースを使用する代替性の追加の制限を持つモジュールです。 GUIウィジェットコンポーネントを作成すると、呼び出しコードで特別なことを行う必要なく、ウィジェットが必要な場所であればどこでも使用できます。モジュールには一般にそのような制限はありません。 QtとGTK +はモジュールですが、それを呼び出すコードでかなりの作業を行わないと、一方を他方と交換することができないため、コンポーネントではありません。

多くのフレームワークやプログラミング言語では、この用語をより具体的な意味で使用しているため、人々はコンテキストについて質問しています。一般的な意味で何かがコンポーネントである可能性がありますが、非常に具体的なIComponentインターフェースを実装していない場合、コンテキスト内のコンポーネントとは見なされない可能性があります。 Pythonでは、moduleは、importコマンドを使用して取得できる何かの非常に具体的な技術的意味を持っています。通常、人々はこれらのコンテキスト固有の意味を参照しています。

12
Karl Bielefeldt

特定の言語、フレームワーク、およびそれらの独自の解釈から抽象化する場合、抽象ソフトウェア粒度階層は次のとおりです。

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

単純明快な製品は、接続された機能モジュールの実用的なコレクションです。

  • モジュール

名前そのものが示すように、モジュールの動機はモジュール性です。多くの主張に反して、コードの再利用を意味するものではありません。本当に再利用できないモジュールがたくさんあり、それらが設計されていないものには適合しません。

異なるソフトウェアレイヤーを分離することは重要です。これにより、ソフトウェアの実装と保守がはるかに簡単になり、フロントエンドのようなものを別のGUIフレームワークに再実装する必要がある場合は、モジュール化により、中断することなく、簡単かつ安全な方法でそれを実現できます。いたるところにコードを記述します。

モジュールは、モジュールの要件で定義されている共通の目的をすべて果たすコンポーネントのコレクションをカプセル化します。モジュールは自己完結型で完全である必要があり、それ自体では実際に使用できるわけではありませんが、準拠する実装と連動して機能する必要があります。

  • 成分

粒度に関して、コンポーネントはモジュールとオブジェクトの間に位置します。コンポーネントの目的は、汎用オブジェクトのコレクションをまとめて、目的固有のユニットを形成することです。

名前が示すとおり、モジュールとは異なり、コンポーネントは「自己完結型」ではなく、より大きな機能全体の一部です。

  • オブジェクト

オブジェクトは、コンポーネントの小さなビルディングブロックです。オブジェクトはプリミティブのコレクションであり、それらを結合して、より具体的でありながら、より低いレベルの、より普遍的な機能を果たします。

  • プリミティブ

プリミティブは、ソフトウェア開発の細分性の最小、最も単純、および最も低いレベルです。基本的には整数と実数および関数/演算子ですが、ほとんどの言語には独自の「ファーストクラスシチズン」があります。

プリミティブで実行できることはほとんどなく、同時に、それを使用してほとんどすべてを達成できるほど低いレベルにあります。これは、プリミティブを直接操作しているときに実行するのは非常に、非常に冗長で、めちゃくちゃ複雑で、実行するのが非常に面倒です。

  • このすべての意味は何ですか?

すでに上で述べたように、プリミティブを直接操作することは非常に悪い考えです。現代のソフトウェア開発のために実行するのは非常に複雑で遅く、面倒なだけでなく、テストやメンテナンスにとっても非常に邪魔で邪魔になるからです。

これらの概念的な部分をすべてソフトウェア開発に組み込むことで、より簡単、迅速、簡単、安全になります。汎用性の高い普遍的な原子の種類に関係なく、原子から家を作ることはありません。それは無益さの練習になるでしょう。あなたの原子はあなたのプリミティブであり、粘土はあなたのオブジェクトであり、レンガはあなたのコンポーネントであり、壁、床、屋根はあなたのモジュールであり、一緒に組み立てられ、それらは最終的な製品を現します。

人間は実際には何も発明していません。宇宙にすでに存在するものを発見し、それをコピーして私たちの生活に適用するだけです。同じ粒度の階層は、原子から、さらには有機分子、タンパク質、組織、臓器、生物、さらにはそれ以上に、宇宙自体に固有であり、現実自体は同じ原理に従います-小さく、単純で、機能が制限され、目的の抽象的なものを組み合わせてより大きく、より複雑で、より機能的なもので、より目的固有のもの。

  • 用語の警告

技術的には、それらはすべて「オブジェクト」であり、すべてソフトウェア開発の「コンポーネント」であり、それらはすべて、組み合わせることができるほど十分に「モジュール式」であり、それらは、製造されたという意味ですべて「製品」です。 ..

これは用語や用語ではなく、スケールアップとスケールアウトが創造性と生産性のさまざまな側面にどのように影響するかについてです。そして、これらすべての異なるレベルを使用することの重要性だけでなく、逆効果にすぎない可能性がある誤ったレベルで目標を達成しようとしないことの重要性についても。

9
dtech

状況によって異なります。モジュールは、一部の言語ではDLLレベルグループを参照するためにすでに使用されており、他の言語では「パッケージ」または「アセンブリ」に類似しています。コンポーネントは、COMで使用されます。ゲーム開発。

一般的なアーキテクチャ用語では、モジュールとコンポーネントはどちらも、明確に定義されたインターフェースの背後にあるコードのバンドルを参照する傾向があります。一般に、モジュールはより大きなバンドルを参照する傾向があります。多くの場合、インターフェースのセットがあり、モジュールはそれ自体で独立できる傾向があります。

一方、コンポーネントはコードの小さなバンドルになる傾向があり、多くの場合、完全なクラスよりも小さくなります。彼らの名前からすると、それらはより大きなものの構成要素になる傾向があります。これはアプリケーション自体の場合もありますが、クラス設計でのコンポジションの使用が増えるにつれて、より大きなオブジェクトのコンポーネントを意味することがよくあります。また、コンポーネントの明確に定義されたインターフェースは、アプリがコンポーネントを相互に入れ替えることを可能にする傾向があります。モジュールには、そのような互換性がない傾向があります。

3
Telastyn