(注意:这与 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 行,这感觉很笨拙。我想到了一些解决方案:
- 继续忍受讨厌的参数,用我的时间做点别的事情:)
- 忍受 2500 行的文件
- 为每组部分创建一个单独的类,以某种方式“知道”这些参数的值
如果我做#3,我想到了两种基本方法:
- 将 MyForm 对象作为单个参数传入
- 创建一个具有在 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/