我现在似乎卷入了与该项目的另一位程序员的辩论,他认为这些观点没有道理。他提出了一个 PHP 看起来像这样的系统:

$draw = new Draw;
$nav = $draw->wideHeaderBox().
$draw->left().
    $draw->image().
        Image::get($image,60,array('id'=>'header_image')).
    $draw->imageEnd().
$draw->leftEnd().
$draw->left(10).
    '<div id="header_text">'.
        self::defaultSectionText().
    '</div>'.
$draw->leftEnd().

等等(顺便说一句,这是在控制器中)。现在他对此的论点实际上有一定道理,他声称如果需要重新设计,我们需要做的就是在一个地方更改 HTML,它会自动在各处更改。然而,出于某种原因,这种方法仍然让我感到不舒服,这种方法有什么优点吗?我的意思是除了不必手动重新输入 HTML 之外。

有帮助吗?

解决方案

HTML 节省时间很有用,但只有当它们直观且易于理解时才有用。必须实例化一个 new Draw 只是听起来不太自然。此外, wideHeaderBoxleft 仅对熟悉该系统的人才有意义。如果有的话怎么办 重新设计,就像你的同事所想的那样?如果 wideHeaderBox 变得很窄?您是否会更改 PHP 方法生成的标记(可能还有样式),但留下非常不准确的方法名称来调用代码?

如果你们只是 要使用 HTML 生成,您应该将其散布在视图文件中,并且应该在真正必要/有用的地方使用它,例如:

HTML::link("Wikipedia", "http://en.wikipedia.org");
HTML::bulleted_list(array(
    HTML::list_item("Dogs"),
    HTML::list_item("Cats"),
    HTML::list_item("Armadillos")
));

在上面的示例中,方法名称对于不熟悉系统的人来说实际上是有意义的。当你回到一个很少访问的文件并想知道你到底在做什么时,它们也会对你们更有意义。

其他提示

他使用的论点就是你需要的论点 意见。两者都会导致仅在一处更改它。然而,在他的版本中,您将视图标记与业务代码混合在一起。

我建议更多地使用模板化设计。在 PHP 中执行所有业务逻辑,设置页面所需的所有变量。然后让您的页面标记引用这些变量(并且不处理任何业务逻辑)。

你看过聪明吗? http://smarty.php.net

我过去也做过类似的事情,那是浪费时间。例如,您基本上必须为所有可以使用 HTML 编写的内容编写包装器,并且您会忘记一些事情。当您需要更改布局中的某些内容时,您会想“天哪,我忘了这一点......现在我必须编写另一个方法或添加另一个参数”。

最终,您将拥有大量生成 HTML 的函数/类,几个月后没有人会知道或记得如何使用它们。新的开发人员会因为你使用这个系统而咒骂你,因为他们在改变任何东西之前必须学习它。相比之下,了解 HTML 的人可能比了解抽象 HTML 绘图类的人多……有时您只需要亲自接触纯 HTML!

老实说,它看起来非常冗长且难以理解,并且某些代码看起来像是非常多的布局信息。

我们总是尝试尽可能地将逻辑与输出分开。然而,通常情况下,视图和数据紧密相连,两个部分都规定了另一个部分应该如何(例如,在一个简单的电子商务网站中,您可能决定要开始在每个产品旁边显示库存水平) ,这显然会涉及更改视图以为此添加适当的 html,以及计算股票价值的业务逻辑)。

如果维护 2 个文件来执行此操作的想法难以处理,请尝试将内容分为“收集数据”部分和“显示视图”部分,这样您就可以在不增加需要管理的文件数量的情况下获得大部分好处。

我总是发现直接使用 html 更容易。少了一个抽象层(html -> 实际网页/php 函数 -> html -> 实际网页)来处理,然后你就可以在 HTML 中工作了。

我真的认为“只需要在一个地方改变它”的事情在这种情况下是行不通的。这是因为当您想要更改函数的输出时,它们会很多次,但只在一处。当然,您可以使用参数,但很快您就会得到一些具有十几个参数的函数。恶心。

请记住,模板语言/系统通常允许您包含子模板,从而允许您拥有一些可重用的 html 块。

最重要的是,如果我刚开始在你们公司工作,到处都看到这样的代码,我的第一个想法就是,‘该死!再次需要一份新工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top