モジュールとコンポーネントという用語に少し問題があります。私の考えでは、モジュールはバンドルされたクラスであり、明確に定義されたインターフェースを介してのみアクセス可能です。それらはすべての実装の詳細を隠し、再利用可能です。モジュールは、依存するモジュールを定義します。
コンポーネントとの違いは何ですか?いくつかの本で調べましたが、コンポーネントの説明は非常に似ています。
モジュールとコンポーネントという用語に少し問題があります。私の考えでは、モジュールはバンドルされたクラスであり、明確に定義されたインターフェースを介してのみアクセス可能です。それらはすべての実装の詳細を隠し、再利用可能です。モジュールは、依存するモジュールを定義します。
コンポーネントとの違いは何ですか?いくつかの本で調べましたが、コンポーネントの説明は非常に似ています。
回答:
用語は似ています。私は通常、「モジュール」は「コンポーネント」よりも大きいと考えています。コンポーネントは単一の部品であり、通常はスコープが比較的小さく、おそらく汎用です。例には、UIコントロール、タイマー、スレッドアシスタントなどの「バックグラウンドコンポーネント」が含まれます。「モジュール」は全体の大きな部分であり、通常は外部の干渉なしに複雑な主要機能を実行します。電子メールまたはデータベースとの統合を提供するアプリケーションのクラスライブラリである可能性があります。ERP /会計プラットフォームの「売掛金モジュール」など、スイートの単一アプリケーションと同じくらい大きい場合があります。
また、「モジュール」はより互換性があると考えています。コンポーネントは複製することができ、新しいコンポーネントは古いコンポーネントのように見えますが、何らかの方法で「より良い」ものになりますが、通常、システムの設計はコンポーネント(またはそのコンポーネントの特定の動作に適合するように設計された置換)により厳密に依存します。非コンピューター用語では、「コンポーネント」は自動車のエンジンブロックである場合があります。エンジン内をいじくり回すこともできますが、完全に交換することもできますが、車にはエンジンが必要であり、車が「ストック」エンジンを交換するために、寸法、重量、取り付け点などの非常に厳しい仕様に適合している必要がありますもともと持っているように設計されました。一方、「モジュール」は「プラグイン」タイプの機能を意味します。そのモジュールが何であれ、システムの他の部分への影響を最小限に抑えながら、モジュールを取り外したり交換したりできる軽量な方法で通信できます。家の電気システムは高度にモジュール化されています。120V15Aのプラグを使用して、120V15Aのレセプタクルに何でもプラグインでき、プラグインしているものが機能することを期待できます。システムの単一のブランチの電力需要が安全な制限を超えない限り、家の配線はどこに差し込まれているかを気にすることはできません。
モジュールの一般的な意味は、特定のプログラムに関連付けられていない、再利用可能なコードのグループです。これは、GUIライブラリのセット全体から単一のクラスに至るまですべてです。
コンポーネントの一般的な意味は、特定のインターフェースを使用した代替可能性の追加制限があるモジュールです。GUIウィジェットコンポーネントを作成する場合、呼び出しコードで特別なことをすることなく、ウィジェットが予想される任意の場所で使用できます。一般に、モジュールにはそのような制限はありません。QtとGTK +はモジュールですが、それを呼び出すコードでかなりの作業がなければ、一方を他方に交換することはできません。したがって、これらはコンポーネントではありません。
多くのフレームワークまたはプログラミング言語では、用語を使用してより具体的なものを意味します。そのため、人々はコンテキストについて尋ねています。何かは一般的な意味でのコンポーネントかもしれませんが、非常に特定のIComponent
インターフェイスを実装していない場合、コンテキストのコンポーネントとは見なされません。Pythonではmodule
、import
コマンドを使用して取得できる何かの非常に具体的な技術的意味を持ちます。通常、人々はこれらのコンテキスト固有の意味に言及しています。
特定の言語、フレームワーク、および独自の解釈から抽象化する場合、抽象ソフトウェア粒度階層は次のとおりです。
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フレームワークに再実装する必要がある場合、モジュール性により、破損することなく、簡単かつ安全に行うことができますいたるところにコーディングします。
モジュールは、すべてがモジュール要件で定義されている共通の目的を果たすコンポーネントのコレクションをカプセル化します。モジュールは自己完結型であり、完全である必要があり、実際には単独では使用できませんが、準拠する実装と連携して機能する必要があります。
粒度に関しては、コンポーネントはモジュールとオブジェクトの間に位置します。コンポーネントの目的は、汎用オブジェクトのコレクションをまとめて、目的固有のユニットを形成することです。
名前が示すように、モジュールとは異なり、コンポーネントは「自己完結型」ではなく、より大きな機能全体の一部です。
オブジェクトは、コンポーネントの小さなビルディングブロックです。オブジェクトはプリミティブのコレクションであり、それらを結合して低レベル、より普遍的でありながら特定の目的を果たします。
プリミティブは、ソフトウェア開発の最小単位であり、最も単純で最も低いレベルです。ほとんどの言語には独自の「ファーストクラス市民」が追加されていますが、基本的には整数と実数、および関数/演算子です。
プリミティブでできることはほとんどありませんが、同時に、それが非常に低いレベルにあるため、実質的にすべてを達成できます。プリミティブを直接操作しながら達成するのは、非常に冗長で、非常に複雑で、信じられないほど退屈です。
すでに上で述べたように、プリミティブを直接操作することは非常に悪い考えです。現代のソフトウェア開発を行うのは、信じられないほど複雑で、時間がかかり、退屈であるだけでなく、テストとメンテナンスにとって非常に邪魔で邪魔です。
これらすべての概念部分をソフトウェア開発に組み込むことで、より簡単、高速、簡単、安全になります。原子がどのように汎用的で普遍的であるかに関係なく、原子で家を建てることはありません。それは無益さの練習になるでしょう。原子はプリミティブ、粘土はオブジェクト、レンガはコンポーネント、壁、床、屋根はモジュールであり、組み立てられて最終製品となります。
人間は実際には何も発明していません。宇宙にすでにあるものを発見し、それをコピーして私たちの生活に適用するだけです。同じ粒度階層は、原子自体から、さらには有機分子、タンパク質、組織、器官、生物、さらには宇宙まで、宇宙そのものに固有のものであり、現実そのものは同じ原理に従います-小さく、シンプルで、機能が制限され、目的の抽象的なものをより大きく、より複雑で、より機能的なものと、より目的に特化したもの。
技術的にはすべて「オブジェクト」であり、すべてソフトウェア開発の「コンポーネント」であり、すべてが結合できるほど十分に「モジュール式」であり、生産されたという意味ではすべて「製品」です。 ..
これは用語や命名法に関するものではなく、物事の拡大と縮小が創造性と生産性のさまざまな側面にどのように影響するかということです。そして、それらすべての異なるレベルを使用することの重要性だけでなく、間違ったレベルで目標を達成しようとしないことの重要性もあります。
それはあなたのコンテキストに依存します。モジュールは、一部の言語でDLLレベルグループを参照するために既に使用されており、他の言語では「パッケージ」または「アセンブリ」に似ています。コンポーネントは、ゲーム開発で一般的なエンティティベースのコンポーネントと同様に、COMに使用されます。
一般的なアーキテクチャ用語では、モジュールとコンポーネントはどちらも、明確に定義されたインターフェースの背後にあるコードのバンドルを指す傾向があります。一般的に、モジュールはより大きなバンドルを参照する傾向があります。多くの場合、一連のインターフェイスがあり、モジュールは単独で動作する傾向があります。
一方、コンポーネントはコードの小さなバンドルになる傾向があり、多くの場合完全なクラスよりも小さくなります。それらの名前では、それらはより大きな何かのコンポーネントである傾向があります。それ自体がアプリケーション自体である場合もありますが、クラス設計での構成の使用が増えるにつれて、より大きなオブジェクトのコンポーネントを意味することが多くなります。コンポーネントの明確に定義されたインターフェイスは、アプリがコンポーネントを相互に交換できるようにする傾向もあります。モジュールにはそのような交換可能性がない傾向があります。