2

私は自分のアプリケーションのOOP設計に関してジレンマに直面しています。authクラスをシングルトンにする必要がありますか。kohanaフレームワークとzendフレームワークは、認証クラスをシングルトンとして使用していることがわかります。認証クラスをシングルトンにすることの欠点は何ですか?長所は何ですか?また、私が構築しているアプリケーションはエンタープライズアプリケーションであり、拡張する必要があります。シングルトンの場合、認証システムも拡張できますか?

4

4 に答える 4

3

ここにいくつかの短所があります:

  • コードがクラスの名前に結び付けられているため、テストが非常に難しい
  • グローバル状態の導入
  • 効果の原因を特定できない - 無関係な方法が互いに影響を与える可能性がある
  • コードベース全体への認証リクエストの分散
  • LoD違反

どの段階で、どのように正確にユーザーを認証するかを調べることで、多くのメリットが得られる場合があります (承認と混同しないでください)。また、このトピックはあなたにとって興味深いものかもしれません。

更新

興味のある動画をいくつかご紹介します。

于 2012-03-30T09:10:16.553 に答える
0

シングルトンの使用を避け、アプリケーションごとに 1 つのオブジェクト -> リソースに対してハードウェアに制限がある場合にのみ使用してください。シングルトンを組み込むと、認証クラスをシステム内の他の何かと交換できなくなり、スタックされます。明日、別のロジック、別の接続などを使用して認証を実装する必要があるという新しい要件を受け取る可能性があると考えてください。また、シングルトンを使用した後にシステムをテストする方法については、どのようにモックしますか??

于 2012-03-30T09:04:00.993 に答える
0

シングルトンに行かないでください!それは美化されたオブジェクト指向の名前空間に勝るものはありません。実際、シングルトンはグローバル変数を使用するのとほぼ同じくらい悪く、グローバル関数ライブラリを使用するよりもわずかに優れています (それ自体も悪いです)。作成したオブジェクトをクラスに送信することをお勧めします。

他のオブジェクトに渡される PHP 5 オブジェクトは、デフォルトで参照によって渡されます。新しいインスタンスは作成されません (clone キーワードを使用しない限り)。これにより、あらゆる種類のセッション情報を、それを必要とする他のオブジェクトにオブジェクトとして渡すことができます。

私がお勧めできる最善の方法は、セッション固有の情報を運ぶクラス「セッション」を作成することです。このクラスを MVC オブジェクトに送信します。これにより、セッションが存在しなくてもシステムをテストできます (または、その目的のためにモックアップ状態を作成できます)。あるオブジェクトを別のオブジェクトに渡すと、それらは理想的とは言えませんが、クラスが十分にプリミティブである限り、同じクラスを使用する他のシステムまたはアプリの一部で簡単に作成できます。

また、同じリクエスト内であっても、いつでも簡単に状態またはセッションを転送できます。

于 2012-03-30T09:05:56.850 に答える
-3

PHP では、リクエストが完了すると、オブジェクトはメモリに残りません。

したがって、オブジェクトをシングルトンとして作成したとしても、すべてのリクエストにはそのクラスの独自のインスタンスがあります。

しかし、オブジェクトが単一のリクエストで複数回アクセスされている場合、違いが生じます。その場合、シングルトンには次の利点があります。

  • 複数の冗長なインスタンスが作成されるのを防ぐため、リクエストのメモリ使用量が少なくなります。

  • 複数のアクセスで同じデータを共有します。

例: Codeigniter の get_instance 関数はシングルトン コンセプトの実装であり、各リクエストで 1 つの Codeigniter インスタンスのみが使用されます。

于 2012-03-30T09:03:08.997 に答える