アプリケーションから新しい機能を常に発見しようとしているとき、提案するソリューションが以前に実装したものと非常に似ていることに気づきましたか?あなたがプログラマーであれば (プログラマーを始めてまだ日が浅いとしても)、おそらく「はい」と答えたでしょう。ソフトウェア開発中に新たに発見された問題を解決するために古いコードを使用しているようです。あなたのソリューションは基本的なものであり、あなただけでなくすべてのプロの開発者が広く繰り返すことができる方法であることに気づいたかもしれません。
実際、プログラミングに関する多くの問題は繰り返し発生しており、これらの問題を解決するために使用される多くの基本的な手法 (またはデザイン パターン) が登場しています。デザイン パターンは、本物で信頼できるデザインを使用してコードを編成する方法を教えるテンプレートです。
デザインパターンの歴史
「デザインパターン」という用語は、もともと建築の分野で造語されました。 Christopher Alexander は 1977 年の著書『A Pattern Language: Towns/Building/Construction』の中で、いくつかの一般的な建築設計の問題について説明し、この既存のよく知られたパターンのコレクションを使用して新しい効果的な設計を開始する方法を説明しています。 Alexander の視点はソフトウェア開発にもうまく反映されており、既存のコンポーネントを使用して新しいソリューションを構築することについては長期的なコンセンサスがあります。
すべてのデザイン パターンには、名前、問題ステートメント、解決策という共通の特徴があります。
設計パターンの識別は、他のプログラマーが深く学習することなくコードの目的をすぐに理解できるため、重要です (少なくともこの識別を通じてプログラマーはパターンに精通します)。
問題の説明は、このモデルの応用分野を説明するために使用されます。 ?
ソリューションは、このモデルの実行を説明します。設計パターンについて十分に議論するには、モデルを使用する利点と欠点が含まれている必要があります。
パターンは、特定の問題を解決する効果的な方法です。デザイン パターンはライブラリ (プロジェクトに含めて直接使用できるコードのライブラリ) ではなく、コードを整理するためのテンプレートです。実際、コード ベースとデザイン パターンの適用には多くの違いがあります。
たとえば、店で購入するシャツはコード ライブラリですが、その色、スタイル、サイズはデザイナーとメーカーによって決まりますが、それはあなたのニーズを満たします。
ただし、お店に自分に合うものがなければ、自分でシャツを作ることができます(形をデザインし、生地を選び、一緒に仕立てます)。ただし、仕立て屋ではない場合は、適切なパターンを見つけて、そのパターンに従って独自のシャツをデザインするのは簡単かもしれません。モックアップを使用すると、適切なデザインのシャツを短時間で作成できます。
ソフトウェアの話に戻りますが、データ抽出レイヤーや CMS (コンテンツ管理システム) はライブラリです。これは以前に設計され、コーディングされており、ニーズを正確に満たす場合、それはライブラリです。良い選択です。しかし、これを読んでいるあなたは、ストックソリューションが常に効果があるとは限らないことに気づいたかもしれません。自分が何を望んでいるのかが分かり、それを達成できるようになったので、あとはガイドとなるモデルが必要です。
最後にもう 1 つ: 仕立てモデルと同じように、デザインはそれ自体ではほとんど役に立ちません。結局のところ、衣服のモデルを着ることはできません。それは薄い紙をつなぎ合わせただけです。同様に、ソフトウェア設計モデルも単なるガイドにすぎません。プログラミング言語とアプリケーションの特性と要件に従って特別に設計する必要があります。
この本の目的
この本の目的は、さまざまなカテゴリのソフトウェア設計パターンを包括的に紹介したり、新しい設計パターンや用語を開発したりすることではなく、いくつかの既存のよく知られた設計パターンに焦点を当てることです。この本のユニークな点は、動的 WEB アプリケーションの開発に役立つと思われるいくつかのデザイン パターンを紹介し、これらのデザイン パターンを PHP で実装する方法を示していることです。
オブジェクト指向プログラミング OOP
この本の利点の 1 つは、すべての視点が非常に自然な設計パターンである OOP に基づいており、OOP を使用して実装されていることです。
OOP に詳しくない場合でも、OOP をより深く理解するのに役立つ関連リソース (書籍、Web サイト、雑誌、クラスなど) が多数あります。ほとんどの OOP 文献は、コードの再利用、コードの堅牢性、コードのカプセル化、ポリモーフィズム、拡張性といったその利点を称賛しており、これらはすべて非常に重要で有用でもあります。ただし、OOP の主な利点は、問題を自分で扱いやすいモジュールに分解することを促進することだと思います。より小さなモジュールに分割された明確な設計と実装により、コードをより徹底的にテストできるようになり、理解と保守が容易になります。
読者のスキル要件
この本は、読者がすでに PHP を流暢に使用できることを前提としています。特に、この本は、読者が PHP と PHP 構文に関する実践的な知識をすでに持ち、OOP を使用して PHP コードを実行する基本原則を理解していることを前提としています。この本は PHP プログラミングの入門書ではなく、PHP での OOP プログラミングを紹介することを目的としたものでもありません。
すべての OOP 開発者が同じ用語を使用しているわけではないため、新しい用語が導入された場合は、テキストまたはツールバーで定義します。
PHP4 と PHP5
この本を書いている時点では、PHP5 はリリースされてからしばらく経っていますが、まだ一般のコミュニティに広く採用されていません。私自身の仕事で、新しいアプリケーション開発作業を PHP5.0.3 環境に移行し始めました。これまでのところ、PHP5 には PHP4 コードとの良好な下位互換性があり、同時にそのオブジェクト指向モデルは 1 つであることがわかり、満足しています。 PHP5 の最も重要な新機能の一部です。
異なる PHP バージョン間のオブジェクト モデル間の微妙な違いを扱う優れた記事やガイドがたくさんあります。しかし、簡単に言えば、PHP5 は以下を提供します:
オブジェクト ハンドル (詳細については、第 2 章: オブジェクト モデルの値を参照)
より良いコンストラクター (名前は統一されており、変更は許可されません)?
デストラクター?
可視性 (メソッドとプロパティはパブリック、プロテクト、プライベートです)?
例外処理 (エラーをトリガーする新しい構文 try{}catch{} を選択できます)?
静的クラス
イメージング (クラスの動的チェック、
型の隠蔽?
PHP5 は、さらに知られていない機能もいくつか提供しています:
新しいマジック メソッド
__get() と __set() を使用すると、変数へのアクセスを制御できます
__call() を使用すると、すべてを動的にインターセプトできます呼び出されたオブジェクトの属性。
__sleep() と __wakeup() を使用すると、シリアル化メソッドをオーバーロードできます。
__toString() を使用すると、オブジェクト自体を記述するために文字列を使用する方法を制御できます。
オートローディング (初めてオブジェクト化されたときにユーザーがクラスを自動的にロードできるようにします)?
Final (このメソッドまたはクラスがそのサブクラスによってオーバーロードされることを許可しません)?
オブジェクト ハンドル
PHP5 最高特徴は、ファイルまたはデータベースのハンドルと同様に、ハンドルを使用してクラスを定義することです。 PHP 関数でオブジェクトを使用すると、オブジェクトが暗黙的にコピーされなくなりましたが、操作ハンドルが提供されます。
違いをより明確に見るために、次の 2 つの例を考えてみましょう:
// PHP4 class
class ExampleP1 {
var $foo;
function setFoo($foo) {
$this->foo = $foo` ;
}
function getFoo() {
return $this->foo;
}
}
function changeExample($param) {
$param->setFoo('blah');
return $param ->gt; getFoo();
}
$obj = new ExampleP1;
$obj->setFoo('bar');
echo $obj->getFoo(); // bar
echo ChangeExample($obj) ; blah
echo $obj->getFoo(); // bar
PHP4 では、関数changeExample() の変数 $param は $obj のコピーであるため、この関数は元のオブジェクト $ の値を変更しません。 foo なので、$obj->getFoo() の最終出力は 'bar' になります。
PHP5 では、$obj は関数内の単なるオブジェクト ハンドルであるため、同じchangeExample() 関数は実際には元のオブジェクトに影響を与えます。つまり、ハンドルを使用するとコピーする必要がなく、$param が $obj インスタンスになります。
// PHP5 クラス
class ExampleP2 {
protected $foo;
function setFoo($foo) {
$this->gt;foo = $foo;
}
function getFoo() {
return $this->foo ;
}
}
$obj = new ExampleP2;
$obj->setFoo('bar');
echo $obj->getFoo(); // bar
echo ChangeExample($obj);
echo $obj->getFoo(); // 重要、エラーが発生します
この問題は、他のオブジェクトまたはこのオブジェクトの組み込みコンストラクター (__construct) で $this 変数を使用する場合にさらに深刻になります。
PHP4 では、ほとんどの場合次のことが必要であることがわかりました:
この $obj=?& new class; のように参照オブジェクトを作成します。
function func(?&$obj_param のように、関数内で参照オブジェクトを呼び出します) ){ }
function? &some_func(){} $return_obj=&some_funct() などの関数を参照してオブジェクトをキャプチャします
実際、元のオブジェクトをコピーする必要がある場合もあります。私の PHP4 コードでは、明示的なオブジェクトのコピーなど、参照されていないオブジェクトのタスクを常にコメント アウトします。長期的には、このような短いコメントは、コードを保守する人の頭痛の種を大幅に軽減することができます (翻訳者注: このようなコードは非常に保守しやすいです)。値による参照渡し、オブジェクト ハンドル、オブジェクト コピーの関連知識については、第 2 章「オブジェクト パターンの値」で詳しく説明します。
私は個人的には開発には PHP5 を使用することを好みますが、PHP4 は今後もかなり長い間使用され続けると感じており、公開されている既存のプロジェクトは引き続き PHP4 をサポートすると思います。したがって、この本では両方のバージョンの PHP に対して同じサポートを提供します。 PHP4 および PHP5 バージョンのサンプルコードを可能な限り提供します。各章では、各コード ブロック (異なる PHP バージョンで変更されたもの) に、//php4 や //php5 などの変更を示す対応するコメントが付けられています。
参考文献とその他のリソース
デザインパターンをより良く学ぶのに役立つ関連参考書がここにたくさんあります。デザインパターンの「バイブル」(訳者訳:最高の本)は、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシデス(彼の独創的な作品はしばしば「Gang of Four」、略して「GOF」と呼ばれる)です。それは、4 人を代表して書かれた「デザイン パターン: 再利用可能なオブジェクト指向ソフトウェア開発の原則」です)。
「デザインパターン」に関して、PHP WEBアプリケーションのデザインパターンに関する次に役立つ書籍は、Martin Fowler著『Patterns of Enterprise Application Architecture』(訳者訳:エンタープライズアプリケーションアーキテクチャモデル)です。 GOF の本には一般的なデザイン パターンがすべて含まれていますが、ファウラーの本では特に Web アプリケーションの開発に特化した多くのデザイン パターンが詳細に紹介されています。
さらに、多くの Web サイトでは、デザイン パターンに関する豊富なリソースも提供しています。特に典型的な Web サイトは、Portland Model Library (http://cz.com/por/) です。
PHP デザイン パターンに関する別の Web サイトは phpPatterns で、オンライン アドレスは http://www.phppatterns.com です。
ありがとうございます
私の仕事と責任により、私が興味のあるこの分野に時間の一部を費やすことができた上司にとても感謝しています。また、私に知識と経験を与えてくれたことにも感謝しています。この本を書き終える自信を与えてくれました。
私にとってのもう 1 つのインスピレーション、アイデア、経験の源は、SitePoint (http://www.sitepoint.com) のフォーラムです。特に、Advanced PHP Forum に定期的に参加している寄稿者は豊富な知識と経験を持っており、私がオンラインで見つけたアイデアを共有する最も寛大なグループです。これらのリソース (翻訳者注: SitePoint サイト) を通じて、SimpleTest (http://simpletest.sf.net)、WACT (http://wact.sf.net)、その他貴重だと思う多くのリソースにログインしました。 PHPプロジェクト。今後数年間、SitePoint が PHP 開発者にとって豊富なリソースであり続けることを願っています。
この本は、PHP 開発チームの貢献と多大な努力なしには明らかに不可能でした。なぜなら、使いやすく、学びやすく、多用途で、WEB アプリケーションの開発に非常に適した言語を開発したのは彼らだからです。
最後に、Marco Tabini と php|architect のメンバー全員に感謝します。この雑誌 (訳者注: php|architect) は、さまざまな PHP テーマのソースとなり、これらのテーマはプロの開発者によって公開されています。マクロ社主催のカンファレンスもなかなか良かったです。
上記は、PHP チュートリアル: PHP デザイン パターンの序文の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。