2009-05-21 3 views
2

A는이 같은 내가 볼 매우 일반적인 패턴 (내가이 질문의 순간에 그것을 다루는에만 있기 때문에, 젠드 프레임 워크에 따기있어)입니다 Zend_Form은 추상 클래스가 아니지만 완벽하게 사용할 수 있습니다. 이것은 멋진 클래스로 폼을 "캡슐화"하는 장소로 "권장"되는 것으로 보입니다.Zend_Form와리스 코프 치환 원칙

Liskov 대체 원칙을 위반합니까? Zend_Form의 각 하위 클래스는 기본 클래스와는 다른 동작을합니다. 이것을 위해 구성을 사용하는 것이 더 낫지 않습니까, 아니면이 원칙을 완전히 오해하고 있습니까?

답변

0

Zend_Form은 상속을 위해 설계되었습니다. Zend_Form을 사용하는 동안 모든 사람들이이를 염두에 두어야합니다. 실제로는 Zend_Form이 필요하지는 않지만 그 서브 클래스가 될 수 있습니다. 따라서, 어떤 프로그램이 Zend_Form을 그대로 사용하여 서브 클래스가 동작 할 수있는 것처럼 동작하지 않는다면 그 프로그램이 잘못되었습니다. Liskov 원칙에 따라 "기본 클래스 사용"이 아니라 그것을 악용합니다.

Zend_Form은 주로 Zend 프레임 워크에서 사용되며 올바르게 사용한다고 확신합니다.

나는 상속을 위해 설계된이 클래스에 대해 어떤 프레임 워크를 기반으로하는 응용 프로그램의 빌드 블록으로 생각한다. "동작"의 정의는 더 추상적이어야한다. 클래스 자체가 추상이 아니더라도 서브 클래스에 대한 세부 사항은 남겨 두어야한다. Zend_Form의 동작은 "일부 HTML을 렌더링하고 일부 유효성 검사 규칙"을 사용한다고 말합니다. 이 의미에서 Zend_Form의 모든 하위 클래스는 같은 방식으로 동작합니다. Zend_Form non-abstract는 단지 기본 동작을 정의하므로 사용하기가 더 쉽습니다.

또한 좀 더 학문적으로하기 위해 두 클래스를 만들 수 있습니다. 하나는 모든 양식의 추상 기본 클래스 여야합니다. 비어있는 폼을위한 또 하나, 정확히 동작하고 Zend_Form은 이제 동작하고 자신 만이 사용할 수 있습니다. 그래서 프로그램에 실제 값을 추가하지 않을 ptobably Liskov 원리에 대한 혼란을 제거 할

// sorry, I don't like PHP so here goes java 
public abstract class ZendForm{/*implementation here and NO abstract methods*/} 
public final class DefaultZendForm extends ZendForm{/*nothing here*/} 

이 같은 것을,하지만 것입니다.

하위 클래스는 수퍼 클래스와 다른 방식이어야합니다. 그렇지 않으면 하위 클래스를 만드는 것이 의미가 없습니다. 그리고 당신은 항상이 차이를 남용하고 슈퍼 클래스에서 작동하고 서브 클래스에서 실패하는 프로그램을 작성할 수 있습니다. 그러나 그것은 합리적이지 않을 것입니다. 정확히 기본 (빈) 형식을 렌더링하는 것은 Zend_Form의 계약의 일부가 아닙니다. 클래스 계약의 일부인 동작 만 LSP의 주제입니다.

0

Liskov의 대체 원칙에 따르면 프로그램 모듈에서 Base 클래스를 사용하는 경우 프로그램 모듈의 기능에 영향을주지 않고 Base 클래스에 대한 참조를 Derived 클래스로 바꿀 수 있습니다.

그래서 MyForm과 ZendForm의 차이점은 무엇입니까? 프로그램의 기능이 변경 되었습니까?

도 (Wikipedia article에서)이 2 개 탄알을 확인 :

  • 사전 조건은 서브 클래스에서 강화 될 수 없다.
  • 하위 클래스에서 사후 조건을 약화시킬 수 없습니다.

아마 당신은이 MyForm이 ZendForm에서 극적으로 차이가 있음을 발견 할 것이다, 당신은 안전하게 상속을 사용할 수 있습니다.

+0

프로그램의 기능이 변경 될 것입니다. 1) 다른 HTML 양식이 렌더링됩니다. 2) 유효성 검사를위한 다른 규칙이 사용될 수 있습니다. – blockhead

+0

하위 클래스는 항상 기본 클래스와 다른 기능을 수행합니다. 그렇지 않으면 필요하지 않습니다. 그래서, 1) LSP와 모순되지 않습니다. 어쩌면 2) 위키 백과를 다시 인용하여 "또한, 그 원칙은 서브 클래스의 메소드에 의해 새로운 예외가 던져지지 않아야 함을 의미한다. 예외는 그 자체가 수퍼 클래스의 메소드에 의해 던져지는 예외의 서브 타입이다. –

+0

실용적인 것은 Zend_Form을 확장하는 것이 더 합리적이며 학계에서는 너무 지나치지 않을 것입니다. –

관련 문제