2

かなり標準的な Web/サービス/データ アクセス レイヤード デザインを使用して、楽しみ/学習用の小さな Web サイトを構築しています。

サービス レイヤー/データ アクセス レイヤー クラスのインスタンスを常に作成する必要がないように、それらのメソッドをすべて静的にしました。ローカル変数などを使用し、リソースを共有しないため、同時実行の問題は発生しないはずです (現時点では、これについては十分に単純です)。

私が見る限り、これに対する唯一のトレードオフは、実際には真のオブジェクト指向アプローチに従っていないということですが、それでもコードをよりクリーンに保ちます。

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

4

6 に答える 6

4

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

OO を窓の外に放り出す準備ができている場合は、Singleton パターンもチェックしてみてください。

于 2008-09-23T19:18:59.620 に答える
4

遊園地の乗り物に「手足は常に乗り物に入れておいてください」とある乗り物を知っていますか?そうしないと、ライドがもっと楽しくなることがわかります。唯一の本当のトレードオフは、常に乗車中に手足を離さない真のアプローチに従っていないことです。

ポイントはこれです - 手足を乗り物の中に入れておく理由があるのと同じように、「真のオブジェクト指向アプローチ」に従うべき理由があります - どこでも出血し始めるまではとても楽しいです.

于 2008-09-23T19:14:41.143 に答える
3

短所:

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

次のいずれかの方法で、非静的ビジネス/データ アクセス レイヤー クラスを使用することをお勧めします。

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

アプリケーションに接続された各ユーザー/セッションは独自のスレッドで実行されることに注意してください。つまり、Web アプリケーションは本質的にマルチスレッドです。

于 2008-09-29T20:18:18.670 に答える
2

私はあなたのデザインの利点をあまり見ていないし、うまくいかないことがたくさんあります. おそらく、コード行を節約していますか?あなたのアプローチにはいくつかの欠点があります:

  • ビジネスロジックの実装を簡単に置き換えることはできません
  • ロジックを複数のメソッドに分割しやすくするためにインスタンス変数を定義することはできません
  • マルチスレッドの問題が発生しないというあなたの仮定は、ほぼ確実に間違っています
  • テストのためにそれらを簡単にモックすることはできません

コードを 1 行省略しただけで何かが得られるとは思えません。

これは実際には「OO 設計」の問題ではなく、より適切な問題です。なぜ、そのような手続き的な方法で Java を使用しているのですか? 確かに、この種の設計には PHP の方が適しています (実際、コンパイルしてデプロイする必要がないため、時間を節約できます)。

ビジネスレイヤーを非静的にするだけです。アプリケーションの保守、変更、進化が非常に簡単になります。

于 2008-09-23T19:28:15.573 に答える
0

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

于 2008-09-23T19:31:47.530 に答える
-1

複数のユーザーがいるすべての静的メソッドで同時実行の問題が発生すると思います。Web レイヤーは、同時ユーザーをスレッド化します。すべての静的メソッドでこれを処理できますか? おそらく、単一のファイルでリクエストをキューに入れると、常にロックされるのではないでしょうか? よくわかりませんが、あなたのアイデアを試したことはありません。

于 2008-09-23T18:38:22.963 に答える