在Symfony 1.4中重构代码

时间:2011-01-24 06:46:10

标签: refactoring symfony-1.4

具体来说,例如,重构代码以在模型类中使用的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

在MVC模式中,模型应仅操纵存储在数据库中的数据以及与之相关的所有行为。所以:

  • 如果你有一个动作(部分 控制器层)正在做很多事情 对象操纵,尝试移动 对方法或组的这种行为 方法所以数据处理逻辑 留在模型层中,离开 控制器尽可能简单 (它应该只操纵数据和视图之间的关系)
  • 同上,视图应该只显示不处理它的信息!

现在,我通常应用的重构过程是:

  1. 找到似乎相关的代码
  2. 尝试创建一个可以表示其行为的函数(查找参数可能性)。有时你最终会得到像Template Method DesignPattern这样的东西(在这里你应该测试你的代码,看它是否能做到它应该做的)
  3. 用函数调用替换原始代码(或者在这种情况下,调用某个类的实例/静态方法)(再次检查功能)
  4. 这个过程对任何其他层有一些区别:

    • 在Controller层中,您将需要使用组件和操作而不是静态/实例方法。
    • 在视图层中,您应该创建部分,插槽和模板来重构它们。

    一个真实的例子:你有一个查询,它将检查具有给定'name'字段值的特定记录的存在,并且你想要全部使用它,然后:

    1. 检查您处理的信息类型。在这种情况下是一个PeerStructure,它应该以某种方式根据表值过滤表结果。如果你检查我说:“Peer ...”,“Table”两次,所以我想在Peer类上创建一个处理我想要过滤的值的静态方法,比方说ApplicationUser。
    2. 现在我知道我要建立什么,检查可能存在或不存在的参数。在这种情况下,“名称”是一个可能的参数(它也可以是一个标准)。您还应该考虑要返回的值。当我们讨论对等类的静态方法时,我猜有两个可能的值:Criteria或ResultSet(我的意思是一组结果而不是结构)。
    3. 最后,构建静态方法。

      public static function countUsername($ username) {   $ c = new Criteria();   $ C->添加(ApplicationUserPeer :: NAME,$名称,标准:: EQUAL);   return ApplicationUserPeer :: doCount($ c); }

    4. 现在你有了你的函数来替换旧逻辑以使用新方法。假设您需要检查一个名称是否可供尝试注册的新用户使用。在某些操作中,您应该有一段代码如下:

       public function executeCreateUser(sfWebRequest $request)
       {
        [...]
        $c = new Criteria();
        $c->add(ApplicationUserPeer::NAME,$request->getParameter('username'),Criteria::EQUAL);
        ;  
        if(ApplicationUserPeer::doCount($c) == 0)
        {
          //Then do some stuff that saves
        }
        [...]
       }
      

      使用您的功能后,您的代码可能如下所示:

       public function executeCreateUser(sfWebRequest $request)
       {
        [...]
        if(ApplicationUserPeer::countUsername($request->getParameter('username')) == 0)
        {
          //Then do some stuff that saves
        }
        [...]
       }
      

      这就是行动的过程,请记住,你总能进行更多的重构。例如,如果您考虑我为此示例选择的参数及其与功能的关系,您还可以添加“CriteriaMethodParameter”,其默认值为Equal,但如果您现在需要所有带字母A的用户名,则可以设置CriteriaMethodParameter,只需更改参数即可随时随地使用。