1

一部のオブジェクトの状態を表すリストを作成する場合、各オブジェクトにその状態を要求してリストを自分で変更する必要がありますか、それともオブジェクトにリストを与えてそれ自体を追加するように指示する必要がありますか?

ページに出力するためのテンプレートのリストを作成しています。フォーム要素では、このリストをキーと値のペアにまとめる必要があります。同僚から「教えて、聞かないで」にもっと注意を払うべきだと言われ、この問題に関してその原則を理解しようとしています。

TemplateListのインスタンスを作成し、各テンプレートにそれ自体をリストに追加するように依頼するというアプローチを採用しました。これにより、テンプレートはどの引数に渡すかを決定できますTemplateList::addTemplate()

class TemplateList {
    public $templates = array();

    public function addTemplate($id, $label) {
        $this->templates[$id] = $label;
    }

    public function getTemplates() {
        return $templates;
    }
}

interface TemplateInterface {
    public function addToTemplateList(&$templatelist);
}

class DiskTemplate implements TemplateInterface {
    public function addToTemplateList(&$template_list) {
        $template_list->addTemplate($this->name, $this->name);
    }
}

class DatabaseTemplate implements TemplateInterface {
    public function addToTemplateList(&$template_list) {
        $template_list->addTemplate($this->id, $this->name);
    }
}

使用例:

$template_list = new TemplateList;

// fetch $disk_templates and $db_templates

foreach ($disk_templates as $template) {
    $template->addToTemplateList($template_list);
}

foreach ($db_templates as $template) {
    $template->addToTemplateList($template_list);
}

別のアプローチでは、テンプレートにその状態を尋ね、その結果をテンプレートリストに追加します。

$template_list = new TemplateList;

// fetch $template

$template_list->addTemplate($template->propertiesForTemplateList());

どちらのアプローチにも利点はありますか?私が完全に考慮していない他の何かがありますか?

4

1 に答える 1

1

まず第一に、原則に少し間違いがあります: その「教えて、聞かないでください」:)。この原則とその他の原則に関する非常に優れた記事をここで見つけることができます. 基本的な考え方は、オブジェクトに質問してから何をすべきかを決定するのではなく、オブジェクトに何をすべきかを伝える必要があるということです。各オブジェクト (内部状態などに基づく) は、タスク (メッセージ送信) の処理方法を認識している必要があります。これは、適切に割り当てられた責任を維持するために重要です。オブジェクトに何かを要求し、別のオブジェクトで何をするかを決定する場合、1 つのオブジェクトの固有のロジックを多くのオブジェクトに広げていることになります。これにより、まとまりのあるオブジェクトがなく、機能を変更/テストするための単一の場所がないため、テストと保守が困難なコードが生成されます。ここで発生する 2 つ目の問題はカプセル化です。ほとんどの場合、オブジェクトの状態は非公開であり、後でアクションを実行するためにオブジェクトの状態を照会できるように、人々はそれを公開します。一般的な経験則として、私は臭いと考えています。あなたは(再び)オブジェクトの責任をシステムの残りの部分に広げているだけでなく、オブジェクトのカプセル化にも違反しているためです。ここでゲッター自体が悪いと言っているわけではないことに注意してください。他のオブジェクトが決定できるように状態を公開する必要がある場合は、間違った方向に進んでいる可能性があります。

さて、あなたのコードに行くと、最初のアプローチは完全に有効だと思います。リストに自分自身を追加する方法と、そのためにどのプロパティを使用する必要があるかを知っているのはオブジェクトだからです。責任を適切に割り当て、必要に応じて内部状態をカプセル化します。

HTH

于 2012-11-12T15:25:41.630 に答える