web-dev-qa-db-ja.com

コードをモジュール化する方法は?

私はいくつかのJavaプログラムを持っています。モジュール化されているかどうかを調べたいと思います。モジュール化されている場合、それがどの程度までであるかということです。特定のコードがこの程度までモジュール化されているとどのように判断しますか?コードをよりモジュール化する方法を知りたいですか?

24
user175498

モジュール性のためのいくつかのベンチマーク:

  1. 特定のタスクを実行するために同様のコードを書き直すは何回ですか?
  2. プログラムの一部で何かを変更した場合に備えて、コードをリファクタリングする必要があるコードの量は?
  3. ファイルは小さくて簡単でナビゲートできますか?
  4. アプリケーションモジュール は、必要に応じて適切かつ独立して機能していますか?
  5. あなたのコードはどのようにより悲惨なですか?関数または変数を1つだけ削除すると、すべての大失敗は失われますか? クラスの名前を変更すると20奇数のエラーが発生しますか?(インスタンスの場合、スタックメカニズムを実装してすべてのトレースを保持できます)アプリケーションのホップ)
  6. コードは自然言語の使用法にどの程度近いか(つまり、モジュールとそのサブコンポーネントは、ネットソースファイルのサイズにあまり関係なく、より現実的なオブジェクトを表します)。

その他のアイデアについては これをチェックしてくださいソフトウェアの品質 についてはこちら

コードをよりモジュール化することへの懸念については、最初に上記の質問に答え、具体的な回答を得てから this を確認してください。

基本的な考え方は、アプリケーションをできるだけ多くの簡単なコードフラグメントに分割し、理解しやすくアクセスしやすい多数のディレクトリレイアウトに整然と配置することです。

アプリケーションの各メソッドは、必要な処理の最小量を超えてはなりません。これらのメソッドをより多くのマクロレベルのメソッドに組み合わせると、アプリケーションに戻るはずです。

39
OrangeRind

要点は

  • 関心事の分離
  • 凝集
  • カプセル化(インターフェースを介して通信)
  • 代替可能性
  • 再利用性

このようなモジュールシステムの良い例は、ディスクブレーキやカーステレオなどの標準的な自動車部品です。自動車を製造するときに、最初からカーステレオを製造する必要はありません。また、購入してプラグインすることをお勧めします。また、ブレーキシステムがカーステレオに影響を与えたり、さらに悪いと、カーステレオがブレーキシステムに影響を与えたりすることも望まないでしょう。

「特定のコードがこの程度までモジュール化されているとどうやって判断するのか」という質問に答えるために、モジュール化をテストする質問を作成できます。 アプリケーションの他の部分に影響を与えることなく、簡単にモジュールを別のものに置き換えることができますか?

XMLパーサーも別の例です。 DOMインターフェースを取得したら、その下で使用されているXMLパーサーの実装(Apache XercesやJAXPなど)は実際には気にしません。

Javaでは、別の質問があるかもしれません:interfacesを介してすべての機能にアクセスできますか?インターフェイスは、低結合をほとんど処理します。

また、システムの各モジュールを1つの文で説明できますか?たとえば、カーステレオが音楽やラジオを再生します。ディスクブレーキは安全に車両を減速させます。


(これが私が書いたものです コンポーネント駆動開発とは何ですか?

ウィキペディアによると、コンポーネントベースの開発は コンポーネントベースのソフトウェアエンジニアリング(CBSE) のエイリアスです。

[それ]は、ソフトウェアエンジニアリングの分野であり、その優先順位は、特定のソフトウェアシステム全体で利用可能な幅広い機能に関する関心の分離です。

これはややあいまいなので、詳細を見てみましょう。

個々のコンポーネントは、関連する機能(またはデータ)のセットをカプセル化するソフトウェアパッケージまたはモジュールです。

すべてのシステムプロセスは個別のコンポーネントに配置されるため、各コンポーネント内のすべてのデータと機能は意味的に関連しています(クラスのコンテンツと同様)。この原理のため、コンポーネントはmodularおよびcohesiveであるとよく言われます。

したがって、この定義によれば、コンポーネントは、1つのことを本当に上手く行い、1つだけを実行する限り、何でもかまいません。

システム全体の調整に関して、コンポーネントはインターフェースを介して相互に通信します。 [...]この原理により、encapsulatedと呼ばれるコンポーネントが生成されます。

したがって、これは、私たちが良いAPIと考えるものにますます響きます。SOAは、次のようになります。

提供インターフェースはLollipopで表され、必須インターフェースはコンポーネントの外側のエッジに接続されたオープンソケットシンボルで表されますUMLで。

alt text

コンポーネントのもう1つの重要な属性は、コンポーネントが置換可能であるため、最初のコンポーネントの要件(インターフェースを介して表現される)は、後続コンポーネントによって満たされます。

再利用性は、高品質のソフトウェアコンポーネントの重要な特性です。ソフトウェアコンポーネントは、多くの異なるプログラムで再利用できるように設計および実装する必要があります。

コンポーネントをコンポーネントにするのは、代替性と再利用性です。これとオブジェクト指向プログラミングの違いは何ですか?

オブジェクト指向プログラミング(OOP)の考え方は、ソフトウェアは、それが表す実際のまたは想像上のオブジェクトのメンタルモデルに従って記述されるべきであるということです。 [...]

対照的に、コンポーネントベースのソフトウェアエンジニアリングは、そのような仮定を行わず、代わりに、電子工学または機械学の分野と同様に、プレハブコンポーネントを互いに接着してソフトウェアを開発する必要があると述べています。

25
Eugene Yokota

作成方法の特定の質問に答えるために、コードをよりモジュール化するには、いくつかのアプローチがあります。

  • モジュール化に最適なツールの1つは、コードの再利用を見つけることです。コードが複数回同じ場所でまったく同じ(または非常によく似た)動作をすることがわかった場合は、モジュール化することをお勧めします。

  • 他のロジックがそれらがどのように構築されるかを知る必要なくそれらを使用するという意味で、どのロジックの部分を独立させることができるかを決定します。これは、OO設計で行うことと多少似ていますが、モジュール/コンポーネントは必ずしもOOのようにモデル化されたオブジェクトに対応する必要はありません。

3
DVK

Hej、

こちらの「ソフトウェアをカプセル化する方法(パート1)」を参照してください。

http://www.edmundkirwan.com/encap/overview/paper7.html

よろしく、

エド。

2
Ed Kirwan

これは 'osgi'でタグ付けされているので、OSGi関連の視点を投入できます。

簡単に言えば、完全なスパゲッティコードから小さなステップでモジュール化することが可能です。ビッグバンである必要はありません。たとえば、スパゲッティコードでさえ、ある種のボロネーズロギングライブラリに依存しているため、ある意味では、それはすでにモジュール化されており、One Very Big Metball(申し訳ありませんが、モジュール)が含まれています。

トリックは、大きなミートボールを1つの小さなチャンクに分割し、次に少し大きなミートボールを分割してから再帰することです。すべてを一度に実行する必要はありません。削除するものがなくなるまで、毎回少しずつチップを削ってください。

OSGiに関しては、uber-jarをバンドルに入れることがまだ可能です。実際、ビットを変更せずにこれを行うことができます。 Manifest.MFを適切に変更するか、別のJARでラップしてマニフェストでBundle-ClassPath:metaball.jarを指定します。

それができない場合、BNDのようなツールは、必要な適切なデータを生成するのに役立ち、OSGiランタイムに簡単にドロップできます。しかし、過度に結合されたコードや、クラスローダーに干渉するものに注意してください-それらはあなたをつまずきます。

1
AlBlue

私があなたの質問を理解していると仮定すると、コードモジュールが明らかに機能するためには、相互間の依存関係が明らかに必要であるため、コードをモジュール化するものを知りたいと考えています。これが私の答えです。

システムをモジュールに分解でき、それらのモジュールを個別にテストできる場合、それはシステムがモジュール式であることを示しています。

0
Christian

あなたが言うように、モジュール性はバイナリのものではないので、それはあなたの相対的な定義に依存します。

私は言うでしょう:その機能を実行する必要がある任意のプログラムで特定のメソッドを使用できますか?それが内部で何をしていたかを知る必要のない「ブラックボックス」ですか?答えが「いいえ」の場合、つまり、メソッドがそのプログラムでのみ適切に機能する場合、真にモジュール化されていません。

0
Smalltown2k

モジュール性は、誰がコードを開発しているかに関係しています。ただし、モジュラーコードは、元のコードのほとんどを変更せずに簡単に交換できる部分があるコードであるというのが一般的なコンセンサスだと思います。

私見、3つのモジュールA BおよびCがあり、モジュールCを完全に変更または交換したい場合、それを行うのが簡単なタスクであれば、モジュラーコードがあります。

0
Peter D

[〜#〜] cap [〜#〜] などのコード分析ツールを使用して、タイプとパッケージ間の依存関係を分析できます。これらは、モジュール式コードを開発しようとするときにしばしば問題となる循環依存関係を見つけて削除するのに役立ちます。循環依存関係がない場合は、コードを個別のjarに分離することができます。

一般に、可能な場合はインターフェイスにコーディングすることをお勧めします。これは、一般に、コードをより簡単にリファクタリングしたり、異なるコンテキストで使用したりできることを意味します。

Spring などの依存性注入フレームワークも、設計のモジュール化に役立ちます。タイプは、いくつかの外部構成プロセスによって依存関係とともに注入されるため、実装への直接の依存関係は必要ありません。

0
Rich Seller

package-by-feature のアイデアは、コードをよりモジュール化するのに役立ちます。

Webで見られる多くの例では、最初にアプリケーションを機能ではなくレイヤーに分割しています

  • モデル
  • データアクセス
  • ユーザーインターフェース

ただし、機能ではなく、機能と整合するトップレベルのパッケージを使用してアプリケーションを分割する方が良いようです。

以下は、機能別パッケージを使用するWebアプリの です。アプリケーションの実際の機能のリストとして読み取られる最上位パッケージの名前に注意してください。また、各パッケージに機能に関連するすべてのアイテムが含まれていることに注意してください-アイテムは場所全体に広がっていません。ほとんどの場合、それらはすべて単一のパッケージ/ディレクトリにあります。

通常、このようなアプリの機能の削除は、単一の操作で実行できます-単一のディレクトリの削除。

0
John O