2012-01-25 2 views
0

프로그래머가이 패턴을 사용한다는 (명확한 방법으로) 사양을 작성 중입니다.이 패턴의 이름은 무엇입니까?

처리중인 데이터에 여러 필터를 적용해야합니다. 구성을 통해 해당 필터를 만들 수 있습니다. 그들 중 몇 개가있을 수도 있고 없을 수도 있습니다. 나는 수출 계급에서 그 논리를 원하지 않는다. (미래에 커질 수 있기 때문에, 지금은 예상 할 수없는 다른 종류의 필터로). 나는 하나씩 차례대로 실행하기를 원한다. 따라서 export 클래스에서 내부 배열에 객체를 저장해야하는 addFilter 메소드를 요청한 다음 실제 내보내기 프로세스가 실행될 때 실행되도록해야한다. .

질문의 명확성이 확실하지 않습니다. 그것은 쇠사슬에 묶인 전략과 같지만 정확히 필터가 필요하지 않기 때문에 전략이 아닙니다.

다시 말하면 질문입니다. 사양에서이 패턴을 어떻게 호출해야합니까?


편집 : 내가 할 노력하고있어의 예 :

$report = new Report(); 
$report->addFilter(new RemoveSpaces()) 
     ->addFilter(new SubstituteText($predefined_substitutions_array) 
     ->addFilter(new FixCapitals()) 
     ->addFilter(new Encode("utf8")); 
echo($report->generate()); // filters are actually used during generation. 

기발한, 사용자는 대문자로 표시 할 것인지, 대체 무엇을 텍스트, RemoveSpaces 여부를 결정 할 수 있어야한다 단어 또는하지, 어떤 인코딩을 사용할 것인가 등이 있습니다. 앞으로 사용자 (클라이언트, 실제로) 요청시 일부 필터가 추가 될 것입니다.

foreach($this->filters as $current_filter) { 
    $data = $this->filters[$current_filter]->applyTo($data); 
} 
+0

당신이 이야기하고있는 것을 설명하기 위해 의사 코드 예제를 추가 할 수 있습니까? –

+0

수정 된 질문보기 –

답변

1

실제로 필터 클래스의 샘플 코드 나 서명을 표시하지 않았기 때문에 어떤 패턴을 사용하여 목표를 달성 할 수 있는지 판단 할 수있는 코드가 충분하지 않다고 말합니다.

Report 클래스는 Filter 클래스와 어떻게 상호 작용합니까 (반대의 경우도 마찬가지입니까?)?

나는 각 참가자가 다음 참여자를 호출 할 책임이 있기 때문에 고전적인 Chain of Responsibility를 사용하지 않는다고 생각합니다. 일반적으로 이전 또는 이후에 자체 코드가 실행됩니다. Windows가 어떻게 WindProc을 PriPad WindProc의 전후에 실행할 수 있는지 생각해보십시오. 전화를하지 않기로 선택할 수 있습니다.

이러한 필터 개체는 핵심 개체와 동일한 인터페이스를 구현하고 서로 랩핑하는 경우 데코레이터가 될 수 있습니다. 그러나 코드 샘플에는 간단한 목록의 개체가 있습니다. 데코레이터에서 당신은 자주 볼 것 : 물론

FilterA fA = new FilterA(coreObject); 
FilterB fB = new FilterB(fA); 
FilterC fC = new FilterC(fB); 

을, 이것은 내가 말한 것처럼 그래서, 우리가했다 알고 더 많은 코드를 볼 필요가 거라고 생성자를 통해 수행 할 수없는 장식.

각 작업의 출력이 다음 입력의 "파이프 및 필터"패턴을 따라 가고 있다고 생각하는 경향이 있지만 더 많이 알지 못하는 경우에도 명확하지 않습니다. 나는 각 필터가 거대한 String과 같은 것 (예 : 거대한 String)에 대해 작동하는지 또는 각각이 Report 객체 모델의 일부면과 상호 작용해야 하는지를 알 수 없습니다.

예를 들어 보고서의 개체 속성이 현재 Encoder 인 경우 Encode("utf8") 필터는 단순히 디스크 지속 전략을 처리하기 위해 Encoder 하위 클래스를 구성/설치하는 fcatory 역할을합니다. 한편 SubstituteText($predefined_substitutions_array)은 보고서가 소유 한 매개 변수 컬렉션에서 런타임 값을 교환합니다.

달성하고자하는 바를 설명하고 그 목표를 달성하는 방법을 설명하는 것이 좋습니다.

+0

"파이프와 필터"입니다! –

1

Chain of responsibility과 거의 같습니다. 각 필터는 체인에서 진행하지 않기로 결정할 수 있습니다. 일반적으로 각 후속 필터로 전달되는 "체인"객체가 있습니다.

이러한 체인 의미론이 필요하지 않은 경우 대상 개체 주위에 간단히 proxies으로 볼 수 있습니다.

+0

흠 ... 프록시가 아닙니다. 아무 것도 액세스하려고하지 않고 내보낼 데이터에 간단한 변환 및/또는 필터를 적용합니다. 필자가 @havexz에게 말했듯이 프로그래머가 간단하게 유지할 수 있도록 책임의 사슬 (Chain of Responsibility)이라고 부르는 것이 위험하지 않습니다. 나는 그 패턴을 설명 할 것입니다. 감사! –

2

나는 하나의 패턴을 선택해야 할 필요가 없다고 생각한다. 하나의 패턴은 일반적으로 전체 구현을 다루지 않는다. 따라서 사양에서 구현이 얻은 모든 패턴을 지정할 수 있습니다. 구현시 원본 패턴과 다른 것을 문서화 할 수 있습니다. 특정 경우

, 그것은 그게 전부는 또한 기능과 같은 필터를 구현하는 의미로 또한 Decorator 패턴도 찾아보실 수 있습니다 Chain of Responsibility

비슷합니다.

기타 유사한 패턴은 Command Pattern입니다. 따라서 generateReport 인 경우 executeCommand이고 필터는 목록의 명령입니다.

+0

+1 : 어쨌든 Decorator 패턴이 아니라고 확신합니다. 메소드를 추가하거나 데이터 객체의 인터페이스/기능을 변경하지 않기 때문입니다. 책임의 사슬 역시 제 추측 이었지만 프로그래머가 데이터에 대한 단순한 필터/변환보다 복잡한 것을 요구하고 있다고 오도하고 싶지는 않습니다. –

+0

구현하려는 필터 (예 : 필터)도 Decorator를 사용하여 구현할 수 있습니다. 데코레이터가 필요없는 것은 같은 인터페이스를 갖는 것입니다. BufferedInputStream, FileInputStream 등의 예 ('BufferedInputStream bin = new BufferedInputStream (new FileInputStream (filename));') – havexz

+0

맞습니다. 그러나 장식자는 약간의 복잡성으로 보입니다. 변환 함수에 대한 래퍼 객체 만 필요하며 적용 여부에 관계없이 구성 할 수 있어야합니다. 내 편집 된 질문보기 이것이 내가 원하는 패턴인지, 데코레이터가 아닌지 알고 있습니다. 나는 그 이름을 알고 싶다. –

관련 문제