(注意:这与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行,感觉很笨重。我想到了一些解决方案:
如果我做#3,我想到了两种基本方法:
1)可能更容易设置,一旦我在get_section_A()
内,我是说$this->type
还是$myForm->type
并不是那么不同,但它并不完全是OOP 。 (事实上,我可以在不改变OOP方法的情况下做到这一点。)
还有其他方法吗?关于哪个更好的想法?
答案 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听起来像是对我来说两个世界中最糟糕的。很多工作都是为了获得你不喜欢的代码。