2011-02-23 4 views
1

입문 OOP 질문 :추상 클래스 및 검증 방법 당신을 위해

상황 : 각 아이가 독특한 방식으로 해당 속성의 유효성을 검사하기 때문에 나는, 공공 세터와 추상적 인 검증과 추상 클래스를 원한다.

코드 :

abstract class Parent { 
    public function setName($name) { 
     if (validateName($name)) { 
      $this->_name = $name; 
     } else { 
      // error msg 
     } 
    } 

    abstract public function validateName($name); 
} 

class Child extends Parent { 
    public function validateName($name) { 
     // ensure name gits this child's requirements 
    } 
} 

질문 : 이것은 "법적"설계 방식인가? setName 메서드는 모든 자식 클래스에 대해 동일하므로, 부모 클래스의 공용 메서드 여야한다고 생각했지만 유효성 검사기는 자식 클래스가이를 구현하도록 추상화해야합니다.

난 그냥 ... 개념적으로 종이에이를 스케치하고있어

+1

다른 사람들이 문제의 근본 원인을 신속하게 파악할 수 있도록 사람들은 자신의 사례를 어리둥절하게하는 데 익숙합니다. 일반적으로 이것은 훌륭하지만, 최선의 OOP 실행에 대해 묻는 질문에 대해서는 정확한 내용이 무엇인지를 아는 것이 중요합니다. 클래스는 * things *를 나타 내기위한 것입니다. 그러한 것들이 무엇인지 모른 채, 클래스를 디자인 할 것은 없습니다. – erisco

+0

법률에서 법률은 단지 일치하려고합니다. 물리학에서 법은 고아원을 공격하는 전기 톱 살인자 일 수 있습니다. 프로그래밍의 법칙은 물리 법칙과 훨씬 비슷합니다. – erisco

+0

아래에 의견을 보내 주셔서 감사합니다. 좀 더 많은 데이터가'Parent' 클래스는 일반적인 게임 클래스이고, 우리는 승리하는 쪽을 설정하려고합니다. 어린이'GameA'는 2면 밖에 없기 때문에 유효한 쪽은 1, 2 또는 0 (추첨)이됩니다. 'GameB'는 8 명의 선수를 지원하며 무승부, 개인 승자, 2 ~ 3 명의 우승 팀이있을 수 있습니다. 그래서 저는 부모에게 세터를 정의하고 아이들에게 유효성 검사를 지시하게하고 싶습니다. 그건 나에게 논리적 인 것처럼 보였지만, 나는 단지 핑키 발가락을 OOP에 담았습니다. – Drew

답변

2

불완전한에 구문이 있지만 예, 유효한 방법이있다 :

 if ($this->validateName($name)) { 
:

 if (validateName($name)) { 

이이어야한다

그러나 이것이 아키텍처의 범위라면, 왜 유효성을 검사하고 설정하는 추상 setName()을 정의하지 않는가? 이와 같이 :

물론 부모님에게는 코드가 없으므로 여기서 인터페이스를 사용합니다.

그러나이 프로그램이 어떻게 구성되어 있는지에 따라 달라집니다. 분명히 어느쪽으로 든 말할 수있는 프로그램의 아키텍처 다이어그램을 적어도보아야 할 것입니다.

+0

안녕하세요, Jonah. 답변 해 주셔서 감사합니다. '왜 안되는거야? '라고하는 당신의 제안을 분명히 해 주실 수 있겠습니까? - 나는 당신의 의미를 파악하지 못했습니다. – Drew

+1

그 변화는 다른 의미가 있습니다, 조나,하지만 그것이 잘못되었다고 말하는 것은 아닙니다. 원본에서 부모는 매개 변수가 설정된 프로 시저를 적용하고 메서드는 최종으로 정의해야합니다. 귀하의 변화에 ​​따라, 자녀는 원하는대로 매개 변수를 설정해야합니다 (또는 선택하지 않아야 함). 다름 아닌 Andrew Heath의 차이를 명확히 밝히는 데 도움이되기를 바랍니다. – erisco

+0

Jonah가 제시 한 인터페이스에서 파생 된 몇 가지 샘플 코드가 있음을 알았습니다. 어쨌든, 그는 나의 원래의 질문에 대답하고 추가로 생각해 보았다. 둘 다 감사합니다! – Drew

관련 문제