誰もが独自のツールセットを持っています。として PHP開発者 、私のお気に入りの1つは、「Nooku」と呼ばれるRapid ApplicationDevelopmentフレームワークです。の言葉で 開発グループ :「NookuはフレームワークというよりもWeb開発ツールキットです」。
あなたがそれに精通していない場合は、持っている 見て 。これは、業界で受け入れられているデザインパターンを多用して、拡張と再利用が容易な高度にコンポーネント化されたアプリケーションを作成するオープンソースプロジェクトです(当初は、 Joomlaをリード!開発者 )。箱から出して、Nookuはあなたに得るのを助けるためにあなたにたくさんの迅速なアプリケーション開発ツールを提供します プロジェクト より速く地面から離れます。小さいが強力なサンプル:
Nookuの中心にあるのは、「継承を超える構成」の設計原則です(実際、これはNookuの紹介ページの最初の概念です。1行で:複数のオブジェクトの機能を構成(または合計)して、いくつかを作成することを目指す必要がありますサブクラス化に依存するのではなく、一種の複合オブジェクト。
この原則により、記述するコードが少なくなり、多くの場合、非常に洗練されたソリューションにつながります。では、どの程度正確に宣伝されているのでしょうか。コードレベルでは、最良の例はミックスインとリソース/サービス識別子の使用によるものです。見てみましょう。
PHP 5.4より前は、この言語には次の概念がありませんでした。 特性 。これらはクラスのような構造であり、オブジェクトによって「使用」されると、ある種の機能を提供します(多重継承と同様)。 Nookuはこの問題を何年もの間(PHP 5.2以降)解決してきました。 混入します 。
Mixinを使用すると、オブジェクトを一緒に作成できるだけでなく、各混合オブジェクトのメソッドを複合オブジェクトのインターフェイスに追加することもできます。ミックスインを使用しているオブジェクトは、ミックスインされたオブジェクトのメソッドを「継承」しているようです。
/** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @param KMixinInterface $object An object that implements KMinxInterface * @return KObject */ public function mixin(KMixinInterface $object) { $methods = $object->getMixableMethods($this); foreach($methods as $method) { $this->_mixed_methods[$method] = $object; } // Set the mixer $object->setMixer($this); return $this; }
Nookuのほとんどすべてのオブジェクトは、を定義した基本クラスKObjectを拡張するため、この機能を備えています。 混入します 方法。
Nookuのコントローラーアーキテクチャの主要なクラスもKObjectの子孫です。抽象コントローラーはKControllerAbstractクラスであり、検査すると、すぐにミキシング機能を利用していることがわかります。このクラスのインスタンスが構築されるたびに、KMixinCommandおよびKMixinBehavior機能がそのインターフェイスにすぐに追加されます。したがって、Nookuの各コントローラーは、それぞれのオブジェクトを介したコマンドチェーンおよび動作管理機能で構成されます。
なぜすべてのクラス名の前にKがあるのですか? Nookuのメインライブラリは「Koowa」というコードネームです。
Nookuコントローラーに戻る:KMixinBehaviorクラスは、KControllerAbstractに特定のロード機能を提供するためにすべての要素を保持します 行動 実行時。行動戦略は、他のクラス(編集可能、注文可能など)によって分離して使用できるプロセスまたはロジックを記述するクラスです。 KMixinBehaviorは非常に単純で、getBehavior、hasBehavior、addBehavior、getBehaviorsの4つのメソッドしかありません。そして、オブジェクトにさまざまな動作戦略を処理およびカプセル化する機能を与えるために必要なのはこれだけです。
同様に、KMixinCommandには、getCommandContext、getCommandChain、setCommandChainの3つのメソッドしかありません。ご想像のとおり、これら3つのメソッドは、KControllerAbstractにコマンドチェーンを実装する機能を提供しますが、実行時に実装できるようにします。
このミキシングは、単純な算術加算と考えることができます。
次のようなインターフェイスが提供されます:
定義上、抽象クラスは拡張されることを意図しているため、継承の魔法によって、子またはKControllerAbstractのインスタンスであるすべてのオブジェクトは、実行時に動作とコマンドチェーンを追加する機能も取得します。
かっこいいね。しかし、それは実際にはどういう意味ですか?つまり、Nookuはコンポーネント化された機能を提供します。つまり、Nookuを使用すると、実行時に機能をモジュール化し、モジュール間で機能を構成できます。
これらの2つの例は、構成を示すのに役立ちます。また、NookuRADフレームワークのコアでのさらなる構成のサポートを示すのにも役立ちます。これは重要な利点です。上記のKControllerAbstractに追加されたメソッドは、1行のコードが記述される前に変化するものをカプセル化するツールを開発者に提供することにより、「戦略設計パターン」をサポートします。 mixin()メソッドがKObjectのすべての拡張機能の一部であるという事実は、実行時にほとんどのオブジェクトに他の動作管理インターフェイスを簡単に定義して追加できることを意味します。
NookuのサービスIDとリソース識別子およびロケーターも、関心の分離を強力にサポートします。
もう一度、KObjectだけでなく、KServiceも見てみましょう。 Nookuのほとんどのものをサービスまたはリソースとして扱うことができるため、まったく同じ方法でそれらをインスタンス化して問い合わせることができます。
サービスは、リソースを取得するための手段と考えてください。すべてのサービスはリソースですが、すべてのリソースがサービスであるとは限りません
食料品店に行って商品を購入するときは、その店をサービス、つまりできるアイテムのコレクションと考えてください。 B 行;リソースとしての製品、つまり、次のような単一のアイテム/ソリューションロジック。
この例をさらに進めて、食料品店にフランチャイズ部門があり、ビジネスをしたいとします。そのような状況では、サービスはフランチャイズ部門であり、リソースは購入した食料品店です。それは非常に文脈上の分類です。全体として、これはとして知られています パン アクションパターン(KControllerServiceとKControllerResourceの間に「_action」が前に付いたこれらのそれぞれが表示されます(つまり、_actionRead()))。
モデルはサービス、テーブルオブジェクトはサービス、特定のMVCトライアドはリソースまたはサービスとしてインスタンス化され、サービスの問い合わせから得られた特定のレコードはリソースと見なすことができます。
Nookuのすべてのオブジェクトは、「サービスコンテナ」内のアプリケーション全体のインスタンス化されたサービスへの参照と、getService()と呼ばれるサービスにアクセスするメソッドが含まれているという点でオブジェクトの組み合わせです。 KObject :: getService()メソッドに必要なのは、有効なリソース識別子を渡すことだけです。これにより、すぐに使用できるインスタンス化されたサービスが返されます。
PHPの迅速なアプリケーション開発では、Resource Identifiersを使用すると、オブジェクトのインスタンス化をそのクラス名から切り離し、そのIDのエイリアスを提供できます。これは、アプリケーションの保守性に重要な影響を及ぼします。開発者は、エイリアスを使用して、KService :: addAlias()を使用して1行のコードを追加することにより、特定の識別子でインスタンス化されるすべてのオブジェクトで使用されるクラスを変更できます。
私たちがよく知っているリソース識別子の例は、URIまたはUniform ResourceIdentifierです。
これは、KServiceが適切なクラスを見つけてロードするために必要なすべての情報です。これらの部分は、配置とインスタンス化の予測可能性を提供するNookuのクラスの命名と配置の規則と一致します。上記の識別子の例(com://site/user.database.table.user)は、ComUserDatabaseTableUserというクラス名を持つファイル/components/com_user/databases/tables/user.phpを読み込もうとします。ちなみに、ファイルが存在しない場合、フレームワークはデフォルトのテーブルオブジェクトを提供し、データベースの名前付けとIDスキーマの規則に基づいてファイルを構築します(これは私をもう少し夢中にさせました)。前述のように、KServiceでは識別子のエイリアスを設定することもできます。 KService::setAlias('maindbaseadapter','com://admin/default.database.adapter.mysqli')
を使用する; KService::getService(‘maindbaseadapter’)
を使用してdbオブジェクトをロードしましょう。
これにより、前述のデカップリングが可能になり、アプリケーションの保守と拡張に大きな利点がもたらされます。必要に応じて、「site」と「admin」以外のアプリケーションを自由に作成できます。ここで説明する識別子を使用すると、他のアプリケーションにあるサービスを簡単に使用して、ソリューションが要件を満たすのに役立ちます。繰り返しになりますが、これは、NookuがPHPおよびRADの開発者とチームに、単一クラスのオブジェクトだけでなく、サービスとアプリケーション全体の構成を無料でサポートする方法のもう1つの例です。
継承をめぐる構成を中心に。さらなるアマルガムをサポートするために存在する、スマートで既存の構成と構造。また、ここで説明する識別子を使用した無料のサービス指向アーキテクチャであるNookuは、強力なRADフレームワークを提供し、他のどのピアよりも大幅に有利なスタートを切ることができます。 PHP開発 ツール。