按照SOLID原则将过程PHP转换为OOP

时间:2013-10-12 16:05:56

标签: php oop solid-principles

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

在我的评论和回复系统中,我生成了几个" div"元素动态地使用相同的类名但不同的" id' s"。我可以看到here的一个例子。

我想将我的代码分解为函数,以便我可以更轻松地维护它,但是我无法理解执行此操作的最佳方法。例如,我有几个嵌套的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>

有些divs会像photoContainer div一样立即关闭。此外,commentBox div在内部添加表单后立即关闭。我看到的问题是content div在其中添加了所有内容后关闭,commentReplyContainer也是如此。所以,如果我遵循SOLID原则将其转换为OOP代码,我应该有一个生成content div的类,另一个生成photoContainer div的类,依此类推?如果我使用该方法,那么我将不得不编写一个生成content div的类,但不关闭它,生成具有预期内容的photoContainer div并关闭它,然后有一个被调用的类最后这将关闭content div。我是否正确,因为这是我能够以我想要的方式嵌套我的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();

我是在正确的轨道上还是我的理解完全错了?也许有一种更好的方式,我不知道有人可以指出。我希望我能够很好地解释自己,理解我的要求。

1 个答案:

答案 0 :(得分:0)

当您根据SOLID原则查看问题时,您必须以抽象形式查看它。根据您的问题(在评论和回复的HTML中呈现),我会想到几件事:

  1. 表示评论的类(可能是ValueObject模式实现)
  2. 表示回复的类(链接到评论,还有ValueObject
  3. 聚合评论和回复的类(如ArrayObject但仅限于允许一种实例),非常类似于doctrine collections
  4. builder实现,用于返回(并操纵)dom objects(如this example)给定的一组评论和回复
  5. 我给的只是一个例子。例如,查看Zend/Form实现和API,以了解如何操作和创建元素的好方法。

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

    如果你想学习面向对象的编程,我会建议你坚持创建很多类的强烈意愿,然后去阅读(和使用)一些现有的实现(正确的实现design patterns因此,您可以更好地了解对象及其交互的强大程度,因此在了解它之后,您可以通过创建新类来执行您想要的操作来利用该功能。

    面向对象编程尝试以比其他范例非常不同的方式解决问题。 Design patterns通常是如何使用对象解决这些问题的基石,确保您通过它们更好地了解如何构建事物;否则你可能会把自己放在将算法放入方法的循环中,而不是利用OO提供的真正的糖。