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


31

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

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


5
どの言語?どのアーキテクチャですか?モジュールの定義は機能します。コンポーネントは、GUIのようなものにプラグインするものと考えますが、モジュールはGUIにプラグインできません。GUIコンストラクトでラップ/サポートされている場合、モジュールはGUIで動作できます。
ガイコーダー

3
クラス対コンポーネント対コントロールを参照してください注:あなたの質問は言語やアーキテクチャに言及していないので、私は答えていません。
ガイコーダー

はい、この場合、私は一般的な定義について考えます
ミルコ

2
私はポイントを求めているのではなく、あなたが有効な答えを得ることを確認した後です。これが有効な場合は、質問を自由に編集して、お好みの回答としてリンクを追加してください。質問が一般的すぎて、特定の回答が他の人を困らせる可能性があるため、回答として投稿しません。
ガイコーダー

ええ、私の質問は非常に一般的で、答えは実際に使用されている言語や環境に依存していると思います。ナーバーは、これらの用語には非常に異なる定義があると考えていました
ミルコ

回答:


12

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

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


4
すべての答えは本当に助けになりましたが、私は1つしか受け入れることができません。彼が最も低い担当者であるため、私はKeithSを受け入れます
ミルコ

12

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

コンポーネントの一般的な意味は、特定のインターフェースを使用した代替可能性の追加制限があるモジュールです。GUIウィジェットコンポーネントを作成する場合、呼び出しコードで特別なことをすることなく、ウィジェットが予想される任意の場所で使用できます。一般に、モジュールにはそのような制限はありません。QtとGTK +はモジュールですが、それを呼び出すコードでかなりの作業がなければ、一方を他方に交換することはできません。したがって、これらはコンポーネントではありません。

多くのフレームワークまたはプログラミング言語では、用語を使用してより具体的なものを意味します。そのため、人々はコンテキストについて尋ねています。何かは一般的な意味でのコンポーネントかもしれませんが、非常に特定のIComponentインターフェイスを実装していない場合、コンテキストのコンポーネントとは見なされません。Pythonではmoduleimportコマンドを使用して取得できる何かの非常に具体的な技術的意味を持ちます。通常、人々はこれらのコンテキスト固有の意味に言及しています。


あなたの定義は問題ありませんが、あなたの例(Qt対GTK +)には欠陥があります(私はそれらのどれもコンポーネントとも呼ばないことに同意します)。IMHO QtおよびGTK +には、数百の小さなコンポーネントが含まれているため、非常に幅広いインターフェイスのコレクションができます。それは、誰かがこれまでにそれらのいずれかのインタフェース互換性の代替を作成するための時間を投資すること、それは非常に低いなり、それは、彼らが何のコンポーネントではない理由私見です。ただし、2つのソフトウェアを交換できないからといって、それらをコンポーネントとして失格にせず、共通のインターフェースを持つコンポーネントとしてのみ失格にします。
ドックブラウン

9

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

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フレームワークに再実装する必要がある場合、モジュール性により、破損することなく、簡単かつ安全に行うことができますいたるところにコーディングします。

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

  • 成分

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

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

  • 対象

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

  • 原始的

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

プリミティブでできることはほとんどありませんが、同時に、それが非常に低いレベルにあるため、実質的にすべてを達成できます。プリミティブを直接操作しながら達成するのは、非常に冗長で、非常に複雑で、信じられないほど退屈です。

  • このすべてのポイントは何ですか?

すでに上で述べたように、プリミティブを直接操作することは非常に悪い考えです。現代のソフトウェア開発を行うのは、信じられないほど複雑で、時間がかかり、退屈であるだけでなく、テストとメンテナンスにとって非常に邪魔で邪魔です。

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

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

  • 用語に関する注意事項

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

これは用語や命名法に関するものではなく、物事の拡大と縮小が創造性と生産性のさまざまな側面にどのように影響するかということです。そして、それらすべての異なるレベルを使用することの重要性だけでなく、間違ったレベルで目標を達成しようとしないことの重要性もあります。


1
モジュールのバージョンはパッケージのように聞こえます。
JMベッカー

1
@JMBeckerはそうではありません。粒度に関しては、パッケージはオブジェクトのコレクションから完全なスタンドアロン製品まで何でも構成できます。パッケージ化は、粒度チェーンのリンクよりもコードの再利用にとって便利なものです。
dtech

3

それはあなたのコンテキストに依存します。モジュールは、一部の言語でDLLレベルグループを参照するために既に使用されており、他の言語では「パッケージ」または「アセンブリ」に似ています。コンポーネントは、ゲーム開発で一般的なエンティティベースのコンポーネントと同様に、COMに使用されます。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.