Java Webアプリケーションの静的レイヤー


2

かなり標準的なWeb/Service/Data Accessのレイヤードデザインを使用して楽しく学ぶための小さなWebサイトを構築しています。

サービス層/データアクセス層のクラスのインスタンスを常に作成しなくて済むように、それらのメソッドをすべて静的にしました。私はローカル変数などを使用して並行性の問題を起こすべきではなく、リソースを共有しないでください(これは現時点では簡単です)。

これまでの唯一のトレードオフは、真のオブジェクト指向のアプローチに従っているわけではありませんが、コードをもっときれいに保つことです。

実行可能なアプローチではない理由はありますか?どのような問題が後に発生する可能性がありますか?必要に応じてサービスクラスとデータレイヤークラスのインスタンスを返すことができる「ファクトリ」クラスを持つ方がよいでしょうか?

3

短所:

  • あなたはに対してテストするモックデータアクセス/ビジネス・ロジック・オブジェクトを記述することができませんのようにして、ユニットテストを書くことができません。
  • 異なるスレッドが同時に静的コードにアクセスしようとすると同時実行性の問題が発生します。同期化された静的メソッドを使用すると、静的メソッドを使用するためにキューに入れられるスレッドになります。
  • インスタンス変数を使用することはできません。インスタンス変数は、コードが複雑になるにつれて制限になります。
  • 必要に応じて、ビジネス層またはデータアクセス層の要素を置き換えることがより困難になります。
  • このようにアプリケーションを作成する場合は、PHPなど、このように動作するように設計された言語を使用する方がよいでしょう。

あなたはいずれかの方法で非静的なビジネス/データアクセス層のクラスのために行くほうが良いでしょう:

  • シングルトンパターン(各クラスの単一のインスタンスを作成し、スレッド間でそれらを共有する)を使用します。 ..
  • または、必要に応じて各スレッドのクラスのインスタンスを作成する。

アプリケーションに接続されている各ユーザー/セッションは独自のスレッドで実行されるため、Webアプリケーションは本質的にマルチスレッドになっています。


-1

複数のユーザーがいるすべての静的メソッドに同時実行性の問題があると思います。 Webレイヤーは、同時ユーザーをスレッドアウトします。すべての静的メソッドでこれを処理できますか?おそらく、しかし、彼らは常に1つのファイルの要求をキューにロックされません?私は確信していません、あなたの考えを試みたことはありません。


4

遊園地の乗り物は、「いつも乗り物の中に手と足を入れてください」と言われていますか?あなたがしなければ、ライドははるかに楽しいです。唯一の本当のトレードオフは、本当にあなたの手と足の中の真の守りを守っているわけではないということです。

ポイントはこれです。あなたの手と足を乗りこなす理由と同じように、「真のOOアプローチ」に従うべき理由があります。どこでも出血が始まるまでは楽しいことです。


4

あなたがそれを記述する方法は、これは「間違った」アプローチそのものではありませんが、避けようとしている問題は実際には分かりません。サーバーが起動したときにこれらのビジネスオブジェクトの単一インスタンスを作成し、必要に応じてそれらをサーブレットに渡すことはできませんか?

OOをウィンドウの外に投げる準備ができている場合は、シングルトンパターンもチェックすることをお勧めします。


2

私は実際にあなたのデザインに利点を見ていないし、間違っていることが多いことがたくさんあります。コードの行を保存していますか?ここではあなたのアプローチにはいくつかの欠点です:

  • あなたが簡単にあなたがあなたの仮定は、マルチスレッド化の問題がないことを
  • 複数のメソッドにロジックを壊す容易にするために、インスタンス変数を定義していないことができ、ビジネス・ロジック
  • の実装を置き換えることはできません発生し、私は本当に1行のコードの省略がBUであることを確認していない

をテストするためにあなたが簡単にそれらを模擬することはできません

  • ほぼ確実に間違っていますあなたには何かがあります。

    これは実際には "OO設計"の問題ではなく、適切性の問題です。なぜあなたはそのような手続き的な方法でJavaを使用していますか?確かに、この種の設計にはPHPがもっと適しています(コンパイルとデプロイをしなくて済むので時間を節約できます)。

    私はあなたのビジネスレイヤを非静的にするだけです。アプリケーションを維持、変更、進化させることが非常に簡単になります。


  • 0

    このタイプのアーキテクチャでは、オブジェクトのユニットテストが難しい場合があります。たとえば、静的データアクセスレイヤーを参照するビジネスオブジェクトのレイヤーがある場合、モックデータアクセスオブジェクトを簡単に使用できないため、ビジネスレイヤーをテストするのが難しい場合があります。つまり、ビジネスレイヤーをテストするときに、データアクセスレイヤーで「実際の」メソッドを使用したくない場合は、データベースに不要な変更を加えるためです。データアクセスレイヤーが静的でない場合は、テスト目的でビジネスレイヤーに模擬データアクセスオブジェクトを提供できます。