2

getSystemInfo()アプリケーションにメソッドを持つ SystemInfoFactory クラスがあります。

/**
 * Returns SystemInfo object based on which OS
 * server uses
 *
 * @return SystemInfoInterface SystemInfo object
 */
public function getSystemInfo()
{
    $os = $this->getOS();

    $systemInfo = null;

    switch ($os) {
        case "Linux":
            $systemInfo = new LinuxInfo();
            break;
        case "Darwin":
            $systemInfo = new OSXInfo();
            break;
        case "Windows":
            $systemInfo = new WindowsInfo();
            break;
    }
    return $systemInfo;
}

そのため、ホスト システムに応じて適切なオブジェクトを選択します。現在、各「情報クラス」はSystemInfoインターフェイス(getArchitecture、getCPUなどのメソッド)を実装していますが、ご覧のとおり、返されたオブジェクトが実際にインターフェイスを実装しているかどうかをコードのどこにもチェックしていません。$systemInfo選択したオブジェクトがそれを返す前にそれを実装しているかどうかを確認することは「良い習慣」と見なされますか? 明らかに必須ではありませんが、誰かがこのアプリケーションを拡張し (たとえば BSD サポートを追加する)、すべてのメソッドの実装を忘れた場合、デバッグが難しくなる可能性があります。

4

2 に答える 2

2

絶対に良い練習になります。メソッドが のインスタンスを返すことを docblock で定義していますSystemInfo。あなたの発信者はそれに頼ることができるはずです。これはあなたのコードでは簡単です:

/**
 * Returns SystemInfo object based on which OS
 * server uses
 *
 * @return SystemInfoInterface SystemInfo object
 */
public function getSystemInfo()
{
    $os = $this->getOS();

    $systemInfo = null;

    switch ($os) {
        case "Linux":
            $systemInfo = new LinuxInfo();
            break;
        case "Darwin":
            $systemInfo = new OSXInfo();
            break;
        case "Windows":
            $systemInfo = new WindowsInfo();
            break;
        default:
            throw new \RuntimeException('System not supported');
            break;
    }

    if (!$systeminfo instanceof SystemInfo) {
        throw new \RuntimeException('Invalid SystemInfo object returned');
    }

    return $systemInfo;
}

このメソッド呼び出しから例外をスローすることを宣言してください。ここでの例外により、コードの後半で「未定義のメソッド」エラーを追跡する必要がなくなり、何が起こっているのかが非常に明確になります。

于 2013-03-05T14:16:42.723 に答える
1

ここでのキーワードはダックタイピングだと思います。オブジェクトのインターフェースは、祖先や実装されたインターフェースではなく、メソッドと属性によって定義されます。

これを見てください:http://en.wikipedia.org/wiki/Duck_typing

PHP に戻る: オブジェクトがインターフェイスを実装しているかどうかをチェックしなくても、それは完全に有効であり、悪いスタイルではありません。コードがクラッシュした場合、クラスの実装者を責める必要があります。コードがめちゃくちゃだと面倒だと思いますif ($obj instanceof FancyInterface) {

于 2013-03-05T14:21:09.430 に答える