【问题标题】:How do I handle a growing Controller Class?如何处理不断增长的控制器类?
【发布时间】:2012-05-29 18:27:08
【问题描述】:
$object_cin = new CIO( ); 
$object_cin->invoke( $_POST[ 'model' ] );

class CIO
{
    private function invoke( $model )
    {
        switch( $model ) 
        {
            case 'user_try':
                $model = new MUserTry();  
                $this->send( $model->invoke( 1 ) );
                break;
            case 'user_new':
                $model = new MUserNew( new IUniversals() , new IText(), new IMessage() ); 
                $this->send( $model->invoke() );
                break;
            case 'user_exist':
                $model = new MUserExist( new IUniversals() , new IText(), new IMessage() );  
                $this->send( $model->invoke() );
                break;
            case 'tweet':
                $model = new MTweet( new IUniversals() , new IText(), new IMessage() );
                $this->send( $model->invoke() );
                break; 
            default:
                echo "Incorrect Ajax Type provided";
        }
    }
    private function send( $string )
    {
        echo "|P|" . $string;
    }
}

【问题讨论】:

  • 为什么不让你的案例成为一个类方法(当它不存在时有一个处理程序)?
  • 处理程序不存在时是什么意思?
  • 类似if(!method_exists('calledmethod')){ header('Location:404.php');exit;}
  • 我最终摆脱了依赖注入模式和工厂模式......将这个类减少了一半......我还把文件调用拉到另一个类......我仍然没有'不明白你在说什么......你是说使用标题来进行类/对象调用吗?

标签: php model-view-controller library-design


【解决方案1】:

它当然会增长,并且变得无法维护。

首先,通用Control 类是什么?一个网站应该有多个控制器(我假设它在某种程度上与 MVC 相关,因为这就是术语“控制器”的来源),通常每个“页面”有 1 个控制器(粒度可能会改变,取决于架构模式) .

下一个问题是 switch 声明。每个case 都应该在控制器中有一个单独的方法。由于设计错误,您最终会重复部分代码。

【讨论】:

  • 没关系...我删除了除 ajax 调用之外的所有调用...请查看我发布的新代码...非常适合一个文件...文件调用由另一个类处理。
【解决方案2】:

您直接遇到了Fat Controller 反模式。

控制器的意义在于胶合逻辑。它将请求(GET、POST、WHATEVER)中的数据传递给任何知道如何处理它的模型,格式化模型返回的任何结果,并将其分配给要渲染的视图。

至少这是应该发生的。

开发人员经常用应用程序逻辑填充控制器,而让模型仅是用于访问数据库的 CRUD 对象。这不是开发 MVC 应用程序的方法。模型应该是“领域专家”。除了存储应用程序正在使用的数据之外,它们还意味着知道该数据的含义、给定数据集的有效行为等等。这使得模型可重用、松散耦合和高度一致。您可以毫无困难地使用具有许多不同视图/控制器组合的丰富模型。

如果应用程序逻辑位于控制器中,那么您将无法使用该控制器来执行应用程序逻辑,或者更糟糕的是,您最终会将相同的代码复制并粘贴到不同的控制器中。

如果控制器充满了应用程序逻辑,那么这肯定表明您需要重新考虑设计和重构

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 2021-06-24
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2018-07-22
    相关资源
    最近更新 更多