svn: /phpdoc/ja/trunk/language/oop5/ patterns.xml
| From: | TAKAGI Masahiro | Date: | Sun, 22 Sep 2013 22:16:28 +0000 |
| Subject: | svn: /phpdoc/ja/trunk/language/oop5/ patterns.xml | ||
| Groups: | php.doc.ja | ||
| Request: | Send a blank email to doc-ja+get-3967@lists.php.net to get a copy of this message | ||
takagi Sun, 22 Sep 2013 22:16:28 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=331468
Log:
Sync with en
Changed paths:
D phpdoc/ja/trunk/language/oop5/patterns.xml
Deleted: phpdoc/ja/trunk/language/oop5/patterns.xml
===================================================================
--- phpdoc/ja/trunk/language/oop5/patterns.xml 2013-09-22 19:36:50 UTC (rev 331467)
+++ phpdoc/ja/trunk/language/oop5/patterns.xml 2013-09-22 22:16:28 UTC (rev 331468)
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision$ -->
-<!-- EN-Revision: 313136 Maintainer: hirokawa Status: ready -->
-<!-- CREDITS: shimooka,takagi -->
-<sect1 xml:id="language.oop5.patterns" xmlns="http://docbook.org/ns/docbook">
- <title>パターン</title>
- <para>
- パターンは、最善の手順と良い設計を記述するための手段です。
-
パターンは、一般的なプログラム上の課題に柔軟な解決策を提供します。
- </para>
-
- <sect2 xml:id="language.oop5.patterns.factory">
- <title>Factory</title>
- <para>
- Factory
パターンにより、実行時にオブジェクトを初期化できるようになります。
- オブジェクトを"製造する"ことに似ているため、これは
- Factory パターンと呼ばれています。
- パラメータ化された Factory
が、生成するクラス名を引数として受け取ります。
- </para>
- <example>
- <title>パラメータ化された Factory メソッド</title>
- <programlisting role="php">
-<![CDATA[
-<?php
-class Example
-{
- // パラメータ化された Factory メソッド
- public static function factory($type)
- {
- if (include_once 'Drivers/' . $type . '.php') {
- $classname = 'Driver_' . $type;
- return new $classname;
- } else {
- throw new Exception('Driver not found');
- }
- }
-}
-?>
-]]>
- </programlisting>
- <para>
- このメソッドをクラス内で定義することで、実行時に
- ロードされるドライバを作成できるようになります。
- <literal>Example</literal>
クラスが、データベース抽象化クラスで、
- <literal>MySQL</literal> および <literal>SQLite</literal>
- ドライバをロードするとすると以下のように行うことができます。
- </para>
- <programlisting role="php">
-<![CDATA[
-<?php
-// MySQL ドライバをロード
-$mysql = Example::factory('MySQL');
-
-// SQLite ドライバをロード
-$sqlite = Example::factory('SQLite');
-?>
-]]>
- </programlisting>
- </example>
- </sect2>
-
- <sect2 xml:id="language.oop5.patterns.singleton">
- <title>Singleton</title>
- <para>
- Singleton
は、あるクラスのインスタンスがひとつだけしかないことを保証し、
- そのインスタンスに対してどこからでもアクセスできるようにします。
- Singleton は、いわゆる "Gang of Four" による Creational Pattern
のひとつです。
- </para>
- <para>
- Singleton パターンを使って実装されることが多いのは、
- データベースクラスやロガー、フロントコントローラ、あるいは
- リクエストやレスポンスを表すオブジェクトです。
- </para>
-
- <example>
- <title xml:id="language.oop5.patterns.singleton.examples.basic">Singleton
の例</title>
- <programlisting role="php"><![CDATA[
-<?php
-class Example
-{
- private static $instance;
- private $count = 0;
-
- private function __construct()
- {
- }
-
- public static function singleton()
- {
- if (!isset(self::$instance)) {
- echo 'Creating new instance.';
- $className = __CLASS__;
- self::$instance = new $className;
- }
- return self::$instance;
- }
-
- public function increment()
- {
- return $this->count++;
- }
-
- public function __clone()
- {
- trigger_error('Clone is not allowed.', E_USER_ERROR);
- }
-
- public function __wakeup()
- {
- trigger_error('Unserializing is not allowed.', E_USER_ERROR);
- }
-}
-?>
-]]>
- </programlisting>
- <para>Singleton の挙動は、このようになります。</para>
- <programlisting role="php"><![CDATA[
-<?php
-$singleton = Example::singleton(); // "Creating new instance." と表示
-echo $singleton->increment(); // 0
-echo $singleton->increment(); // 1
-
-$singleton = Example::singleton(); // 既存のインスタンスを再利用
-echo $singleton->increment(); // 2
-echo $singleton->increment(); // 3
-
-// これらはすべて Fatal エラーとなります
-$singleton2 = new Example;
-$singleton3 = clone $singleton;
-$singleton4 = unserialize(serialize($singleton));
-?>
- ]]>
- </programlisting>
- </example>
- <warning xml:id="warn.singleton.controversy">
- <para>
- Singleton
パターンは、よく異論が出るパターンのひとつです。よくある批判は
- 「Singleton
はアプリケーションにグローバルな状態を導入してしまうし、
- Singleton とそれを使うクラスが密結合してしまう」というものです。
- その結果、目に見えない依存関係や予期せぬ副作用が発生し、
- テストや保守のしにくいコードが生まれてしまいます。
- </para>
- <para>
- さらに、こんな批判もあります。
- PHP のようなシェアードナッシング型のアーキテクチャで Singleton
を使うのは無意味だ。
-
だって、いずれにせよオブジェクトはリクエスト内でだけ一意になるのだから。
- それよりは、リクエストの開始時に Builder パターンや
- Factory
パターンを使って協調オブジェクトグラフを作ったほうがずっと簡潔ですっきりする」。
- </para>
- <para>
- Singleton は、"ソリッド" な OOP
設計規約やデメテルの法則にも違反します。
- Singleton はシリアライズできません。そのサブタイプを作ることも (PHP
5.3 より前のバージョンでは)
-
できないし、ガベージコレクションの対象にもなりません。そのインスタンスが
Singleton
- の静的属性として格納されるからです。
- </para>
- </warning>
- </sect2>
-
-</sect1>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:1
-sgml-indent-data:t
-indent-tabs-mode:nil
-sgml-parent-document:nil
-sgml-default-dtd-file:"~/.phpdoc/manual.ced"
-sgml-exposed-tags:nil
-sgml-local-catalogs:nil
-sgml-local-ecat-files:nil
-End:
-vim600: syn=xml fen fdm=syntax fdl=2 si
-vim: et tw=78 syn=sgml
-vi: ts=1 sw=1
--->