0

手続き型 PHP で「コメント」および「返信」システムの実用的な実装を作成しました。OOP を学びたいので、古いコードを SOLID の原則に従って OOP に変換します。私が読んでいる本の中で、著者は、クラスは「1つの」ことを1つだけ行うべきだと言っています。

私のコメントと返信システムでは、同じクラス名で「id」が異なるいくつかの「div」要素を動的に生成します。私が生成しているものの例は、ここで見ることができます。

コードをより簡単に保守できるように、コードを関数に分割したいと考えていますが、これを行う最善の方法を理解するのに苦労しています。たとえば、ネストされた div がいくつかあります。

<div class="content">
    <div class="photoContainer" id="1"> <img src="http://placekitten.com/200/200" /> </div>
        <div class="commentReplyContainer" id="1">
            <div class="commentBox" id="1">
                <form method="post">
                    <textarea name="comment"></textarea>
                    <input type="submit" />
                </form>
            </div>
            <div class="commentEven">Hello I am a comment!</div>
            </div>

</div>



<div class="content">
    <div class="photoContainer" id="2"> <img src="http://placekitten.com/200/300" /> </div>
        <div class="commentReplyContainer" id="2">
            <div class="commentBox" id="2">
                <form method="post">
                    <textarea name="comment"></textarea>
                    <input type="submit" />
                </form>
            </div>
            <div class="commentEven">Hello I am another comment!</div>
            </div>

</div>

divdivsのようにすぐに閉じられるものもあります。photoContainerまた、commentBoxフォームを内部に追加した直後にdivが閉じられます。私が目にする問題はcontent、すべてのコンテンツがその中に追加された後に div が閉じられ、commentReplyContainer. したがって、SOLID の原則に従ってこれを OOP コードに変換する場合、div を生成するクラス、contentdiv を生成する別のクラスなどを用意する必要がありphotoContainerます。そのメソッドを使用する場合、contentdiv を生成するが閉じないクラスを作成しphotoContainer、予想されるコンテンツで div を生成して閉じ、最後に呼び出されてcontentdiv を閉じるクラスを作成する必要があります。これが、div を希望どおりにネストできる唯一の方法であるため、正しいですか?

<?php

class CreateCommentSystem {

    public function generateContentDiv(){
    $content = <<<EOF
        <div class="content" style="background-color: #302058; width: 100px; height: 200px">
EOF;
        echo $content;
    }

    public function generatePhotoContainer(){
    $photoContainer = <<<EOF
        <div class="photoContainer" style="background-color: #df5320; width: 40px; height: 20px"> </div>
EOF;
        echo $photoContainer;
    }

    public function closeContentDiv() {
        $closeContentDiv = <<<EOF
            </div>
EOF;
        echo $closeContentDiv;
    }
}

?>

次に、次のように実行します

$divs = new CreateCommentSystem;
$divs->generateContentDiv();
$divs->generatePhotoContainer();
$divs->closeContentDiv();

私は正しい道を進んでいますか、それとも私の理解は完全に間違っていますか? たぶん、誰かが指摘できることに気付いていない、もっと良い方法があるかもしれません。私が求めていることを理解していただけるよう、十分に説明したことを願っています。

4

1 に答える 1

0

SOLID の原則に基づいて問題を見るときは、抽象的な形で問題を見る必要があります。あなたの問題(コメントと返信のHTMLでのプレゼンテーション)に基づいて、いくつかのことを考えます:

  1. コメントを表すクラス (おそらくValueObjectパターンの実装)
  2. Reply を表すクラス ( Comment とValueObjectにリンク)
  3. コメントと返信を集約するクラス ( ArrayObjectに似ていますが、1 種類のインスタンスのみを許可するように制限されています) 。doctrine コレクションによく似ています。
  4. コメントと返信の特定のグループのdom オブジェクト(この例のように) を返す (および操作する)ビルダー実装

私が挙げたのはほんの一例です。たとえば、Zend/Formの実装と API を調べて、要素を操作および作成する優れた方法を理解する必要があります

「echo」ステートメントを実行するメソッドを持つことは絶対に避けてください。これにより、結果の再利用が非常に難しくなります。

オブジェクト指向プログラミングを学びたい場合は、多くのクラスを作成する強い意志を持ち、いくつかの既存の実装 (設計パターンを適切に実装する) を読んで (そして使用して) 行くことをお勧めします。オブジェクトとその相互作用がどれほど強力であるかをよりよく理解できるので、それについて良い考えを持った後、新しいクラスを作成してその力を活用して、必要なことを実行できます。

オブジェクト指向プログラミングは、他のパラダイムとは非常に異なる方法で問題を解決しようとします。通常、デザイン パターンは、オブジェクトを使用してこれらの問題を解決する方法の構成要素です。物事を構造化する方法についてより良いアイデアを得るために、それらを確認してください。そうしないと、オブジェクト指向が提供する本当の砂糖を活用せずに、メソッド内にアルゴリズムを配置するというループに陥ってしまうでしょう。

于 2013-10-12T16:59:30.720 に答える