代码之家  ›  专栏  ›  技术社区  ›  Drew

陷入常规,需要帮助突破到下一个层次

  •  8
  • Drew  · 技术社区  · 16 年前

    我在一个不起眼的网站上工作,我自学了一些普通的PHP技能,目前的界面结构是这样的:

    <?php
      if (A) {
        $output = someFunc(A);
      } else if (B) {
        $output = anotherFunc(B);
      } else if (C) {
        $output = yetAnotherFunc(C);
      } else {
        $output = 'default stuff';
      }
    ?>
    <html template top half>
    
    <?php echo $output; ?>
    
    </html template bottom half>
    

    一开始效果还不错,而且看起来组织得很好,但是所需的功能增加了10倍,而且很快就变成了一个无法维护、令人尴尬的混乱局面,我不知道如何摆脱它。

    我觉得针对每种情况调用的函数都写得相当好,而且非常集中,但是对于如何处理用户和创建布局并处理返回的函数之间的中间步骤,我感到不知所措。

    我觉得MVC是一种解决方案?但是我很难理解如何从这里到那里。。。

    对于以上代码可能引发的任何头痛或不愉快的记忆,我深表歉意。谢谢你抽出时间。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Brent Baisley    16 年前

    你似乎已经像很多人一样开始了,一个大的if和/或case声明,并且继续增长。所有这些“如果”检查都需要时间。MVC绝对是一个很好的方法,但是有很多方法可以实现它。我还建议您考虑前端控制器的设计模式,它通常与MVC一起使用。

    改变操作方式的一种方法是使用关联数组切换到已定义的“操作”列表。把你的函数改成includes。然后可以有多个函数、变量和其他处理代码。

    $actions = array(
    'A'=>'action1.php',
    'B'=>'action2.php',
    'C'=>'action3.php',
    'default'=>'action_default.php'
    );
    if ( isset( $actions[ $_GET['action'] ] ) ) {
        include( $actions[ $_GET['action'] ] );
    } else {
        include( $actions['default'] );
    }
    

        2
  •  4
  •   Unoti    16 年前

    在任何面向对象的代码中,每当您看到一系列if/else或case语句时,通常最好由对象层次结构来处理,而不是由一堆if/else/else来处理。

    在您的特定情况下,您可能有3个不同的类来表示A、B和C。只需拨打一个$obj->doit()方法。A、 B和C都有doit()方法的不同实现。

    如果你想摆脱常规,我建议你读一本关于设计模式的书。以下是一些PHP设计模式的示例: http://www.fluffycat.com/PHP-Design-Patterns/

    • 命令。
    • 工厂。

    上面的链接中提供了这些模式和PHP示例的描述。我确实建议在其他地方阅读更多关于设计模式的内容,但是这个链接有PHP示例。

    -战略。这就像是一个曲奇饼切割器或疯狂的Libs风格的东西。您可以设置执行函数所涉及的基础知识。如果需要,用户(使用基类的程序员)可以重写某些事情,但是完成这些工作的基础都已经就绪。示例:我们需要执行一个业务流程。一般来说,这包括启动一个事务,做“肉”的工作,然后执行清理和日志记录。在这里使用stragey/cookie-cuter模式似乎有些过分,但通常不是这样:即使代码的“肉”中抛出了错误或异常,也需要记住进行清理。通过使用Strategy/cookie cutter模式,您可以用最少的样板/重复代码实现所有这些。

    下面的maschka推荐使用Smarty,这是一个合理的想法。一个更好的主意,取决于您的应用程序,可能是使用MVC框架。如果您致力于坚持使用PHP,那么我推荐CakePHP并在这方面取得了巨大的成功。它可以帮助您以一种非常好的方式布局代码,并帮助您避免麻烦。

        3
  •  0
  •   maschka    16 年前

    一般性建议:你看过 Smarty