1

我想坚持 Don't-Repeat-Yourself 原则,但有时当我将 PHP 与 HTML 和 CSS 一起编写时,如果我在不同的情况下重复使用相同的代码,我的代码很快就会有很多 if- then-else 代码不容易维护。

如果使用Smarty这个模板引擎,这可能是一个更大的问题,因为大多数代码编辑器不会匹配{if} {else} {/if} 所以程序员需要直观地寻找匹配的标签,并不容易当有 3 或 4 层嵌套 {if} {else} {/if} 时。

在这种情况下,有没有办法坚持 DRY,但仍然有良好的可维护代码?

4

6 回答 6

4

只是为了让我们有更多的信息.​​.....你用什么程序来编写你的代码?

不要重复自己的提示:

使用某种模板。这样做可以使您不必重复代码以在每个页面中显示内容。IE 如果您有一个有 20 个页面的站点并且您决定更改布局,那么您不希望必须经历然后更改所有 20 个页面。

使用函数。如果您有执行特定任务的代码,请不要在整个程序/页面中多次编写该代码。创建一个函数,然后在需要执行该任务的每个位置调用它。这样,如果您需要进行更改,您只需修改一个函数,而不必搜索您的代码来查找您执行该任务的每个位置。如果您了解类和方法(方法是类中的函数),对于许多任务,这会更好,因为它为您提供数据封装并允许您将相关函数组合在一起,以便您将来可以包含该类根据需要进行项目。

如果您在处理大量 if/else 语句时遇到困难并且代码可读性较差,您可以采取以下措施:

1. 考虑尝试新的编辑器。代码折叠是必须的。一些编辑器也有垂直线来突出和匹配缩进的代码,这样你就知道什么是什么。如果您想要一个像样的免费编辑器,我会推荐 Notepad++,因为它具有这两个功能(只需 google 即可,我无法在此处添加链接)。

2. 您可以使用一些技术来减少您拥有的嵌套 if 语句的数量......

示例(此代码):

if (item1 == true) {
   if (item2 == true) {
      item3 = 5;
   }
   else {
      item3 = 10;
   }
}
else {
   if (item2 == true) {
      item3 = 15;
   }
   else {
      item3 = 20;
   }
}

也可以展平为:

if (item1 == true && item2 == true) {
   item3 = 5;
}
else if (item1 == true && item2 == false) {
   item3 = 10;
}
else if (item1 == false && item2 == true) {
   item3 = 15;
}
else {
   item3 = 20;
}

因此,如果您有 3 或 4 层嵌套的 if/else 并且您想将它们展平,您可能会发现您的代码更易于使用多个参数,例如上面的。它做同样的事情,只是你做这件事的偏好问题。

试着不要混合你的逻辑(我假设 PHP)和你的显示(我假设 HTML/CSS)。这并不总是容易做到的,但是使用模板和 css 是可能的。让我给您一个实际示例,说明如何在将用户名显示为欢迎消息的主页上执行此操作。

内联 PHP(尽量避免):

<html>
   <body>
      <?php
      if ($logged_in == true) {
         echo "Welcome ",$user->name(),"!";
      }
      else {
         echo "Welcome Guest!";
      }
      ?>
   </body>
</html>

逻辑与显示分离(更好):

<?php
if ($logged_in == true) {
   $greetingMessage = "Welcome ",$user->name(),"!";
}
else {
   $greetingMessage = "Welcome Guest!";
}
?>

<html>
   <body>
      <?php echo $greetingMessage; ?>
   </body>
</html>

^ 将逻辑与视图 (HTML) 分开将有助于您在项目开始变得非常复杂时不会不知所措。最好不要混合!:)

祝你好运!

于 2009-06-02T04:03:40.970 回答
3

由于缺乏完整的框架,我倾向于对内容(即使它包含逻辑)做的是将其分离到文件中并使用另一个逻辑评估将它们合并在一起(对它们进行处理),然后评估模板逻辑。这会将您的内容分块,并使块在公共状态下可共享/可重用。

这样,每个最终模板缓冲区都是离散的可重用内容块的扁平树,您可以将其存储在磁盘或数据库上。甚至像一个小解析器这样简单的东西也可以替换:

<h1>{{insert:shared_page_header}}</h1>

Withshared_page_header.txt有助于将事物分开。即使在嵌入在模板中的逻辑中,它也迫使您查看关注点的分离。任何东西(动态或非动态)的可管理、可重复使用的块总是要走的路。您的模板在评估之前只是字符串,因此将它们视为合并到 big-dirty-string(TM) 中的共享组件,然后进行评估。

祝你好运

于 2009-06-01T23:03:46.840 回答
0

你问题的第一句话就是问题,IMO。您真的不应该将代码与您的视图混合在一起(即 HTML 和 CSS)。有几个 PHP MVC 框架可以帮助您避免这样做。Zend 框架相当不错,但也有其他框架。

如果您不想使用框架,那么我建议重构您的页面以不使用这样的代码并在后端调用对象。快速混合您的代码和视图变得无法在任何语言中维护,而不仅仅是 PHP。

于 2009-06-01T23:04:15.717 回答
0

现在我可能不太熟悉使用 PHP 实现 OOP 概念,但是重构那些嵌套的 if-else 语句并将它们放在一个命名良好的函数中有助于跟上 DRY 原则。此外,坚持 DRY 原则确实使您的代码可维护。

于 2009-06-01T23:04:34.890 回答
0

使用示例脚本文件,我们可以更容易地指出您出错的地方,但是根据您要实现的目标,有些事情可能对您有帮助,也可能对您没有帮助:

  • 看看控制结构的替代语法。有些人在编写主要包含 HTML 的文件时更喜欢使用这种风格,而 PHP 仅用于决定要输出哪些 HTML 部分。

  • 将可重用的代码部分拆分为以后可以包含的文件,即。header.php、footer.php 等

  • 使用支持代码折叠的 IDE

祝你好运

于 2009-06-02T00:11:37.093 回答
0

如果语句被认为是逻辑语句,则应在视图中尽可能避免,因为它们违反了 MVC 原则。

改为查看助手,例如:

class LoggedUsernameHelper
{
    protected $user;

    public function __construct(SomeUserObject $user)
    {
        $this->user=$user;
    }

    public function __toString()
    {
        return $user->isLogged() ? sprintf('Welcome %s', $user->getUsername()) :
            'Welcome guest';
    }
}

这段代码是可重用的、可测试的,会让你的代码保持干枯:)

于 2013-02-10T21:59:22.340 回答