2009-12-17 41 views
4

(注:这是关系到this question,但我认为它可能已被写入更清楚,所以我试图再次 - 我只更新帮助有限的程度。)最好的方法(程序OOP的?)

我继承一些代码,创建与众多部分的复合物的形式,和大量的可能的视图,这取决于许多参数。我一直在使用它一段时间,最后有机会考虑做一些重新分解。它是目前写的程序上,有一堆的功能看起来像这样:

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是不是所有的不同的,但它不是完全面向对象的。 (事实上​​,我能做到这一点并没有真正改变到一个面向对象的方法。)

还有没有其他的方法?想想哪个更好?

回答

0

当我在你之前的问题中发布这个问题时,我想到了这个问题 - 这个问题反映了decorator pattern

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

+0

谢谢,彼得,我会看看那个。 – sprugman 2009-12-17 23:26:41

0

已经做了很多Cocoa编程最近,我倾向于认为在MVC模式(模型 - 视图 - 控制器)方面的事情。因此,我会将表格看作其各个部分的控制者。

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

表单对象应该实例化部分控制器,告诉他们显示或隐藏或其他,并获取状态报告。表单对象,实际上是一个控制器,然后可以决定何时完全填写表单。您可能有一个form_model对象来保存收集的数据,或者您可能希望将section_model对象作为其中的一部分。要了解不同对象之间的相互作用需要一段时间,但根据经验我知道,如果您在设计对象时受到严格规定(关键是:对象的责任是什么,什么不是),您将获得更好的结果概述和您的代码将更容易升级。一旦你发现改进开始自然产生,你就走在正确的轨道上。

1

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

+0

绝对推荐zend窗体实现。当我和他们一起工作时,这是几个开发人员职业生涯中的关键时刻,他们首先学习了如何通过Zend_Form进行表单布局和验证。 – 2009-12-21 20:32:50

0

如果你有时间去做第三项工作,那么从长远来看,你可能会是最快乐的。就我个人而言,我没有时间在我的工作中经常重构那个程度,所以我可能会被迫选择#1。 #2听起来对我来说是两个世界中最糟糕的。很多工作来获得你不喜欢的代码。