2009-12-17 9 views
4

입니다 (참고 :이 내용은 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 라인을 볼 수 있습니다.이 라인은 다루기가 힘듭니다. 나는 몇 가지 솔루션을 생각했습니다

  1. 는 불쾌한 매개 변수와 함께 살고 유지하고
  2. 각 그룹에 대해 별도의 클래스를 만들고 2500 선 파일을 갖는 :
  3. 라이브 내 시간에 다른 일을 할 섹션이 어떻게 든 "알고"나는 # 3을 할 경우

는, 나는 두 가지 기본 방법을 생각했습니다 이러한 매개 변수의 값 :

  1. MyForm 객체를 단일 매개 변수로 전달
  2. MyForm에 설정된 정적 속성으로 FormSectionGroup 클래스를 만든 다음 그룹 파일에서 각 클래스가 FormSectionGroup을 확장하고 해당 매개 변수에 대한 현재 값에 자동으로 액세스합니다.

1) 설정을하는 것이 더 쉬울 것입니다, 나는 get_section_A() 안에있어 일단 내가 $this->type 또는 $myForm->type 모든 것을 다른 아니라고하지만 OOP 정확하지 여부. (실제로 OOP 접근 방식으로 변경하지 않고도이 작업을 수행 할 수 있습니다.)

다른 접근 방법이 있습니까? 어떤 생각이 더 나은가?

답변

0

이전 질문에 게시 할 때 생각했습니다.이 문제는 decorator pattern입니다.

그래도 작은 일이 아닙니다. 그러나 일단 당신이 그것을 끝내면 당신은 만족/성취의 놀라운 감각을 가질 것이라고 생각합니다.

+0

고마워, 피터, 내가 그걸 살펴볼거야. – sprugman

0

최근에 많은 코코아 프로그래밍을했기 때문에 MVC 패턴 (Model-View-Controller) 용어로 볼 수 있습니다. 그러므로, 나는 다양한 부분의 컨트롤러로서 그 형태를 살펴볼 것이다.

각 섹션 개체는 상태, 값 및 표시해야하는지 여부를 추적해야합니다. 또는 section_model은 값 (기본값, 유효성 검사 등)을 처리하고 section_view는 섹션의 일부를 표시하거나 처리하지 않을 것이며 section_controller는 섹션의 상태를 추적합니다 결과를 양식 객체에보고합니다.

양식 객체는 섹션 컨트롤러를 인스턴스화하고 표시하거나 숨기거나 알려주고 상태 보고서를 가져와야합니다. form 객체는 실제로 컨트롤러를 작동 시키면 폼이 완전히 채워지는 시점을 결정할 수 있습니다. 수집 된 데이터를 저장하려면 form_model 객체가 있거나 아니면 section_model 객체가 포함되어 있어야합니다. 다른 객체가 상호 작용하는 방식에 대한 느낌을 얻는 데는 어느 정도 시간이 걸릴 것입니다.하지만 객체를 설계 할 때 (객체의 책임은 무엇이고 무엇이 아닌지) 열쇠를 쥐고 있다면 더 나은 개요 및 코드를 쉽게 업그레이드 할 수 있습니다. 개선 사항이 자연스럽게 발생하기 시작하면 올바른 방향으로 나아갑니다.

1

나는 이것을하는 방법에 대한 오랜 설명을 쓰는 것 이상을 좋아하지 만, 나는 조금 게으르다. 그러나 나는 젠드 프레임 워크에서 Zend_Form으로 당신을 안내 할만큼 충분한 에너지를 가지고 있습니다. 제대로 작동하게하려면 (Zend_View, Elements, Decorators) 몇 가지 의존성이있을 수 있지만, 일단 가지고 있으면 그 상황을 매우 우아하게 처리합니다.

+0

zend 양식 구현을 권장합니다. 여러 개발자 경력에서 중요한 순간이었습니다. Zend_Form을 통해 양식 레이아웃 및 유효성 검사를 수행하는 방법을 먼저 배웠습니다. –

0

# 3 일할 시간이 있다면, 아마도 장기적으로 가장 행복 할 것입니다. 개인적으로, 나는 그 직업을 리팩토링하는 데 시간이별로 없기 때문에 아마도 # 1을 선택해야 할 것입니다. # 2는 나에게 최악의 세계처럼 들린다. 당신이 좋아하지 않는 코드를 얻으려면 많은 노력이 필요합니다.

관련 문제