php - 重构我的表单的最佳方法(面向 oop 的程序?)

标签 php oop refactoring

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

我继承了一些代码,这些代码创建了一个复杂的表单,其中包含许多部分和许多可能的 View ,具体取决于大量参数。我已经使用它一段时间了,终于有机会考虑进行一些重构。它目前是按程序编写的,具有如下所示的一堆功能:

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. 为每组部分创建一个单独的类,以某种方式“知道”这些参数的值

如果我做#3,我想到了两种基本方法:

  1. 将 MyForm 对象作为单个参数传入
  2. 创建一个具有在 MyForm 中设置的静态属性的 FormSectionGroup 类,然后在组文件中,每个类都将扩展 FormSectionGroup 并自动访问这些参数的当前值。

1) 可能更容易设置,一旦我在 get_section_A() 里面,无论我说 $this->type 还是 $myForm ->type 并没有什么不同,但它不完全是 OOP。 (事实上​​ ,我可以在不真正更改为 OOP 方法的情况下做到这一点。)

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

最佳答案

我最想写一篇关于如何做到这一点的冗长解释,但我觉得有点懒惰。然而,我确实有足够的精力将你指向Zend_Form来自 zend 框架。可能有一些依赖项使其正常工作(Zend_View、Elements、Decorators),但一旦有了它们,它就会非常优雅地处理这种情况。

关于php - 重构我的表单的最佳方法(面向 oop 的程序?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1925142/

相关文章:

java - http 请求免受 Android 攻击

java - 使用不同的输入实例化一个类

java - 简单工厂与工厂方法

java - 重构部分类和循环依赖

ios - 当我重命名属性名称时,Xcode 重构不会重命名 setter 和 getter

java - 将表达式重构为函数会对性能产生影响吗?

php - 不显示已经订阅的节目

php - 从数据库中选择(从今天)差异最小的日期

oop - 书籍和标签的OO设计

php - 如何在 PHP 中创建加密的 PDF,并在 PDF Reader 中下载后可以解密?