2011-01-27 3 views
2

데이터베이스의 데이터를 확인하기위한 인터페이스가 있으며 구현은 조회 및 확인 기능을 통해 다른 작업을 수행합니다. 구현 중 일부는 작업을 완료하기 위해 추가 기능이 필요합니다. 이는 가난한 실행입니까?PHP의 인터페이스에서 정의되지 않은 구현에 메소드를 추가하는 것은 바람직하지 않습니까?

+0

가 추가 방법 공개 또는 비공개/보호? –

+0

그들은 공개적이다. –

+0

연습 == 연습 – Drewdin

답변

0

본질적으로 나쁜 습관은 아닙니다. 중요한 것은 부모 클래스와 똑같은 함수 호출을 사용하여 확장 클래스를 사용할 수있는 경우입니다 (이 인터페이스에 관한 한).

은 참조 : 문제는 실제로 인터페이스에 정의 된 것보다 더 방법이 할 수있는 인터페이스를 구현하는 클래스에 대한 확인을하는 경우처럼 Liskov Substitution Principle

1

는 소리? 그 대답은 '예'일 것입니다. 그것은 사실 완벽하고 괜찮습니다.

1

제 생각에는 인터페이스가 정의하는 범위를 넘어선 추가 기능을 노출시키지 않는 한 좋지 않습니다. 그 protected 또는 private

을 가지고 같이 편집 :

그는뿐만 아니라 자신의 질문에 태그 factory했다

. 그래서 저는 그가 factory method을 사용하고 있다고 가정했습니다. 따라서 주어진 인터페이스 구현이 인터페이스에 정의 된 더 많은 메소드를 노출시키는 것은 좋지 않습니다.

+0

추가적으로'public' 메소드를 갖는 것이 완벽하다. 귀하의 현재 답변으로,'Iterator'를 구현하는'Foo' 클래스는'Iterator'에서 정의 된 메소드 이외의 public 메소드를 가질 수 없습니다. 그것은 아마 당신의 클래스를 쓸모 없게 만듭니다. – netcoder

+0

나는 명확성을 위해 나의 대답을 편집했다. – mhitza

0

인터페이스 서명을 존중하는 한 (즉, 서명에 따라 인터페이스 메소드를 구현하는 경우), 추가 메소드를 추가하는 구현에는 아무런 문제가 없습니다.

0

인터페이스는 인터페이스를 구현하는 클래스가 인터페이스에 설명 된 기능을 제공하는 "서비스 계약"입니다.이 클래스는 해당 서비스를 제공하기 위해 다양한 기능을 사용할 수도 있고 사용할 수도 있습니다. 나쁜 습관이 아니다.

0

클래스는 인터페이스와 추가 메서드를 구현하는 것이 일반적이다. 중요한 것은 귀하가 Single Responsibility Principle을 계속 준수한다는 것입니다. 즉, 클래스의 클라이언트는 인터페이스가 구현 된 인터페이스를 기반으로 객체의 동작에 대한 아이디어를 가지며 예상을 위반하지 않도록하려는 것입니다.

0

올바르게 사용하는 것은 바람직하지 않습니다. 예를 보여 드리겠습니다. 다음으로 : PHP에서

function test(Foo $foo) { 
    $foo->foo(); 
    $foo->baz(); 
} 
test(new Baz); 

, 그것은 작동합니다

interface Foo { 
    public function foo(); 
} 

class Baz implements Foo { 
    public function foo() { 
     // implementation of Foo::foo() 
    } 

    public function baz() { 
     // specific to Baz 
    } 
} 

다음은 가난한 방법입니다. 미리 컴파일 된 언어에서는 그렇지 않습니다. 귀하의 인수 $fooFoo 유형이고 baz 메소드가 없기 때문입니다. 컴파일 오류입니다. 컴파일러는 Foo 유형의 인수를 확인하고 Foo::baz은 잘못된 참조입니다. 그러나 그것들은 PHP에는 존재하지 않으므로 함수를 Baz 객체로 전달하면 작동 할 것입니다. 그러나 이상한 런타임 오류에 대한 문을 엽니 다.

적절한 방법

이해야 할 것 :

function test(Baz $foo) { 
    $foo->foo(); 
    $foo->baz(); 
} 
test(new Baz);