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

“每个动作/页面一个类”有什么模式吗?

  •  3
  • Kirzilla  · 技术社区  · 14 年前

    MVC是一个非常好的模式,但是有时把所有的东西都放到Controller的方法中是非常无聊的。控制器不断增长,需要时间来摆脱成千上万的代码行。有些人强烈建议将尽可能多的方法放入模型中,但我更喜欢保持模型干净(我不将面向控制器的方法放入模型中)。

    class Post_Add {}
    class Post_Remove {}
    class Post_View {}
    

    所有代码,这对于我们要放入的所有操作类都是通用的 class Post_Parent 并将其实例传递给动作构造函数。

    所以,采取行动看起来像。。。

    $parent = new Post_Parent();
    $action = new Post_Add($parent);
    $action->run();
    

    那么,我们有什么?

    • 每个动作都在不同的类中,所以 我们可以添加尽可能多的私有方法, 变量,我们想要的常量。
    • 所有公共代码都分为 Post_Parent )而且可以 可以从操作类访问。它

    这个想法值得活下去吗?有没有类似的设计模式?

    非常感谢。

    3 回复  |  直到 14 年前
        1
  •  0
  •   Gordon Haim Evgi    14 年前

    看一看这个 Transaction Script PageController 模式。事务脚本是最基本的域逻辑模式,适合于小型应用程序。PageController的目的是处理来自UI的输入。如果你想让它成为一个单一的命令,那没关系。你能做到的

    class PostAddController implements RequestHandler {
        public function handle($request) {
           $post = filter_input(INPUT_POST, 'post', FILTER_SANITIZE_SPECIAL_CHARS);
           $model = new PostAddTransactionScript;   
           $model->process($post);
           include 'postAddViewScript.php';
        }
    }
    

    PostAddTransactionScript然后将$postData写入数据库或它应该执行的任何操作。上面的简化示例仍然与MVC保持一致,因为它将模型逻辑保留在事务脚本中,将输入处理保留在表示层中。

    至于你的例子,我宁愿用 Strategy Pattern 并让后置父对象使用命令,而不是使用父对象的命令,例如。

    $commander = new PostCommander;
    $commander->setStrategy(new PostAddCommand);
    $commander->handle($_POST);
    

    无论如何,我同意其他人的观点,你的控制器应该很薄,模型应该做主要的工作。

        2
  •  1
  •   Øyvind    14 年前

    就我个人而言,我认为你所描述的模式从长远来看对你没有好处。如果您的控制器已经有了“数千行代码”,那么您就遇到了封装的一般问题,而为每个操作创建一个类只会将您的问题转移到另一个层。

    你的控制器应该是

        3
  •  0
  •   Adam Byrtek    14 年前

    我建议后退一点,想想为什么控制器会增长这么多。也许你可以进行重构,把一些共享组件提取到不同的模块中?也许您的逻辑中有一些代码应该放在模型或视图中?你用的模板系统好吗?

    将控制器拆分为更小的部分并不能解决根本问题,只能将其隐藏起来。