şeklimi refactor iyi yolu (oop prosedürel?)

4 Cevap php

(Not:. Bu this question ile ilgili, ama o daha açık bir şekilde yazılmış olabileceğini düşünüyorum, bu yüzden tekrar deniyorum edilir - benim güncelleştirme yalnızca sınırlı bir ölçüde yardımcı)

Ben çok sayıda bölümleri ile karmaşık bir form oluşturur bazı kod devralınan ve olası manzaralı bir sürü, bir dizi parametre bağlı ettik. Ben bir süre onunla çalışmak, ve nihayet bazı yeniden faktoring yaptığını düşünmek için bir şans var oldum. Şu anda bu gibi bakmak fonksiyonları bir grup ile, prosedür yazmış:

get_section_A ($type='foo', $mode='bar', $read_only=false, $values=array()) {
    if ($this->type == 'foo') { 
        if ($this->mode == 'bar') { }
        else { }
    } else { }
}

Bu parametreler etrafında geçen kötü olduğunu, bu yüzden böyle bir sınıf yazmaya başladım:

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.
}

Sorun prosedürel fonksiyonları (bölümlerin gruplar için) birkaç dosyanın ayrılır, ve ben tek bir sınıf dosyası içine hepsini birleştirmek eğer, ben hantal hissediyor, 2500 hatlarında bakıyorum olmasıdır. Ben bir kaç çözüm düşündüm:

  1. pis parametreleri ile yaşayan tutmak ve benim zaman başka bir şey yapmak :)
  2. 2500 satırlık bir dosyayı sahip canlı
  3. nasılsa bu parametrelerin değerlerini "bilir" bölümlerinin her grup için ayrı bir sınıf oluşturmak

Ben 3. yaparsam, ben iki temel yaklaşımlar düşündüm:

  1. Tek bir parametre olarak MyForm nesnesini iletin
  2. MyForm set olsun statik özelliklere sahip FormSectionGroup sınıf oluşturmak, daha sonra grup dosyaları, her sınıf FormSectionGroup genişletmek ve otomatik olarak bu parametreler için geçerli değerler erişim olurdu.

1) set-up için muhtemelen daha kolay ve ben $this->type veya $myForm->type tüm bu farklı değil demek olmadığını içeride get_section_A() değilim, ama bu kez tam olarak OOP değil. (Aslında, ben gerçekten bir OOP yaklaşım değiştirmeden bunu yapabilir.)

Diğer yaklaşımlar var mı? Ilgili düşünceler daha iyi?

4 Cevap

Ben bunu nasıl uzun bir açıklama yazmak için başka bir şey isterim, ama biraz tembel hissediyorum. Ancak zend framework Zend_Form yerine işaret etmek yeterli enerji var. İşte (Zend_View, Elements, dekoratörler) düzgün bir şekilde çalışması için bazı bağımlılıkları olabilir, ama bunları aldıktan sonra, oldukça olağan durumlarda bu tür işler gelebilir.

Bu sorunu decorator pattern kokuyor - Bir önceki soruda gönderdi ben bu düşündüm.

Ama, küçük bir iş olacak. Ama bunu halletmek kez memnuniyeti / başarı inanılmaz mantıklı olacak düşünüyorum.

Son zamanlarda Kakao programlama bir sürü yapmış olan, MVC deseni (Model-View-Controller) terimleri şeyleri görmek eğilimindedir. Bu nedenle, ben onun çeşitli kesimlerinin bir denetleyicisi olarak form bakmak istiyorum.

Her bölüm nesne durum, değerlerin takip ve görüntülenmesi gereken olup olmadığını sorumlu olmalıdır. Veya kesin olarak, section_model değerleri (varsayılan değerler, doğrulama, vb) dikkat cekti, section_view bölümü ve section_controller parçaları bölümünün durumunu tutmak parça göndermek istiyorsunuz görüntüleme (veya değil) dikkat çekmek istiyorum ve form nesnesine sonuçları rapor.

Form nesnesi, bölüm kontrolörleri örneğini görüntülemek veya gizlemek ya da her neyse söyle, ve durum raporları almalısınız. Form tam olarak doldurulmadı zaman eğer form nesnesi, gerçekten bir denetleyici hareket, daha sonra karar verebilirsiniz. Sen toplanan verileri kaydetmek için bir form_model nesnesi olabilir, ya da belki daha doğrusu section_model nesneler bunun katılmak olurdu. Eğer nesneleri tasarlarken disiplinli if (anahtar: Bir nesnenin sorumluluğu nedir ve ne değildir) o farklı nesnelerin nasıl etkileşim için bir duygu almak için bir süre alacaktır ama deneyimlerinden biliyorum, daha iyi kazanacaktır genel bakış ve kod yükseltmek için daha kolay olacaktır. Eğer gelişmeler doğal olarak ortaya çıkar başladığını bulduğunuzda, doğru yolda.

Eğer 3. yapmaya çalışmak için zamanınız varsa, muhtemelen uzun vadede daha mutlu olacak. Şahsen ben çok sık o ölçüde refactor benim iş vaktim yok ve bu yüzden muhtemelen 1. almak zorunda olurdum. 2. Benim için her iki dünyanın en kötü gibi geliyor. Iş sürü sevmediğiniz kodu almak için.