0

我在程序 PHP 中编写了一个“评论”和“回复”系统的工作实现。我想学习 OOP,所以我将按照 SOLID 原则将我的旧代码转换为 OOP。在我正在阅读的一本书中,作者说一个班级应该做“一件事”并且只做一件事。

在我的评论和回复系统中,我动态生成了几个具有相同类名但不同“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>

其中一些divsphotoContainerdiv 一样立即关闭。此外,commentBox在里面添加表单后,div 也会立即关闭。我看到的问题是,在将content所有内容添加到其中之后,该 div 已关闭,commentReplyContainer. 因此,如果我遵循 SOLID 原则将其转换为 OOP 代码,我应该有一个生成 div 的类content,另一个生成 div 的类photoContainer等等?如果我使用该方法,那么我将不得不编写一个生成contentdiv 但不关闭它的类,生成photoContainer具有预期内容的 div 并关闭它,然后有一个名为 last 的类将关闭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. 表示回复的类(链接到评论,也链接到ValueObject
  3. 聚合评论和回复的类(如ArrayObject,但仅限于一种实例),很像教义集合
  4. 为给定的一组评论和回复返回(和操作)dom 对象(如本例)的构建器实现

我给出的只是一个例子。例如,您应该看一下Zend/Form实现和 API,以了解如何使用一种很好的方式来操作和创建元素。

您应该不惜一切代价避免使用执行“echo”语句的方法,这使得重用结果非常困难。

如果您想学习面向对象编程,我建议您保持创建大量类并阅读(和使用)一些现有实现(正确实现设计模式)的强烈意愿,这样您就可以拥有更好地了解对象及其交互的强大程度,因此在对它有一个很好的了解之后,您可以通过创建新类来执行您想要的操作来利用这种能力。

面向对象编程试图以与其他范式截然不同的方式解决问题。设计模式通常是如何使用对象解决这些问题的构建块,确保您通过它们对如何构建事物有更好的了解;否则,您可能会将自己置于将算法放入方法的循环中,而无需利用 OO 必须提供的真正糖。

于 2013-10-12T16:59:30.720 回答