PHPでシングルトンが必要なのは誰ですか?
シングルトンに対するほとんどすべての異論は技術的な見地から来ていることに注意してください-しかし、それらはその範囲も非常に制限されています。特にPHPの場合。最初に、シングルトンを使用する理由のいくつかをリストし、次に、シングルトンの使用に対する異論を分析します。まず、それらを必要とする人々:
-多くの異なる環境で使用される大規模なフレームワーク/コードベースをコーディングしている人々は、クライアント/ボスからの多くの異なる変化する気まぐれなリクエストを実装する必要があるため、既存の異なるフレームワーク/コードベースを使用する必要があります。 / management / unitリーダーが行います。
シングルトンパターンは自己包括的です。完了すると、シングルトンクラスは、それを組み込んだすべてのコードで固定され、メソッドと変数を作成した方法とまったく同じように動作します。また、特定のリクエストでは常に同じオブジェクトです。2つの異なるオブジェクトになるように2回作成することはできないため、シングルトンオブジェクトがコードの任意の時点で何であるかがわかります。シングルトンが2つ、3つ、古い、スパゲッティのコードベースに挿入されている場合でも同様です。したがって、開発目的の面でより簡単になります。そのプロジェクトで多くの人が作業している場合でも、特定のコードベースのある時点でシングルトンが初期化されているのを見ると、それが何であるか、何をするか、どのように行われるかがわかりますそれが伝統的なクラスであった場合、そのオブジェクトが最初に作成された場所を追跡する必要があります。コードのその時点までに呼び出されたメソッドとその特定の状態。ただし、シングルトンをそこにドロップします。適切なデバッグおよび情報メソッドをドロップし、コーディング中にシングルトンに追跡すると、それが正確にわかります。そのため、異なる哲学で以前に行われたコードを統合したり、連絡先のない人々によって行われたコードを統合する必要があるため、異なるコードベースで作業する必要がある人々にとって、それはより簡単になります。(つまり、vendor-project-company-what何もない、何もサポートされない)。これは、以前にさまざまな哲学で行われたコードを統合したり、連絡先のない人々によって行われたりする必要があるため、さまざまなコードベースで作業する必要のある人々にとって簡単になります。(つまり、vendor-project-company-what何もない、何もサポートされない)。これは、以前にさまざまな哲学で行われたコードを統合したり、連絡先のない人々によって行われたりする必要があるため、さまざまなコードベースで作業する必要のある人々にとって簡単になります。(つまり、vendor-project-company-what何もない、何もサポートされない)。
-サードパーティのAPI、サービス、ウェブサイトで作業する必要がある人。
よく見ると、これは前のケースとそれほど変わらない-サードパーティのAPI、サービス、ウェブサイトは、制御できない外部の分離されたコードベースのようなものです。何でも起れる。したがって、シングルトンセッション/ユーザークラスを使用すると、OpenID、Facebook、Twitterなどのサードパーティプロバイダーからのあらゆる種類のセッション/承認実装を管理できます。また、同じシングルトンオブジェクトからこれらすべてを同時に実行できます。 -簡単にアクセスできます。プラグインを接続したコードのどの時点でも、既知の状態にあります。独自のWebサイト/アプリケーションで、同じユーザー用の複数の異なるサードパーティAPI /サービスへの複数のセッションを作成し、それらを使用してやりたいことを行うこともできます。
もちろん、これらすべては、通常のクラスとオブジェクトを使用することにより、従来のメソッドと調和することもできます-ここでの問題は、シングルトンがよりきちんとしていて、すっきりしているため、そのような状況での従来のクラス/オブジェクトの使用と比較して、管理/テストが容易であるためです。
-迅速な開発を行う必要がある人
シングルトンのグローバルな動作により、構築するシングルトンのコレクションがあるフレームワークを使用してあらゆる種類のコードを簡単に構築できます。これは、シングルトンクラスを適切に構築すると、確立された成熟したメソッドとセットメソッドが簡単に利用できるようになるためです。いつでもどこでも一貫した方法で使用できます。クラスを成熟させるにはしばらく時間がかかりますが、その後はしっかりしていて一貫性があり、便利です。シングルトンに好きなだけ多くのメソッドを実行できます。これにより、オブジェクトのメモリフットプリントが増加する可能性がありますが、迅速な開発に必要な時間を大幅に節約できます。アプリケーションは別の統合されたアプリケーションで使用でき、クライアント/ボス/プロジェクトマネージャーがいくつかの変更を加えるだけで要求される新しい機能をたたくことができます。
あなたはアイデアを得ます。次に、シングルトンへの異議と、有用なものに対する不聖な十字軍に移りましょう:
-一番の問題は、テストが難しくなることです。
そして、実際には、適切な予防策を講じてデバッグルーチンをシングルトンにコーディングすることで簡単に軽減できる場合でも、シングルトンをデバッグすることを認識して、ある程度はそれを行います。しかし、これは、他に存在する他のコーディング哲学/方法/パターンとそれほど違いはありません-ただ、シングルトンは比較的新しく、広く普及していないため、現在のテスト方法は、それらと比較的互換性がありません。しかし、それはプログラミング言語のどの側面でも違いはありません-異なるスタイルは異なるアプローチを必要とします。
この異論は、アプリケーションが開発された理由が「テスト」ではないという事実を無視し、アプリケーションの開発に入る唯一のフェーズ/プロセスではないという点で、この異論は横ばいになります。アプリケーションは本番用に開発されています。そして、「シングルトンが必要な人」セクションで説明したように、シングルトンは、コードを多くの異なるコードベース/アプリケーション/サードパーティサービスで機能させなければならないという複雑さから、大きな取引を削減できます。テストで失われる可能性がある時間は、開発と展開で得られる時間です。これは、サードパーティの認証/アプリケーション/統合の時代に特に役立ちます。
それは理解できますが、プログラマーはキャリアに応じて非常に異なる状況で作業します。そして、比較的大きな会社で働いており、定義された部門が異なる定義されたソフトウェア/アプリケーションを快適な方法で扱い、予算削減/レイオフの差し迫った破滅とそれに伴う多くの異なるものでたくさんのことを行う必要がない人々のために安価/高速/信頼性の高い方法では、シングルトンはそれほど必要ではないようです。そして、それは彼らがすでに持っているものへの迷惑/妨害でさえあるかもしれません。
しかし、「アジャイル」開発の汚い溝で作業する必要があり、クライアント/マネージャー/プロジェクトから多くの異なる要求(時には無理)を実装する必要がある場合、前述の理由により、シングルトンは節約の恩恵です。
-もう1つの反対点は、そのメモリフットプリントが高いことです。
各クライアントからのリクエストごとに新しいシングルトンが存在するため、これはPHPに対する異論となる可能性があります。適切に構築および使用されていないシングルトンでは、多くのユーザーが任意の時点でアプリケーションのサービスを受けている場合、アプリケーションのメモリフットプリントは高くなる可能性があります。
ただし、これは、コーディング中に実行できるあらゆる種類のアプローチに有効です。尋ねられるべき質問は、これらのシングルトンによって保持および処理されるメソッド、データは不要ですか?たとえば、アプリケーションが取得する要求の多くで必要な場合、シングルトンを使用しなくても、それらのメソッドとデータは、コードを通じて何らかの形でアプリケーションに存在します。したがって、従来のクラスオブジェクト1/3をコード処理に初期化し、3/4に破棄すると、どれだけのメモリを節約するかという問題になります。
このようにすると、質問はまったく無関係になります。シングルトンを使用するかどうかに関係なく、不要なメソッドやコード内のオブジェクトに保持されるデータはありません。そのため、シングルトンに対するこの異議は本当に陽気になり、不必要なメソッド、使用するクラスから作成されたオブジェクト内のデータがあると想定しています。
-「複数のデータベース接続を維持できない/困難にする」などのいくつかの無効な異論
複数のデータベース接続、複数のデータベース選択、複数のデータベースクエリ、特定のシングルトンの複数の結果セットを維持する必要があるときに、この異論を理解することすらできません。それらは必要です。これは、配列に保持するのと同じくらい簡単ですが、そのために使用したいメソッドを発明することができます。しかし、最も単純なケースである、与えられたシングルトンでの変数と配列の使用を調べてみましょう:
以下が特定のデータベースシングルトン内にあると想像してください。
$ this- > connections = array(); (間違った構文、私はあなたに絵を与えるためにこのように入力しました-変数の適切な宣言はpublic $ connections = array();であり、その使用法は当然$ this-> connections ['connectionkey']です)
この方法で、一度に複数の接続をセットアップし、アレイに保持できます。クエリや結果セットなども同様です。
$ this-> query(QUERYSTRING、 'queryname'、$ this-> connections ['particulrconnection']);
これは、選択した接続を使用して選択したデータベースに対してクエリを実行し、
$ this- >結果
キー 'queryname'の配列。もちろん、このためにクエリメソッドをコーディングする必要があります。これは簡単なことです。
これにより、必要に応じて、事実上無数の(リソース制限で許可されている限り)さまざまなデータベース接続と結果セットを維持できます。また、このシングルトンクラスがインスタンス化されたコードベースの任意のポイントで、任意のコードで使用できます。
もちろん、当然、結果セットと接続が不要になった場合は接続を解放する必要がありますが、それは言うまでもなく、シングルトンやその他のコーディング方法/スタイル/コンセプトに固有のものではありません。
この時点で、同じシングルトンでサードパーティのアプリケーションまたはサービスへの複数の接続/状態を維持する方法を確認できます。それほど違いはありません。
要するに、シングルトンパターンは、プログラムを作成するための別の方法/スタイル/哲学にすぎず、正しい場所で正しい方法で使用される場合、他のどのパターンとも同じように役立ちます。何も変わらない。
シングルトンがバッシングされているほとんどの記事では、「グローバル」が「悪」であることへの言及もあることに気づくでしょう。
それに直面しましょう-適切に使用されていない、虐待されている、誤用されているものはすべて悪です。これは、言語、コーディング概念、メソッドに限定されません。誰かが「X is evil」のような包括的なステートメントを発行しているのを見たら、その記事から逃げてください。視点が特定の分野での長年の経験の結果である場合でも、限られた視点の産物である可能性は非常に高く、通常、特定のスタイル/方法-典型的な知的保守主義で働きすぎた結果です。
「グローバルは悪である」から「iframeは悪である」まで、無限の例がそのために与えられます。10年ほど前に、特定のアプリケーションでiframeの使用を提案することさえも異端でした。次に、Facebook、iframeがどこにでもあり、何が起こったかを確認します-iframeはそれほど悪ではありません。
それでも頑固に「邪悪」だと主張する人もいますが、正当な理由がある場合もあります。
プログラマー/コーダー/ソフトウェアエンジニアの最も重要な資産は、自由でオープンで柔軟な心です。