当太多 if-then-else 导致代码不可读时,如何遵守 Don't-Repeat-Yourself (DRY) 原则?

StackOverflow https://stackoverflow.com/questions/937225

我想遵守“不要重复自己”的原则,但有时当我将 PHP 与 HTML 和 CSS 一起编写时,如果我在不同的情况下重复使用相同的代码,我的代码很快就会有很多 if-那么-否则代码不容易维护。

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

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

有帮助吗?

解决方案

一个完整的框架,简而言之,我倾向于对内容做的(即使它包含逻辑)的它分离出来到文件,并使用另一个逻辑分析,将它们合并在一起(损坏它们)和然后评估之后模板逻辑。这chunkifies你的内容,并就共同状态块共享/重用。

此方式,每个最终模板缓冲器是可以在磁盘上或数据库存储离散的可重复使用的内容熔核扁平树。即使是一些简单的小解析器替换:

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

使用shared_page_header.txt有助于保持的东西分开。这也迫使你看看分离的担忧甚至在被嵌入在模板的逻辑。 管理,任何事物(是否是动态的),可重复使用的块总是要走的路。你的模板仅仅是字符串,直到评估,因此对待他们的共享组件合并成一个大脏串(TM),然后进行评估。

<强>好运

其他提示

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

避免重复自己的建议:

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

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

如果您在大量 if/else 语句和代码可读性不佳方面遇到困难,您可以执行以下操作:

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

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) 分开将有助于您在项目开始变得非常复杂时不会不知所措。最好不要混合!:)

祝你好运!

你的问题的第一句是问题,海事组织。你真的不应该与你的观点(即HTML和CSS)来混合代码。有几个PHP的MVC框架,这将有助于你不能做到这一点。 Zend框架是相当不错的,但也有其他人。

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

现在,我可能不是那么熟悉执行使用PHP OOP的概念,但重构这些嵌套的if-else语句,并把他们在一个良好命名的功能有很大帮助跟上DRY原则。除此之外,与DRY原则坚持不使你的代码维护。

通过示例脚本文件,我们可以更容易地指出您出错的地方,但是有些事情可能会或可能不会帮助您,具体取决于您想要实现的目标:

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

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

  • 使用支持代码折叠的IDE

祝你好运

如果语句被认为是逻辑语句,它们应在视图中避免尽可能因为它们违反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';
    }
}

此代码是可重复使用的,可测试,将保持代码干:)

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