0
$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;
    }
}
4

2 回答 2

1

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

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

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

于 2012-05-29T18:42:02.427 回答
1

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

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

至少这是应该发生的。

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

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

如果控制器充满了应用程序逻辑,那么这是一个明确的信号,表明您需要重新考虑您的设计和重构

于 2012-05-29T18:42:22.997 回答