데이터베이스의 데이터를 확인하기위한 인터페이스가 있으며 구현은 조회 및 확인 기능을 통해 다른 작업을 수행합니다. 구현 중 일부는 작업을 완료하기 위해 추가 기능이 필요합니다. 이는 가난한 실행입니까?PHP의 인터페이스에서 정의되지 않은 구현에 메소드를 추가하는 것은 바람직하지 않습니까?
답변
본질적으로 나쁜 습관은 아닙니다. 중요한 것은 부모 클래스와 똑같은 함수 호출을 사용하여 확장 클래스를 사용할 수있는 경우입니다 (이 인터페이스에 관한 한).
은 참조 : 문제는 실제로 인터페이스에 정의 된 것보다 더 방법이 할 수있는 인터페이스를 구현하는 클래스에 대한 확인을하는 경우처럼 Liskov Substitution Principle
는 소리? 그 대답은 '예'일 것입니다. 그것은 사실 완벽하고 괜찮습니다.
제 생각에는 인터페이스가 정의하는 범위를 넘어선 추가 기능을 노출시키지 않는 한 좋지 않습니다. 그 protected
또는 private
을 가지고 같이 편집 :
그는뿐만 아니라 자신의 질문에 태그factory
했다
. 그래서 저는 그가 factory method
을 사용하고 있다고 가정했습니다. 따라서 주어진 인터페이스 구현이 인터페이스에 정의 된 더 많은 메소드를 노출시키는 것은 좋지 않습니다.
인터페이스 서명을 존중하는 한 (즉, 서명에 따라 인터페이스 메소드를 구현하는 경우), 추가 메소드를 추가하는 구현에는 아무런 문제가 없습니다.
인터페이스는 인터페이스를 구현하는 클래스가 인터페이스에 설명 된 기능을 제공하는 "서비스 계약"입니다.이 클래스는 해당 서비스를 제공하기 위해 다양한 기능을 사용할 수도 있고 사용할 수도 있습니다. 나쁜 습관이 아니다.
클래스는 인터페이스와 추가 메서드를 구현하는 것이 일반적이다. 중요한 것은 귀하가 Single Responsibility Principle을 계속 준수한다는 것입니다. 즉, 클래스의 클라이언트는 인터페이스가 구현 된 인터페이스를 기반으로 객체의 동작에 대한 아이디어를 가지며 예상을 위반하지 않도록하려는 것입니다.
올바르게 사용하는 것은 바람직하지 않습니다. 예를 보여 드리겠습니다. 다음으로 : 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
}
}
다음은 가난한 방법입니다. 미리 컴파일 된 언어에서는 그렇지 않습니다. 귀하의 인수 $foo
이 Foo
유형이고 baz
메소드가 없기 때문입니다. 컴파일 오류입니다. 컴파일러는 Foo
유형의 인수를 확인하고 Foo::baz
은 잘못된 참조입니다. 그러나 그것들은 PHP에는 존재하지 않으므로 함수를 Baz
객체로 전달하면 작동 할 것입니다. 그러나 이상한 런타임 오류에 대한 문을 엽니 다.
적절한 방법
이해야 할 것 :function test(Baz $foo) {
$foo->foo();
$foo->baz();
}
test(new Baz);
가 추가 방법 공개 또는 비공개/보호? –
그들은 공개적이다. –
연습 == 연습 – Drewdin