2009-12-17 67 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聽起來對我來說是兩個世界中最糟糕的。很多工作來獲得你不喜歡的代碼。