重构我的表单的最佳方法(程序到oop?)

时间:2009-12-17 22:50:36

标签: php oop refactoring

(注意:这与this question有关,但我认为它可以写得更清楚,所以我再次尝试 - 我的更新仅在有限的范围内有所帮助。)

我继承了一些代码,这些代码创建了一个包含大量部分的复杂表单,以及许多可能的视图,具体取决于许多参数。我已经和它一起工作了一段时间,最后有机会考虑做一些重新分解。它目前是在程序上编写的,有一堆看起来像这样的函数:

get_section_A ($type='foo', $mode='bar', $read_only=false, $values=array()) {
    if ($this->type == 'foo') { 
        if ($this->mode == 'bar') { }
        else { }
    } else { }
}

传递这些参数是令人讨厌的,所以我开始编写这样的类:

class MyForm {
    public $type;          // or maybe they'd be private or 
    public $mode;          // I'd use getters and setters 
    public $read_only;     // let's not get distracted by that :)
    public $values;
    // etc.

    function __constructor ($type='foo', $mode='bar', $read_only=false, $values_array=array()) {
        $this->type = $type;
        // etc.
    }

    function get_sections () {
        $result = $this->get_section_A();
        $result .= $this->get_section_B();
        $result .= $this->get_section_C();        
    }      

    function get_section_A() { 
        if ($this->type == 'foo') { }
        else { }
    }
    function get_section_B() {}
    function get_section_C() {}
    // etc.
}

问题是程序功能被分成几个文件(对于部分组),如果我将它们全部组合成一个单独的类文件,我会看2500行,感觉很笨重。我想到了一些解决方案:

  1. 继续使用讨厌的参数,并用我的时间做其他事情:)
  2. 拥有2500行文件
  3. 为每组部分创建一个单独的类,以某种方式“知道”这些参数的值
  4. 如果我做#3,我想到了两种基本方法:

    1. 将MyForm对象作为单个参数传递
    2. 创建一个FormSectionGroup类,其中包含在MyForm中设置的静态属性,然后在组文件中,每个类都会扩展FormSectionGroup并自动访问这些参数的当前值。
    3. 1)可能更容易设置,一旦我在get_section_A()内,我是说$this->type还是$myForm->type并不是那么不同,但它并不完全是OOP 。 (事实上​​,我可以在不改变OOP方法的情况下做到这一点。)

      还有其他方法吗?关于哪个更好的想法?

4 个答案:

答案 0 :(得分:1)

我只想写一个如何做到这一点的冗长解释,但我感觉有点懒。然而,我确实有足够的精力指向你从zend框架到Zend_Form。可能有一些依赖项使其正常工作(Zend_View,Elements,Decorators),但是一旦你拥有它们,它就可以非常优雅地处理这种情况。

答案 1 :(得分:0)

当我在上一个问题中发帖时,我想到了这个问题 - 这个问题充满了decorator pattern

但是,这将是一项不小的任务。但是一旦你完成它,我认为你会有一种惊人的满足感/成就感。

答案 2 :(得分:0)

最近做了很多Cocoa编程,我倾向于用MVC模式(模型 - 视图 - 控制器)术语来查看。因此,我将该表格视为其各个部分的控制器。

每个部分对象应负责跟踪其状态,值以及是否应显示它。或者确切地说,section_model将处理值(默认值,验证等),section_view将负责显示(或不显示)部分的部分,section_controller将发送跟踪部分的状态并将结果报告给表单对象。

表单对象应该实例化段控制器,告诉它们显示或隐藏等等,并获取状态报告。表单对象,实际上是一个控制器,然后可以决定表单何时完全填写。您可能有一个form_model对象来保存收集的数据,或者您可能更喜欢使用section_model对象。需要一段时间来了解不同对象如何交互,但我从经验中知道,如果你在设计对象时有纪律(关键是:什么是对象的责任,什么不是),你会获得更好的概述和您的代码将更容易升级。一旦你发现改进开始自然而然,你就走在了正确的轨道上。

答案 3 :(得分:0)

如果你有时间做#3,从长远来看,你可能会是最开心的。就个人而言,我没有时间在我的工作中经常重构那个学位,所以我可能会被迫选择#1。 #2听起来像是对我来说两个世界中最糟糕的。很多工作都是为了获得你不喜欢的代码。