함수형 프로그래밍과 같은 다른 프로그래밍 패러다임에 대해 더 많이 배울수록 상속 및 다형성과 같은 OOP 개념의 지혜에 의문을 가지기 시작합니다. 나는 학교에서 상속과 다형성에 대해 처음 배웠고, 당시에 다형성은 쉽게 확장 할 수있는 일반적인 코드를 작성하는 훌륭한 방법 인 것처럼 보였다.
그러나 오리 타이핑 (동적 및 정적)과 고차 함수와 같은 기능적 특징에 직면하여, 나는 객체들 사이의 연약한 관계에 기초하여 불필요한 제한을 부과하는 것으로 상속과 다형성을 살펴보기 시작했습니다. 다형성의 기본 개념은 함수를 한 번 작성하고 나중에 원래 함수를 변경하지 않고 프로그램에 새로운 기능을 추가 할 수 있다는 것입니다. 필요한 메소드를 구현하는 다른 파생 클래스를 작성하기 만하면됩니다.
그러나 이것은 파이썬과 같은 동적 언어이든 C ++과 같은 정적 언어이든 오리 타이핑을 통해 달성하기가 훨씬 간단합니다.
예를 들어, 다음 Python 함수와 정적 C ++에 해당하는 것을 고려하십시오.
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
OOP에 해당하는 것은 다음 Java 코드와 같습니다.
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
물론 가장 큰 차이점은 Java 버전이 작동하려면 인터페이스 또는 상속 계층 구조를 작성해야한다는 것입니다. 따라서 Java 버전은 더 많은 작업이 필요하며 유연성이 떨어집니다. 또한 대부분의 실제 상속 계층 구조가 다소 불안정하다는 것을 알았습니다. 우리는 모두 모양과 동물에 대해 고안된 예를 보았지만 실제로는 비즈니스 요구 사항이 변경되고 새로운 기능이 추가됨에 따라 실제로 "is-a"관계를 확장하기 전에 모든 작업을 수행하기가 어렵습니다. 새로운 요구 사항을 수용하기 위해 추가 기본 클래스 또는 인터페이스를 포함하도록 계층을 리모델링 / 리팩토링합니다. 오리 타이핑을 사용하면 모델링에 대해 걱정할 필요가 없습니다 . 필요한 기능 만 걱정 하면됩니다.
그러나 상속과 다형성은 매우 인기가 있기 때문에 확장 성 및 코드 재사용에 대한 지배적 전략이라고 부르는 것은 과장된 일이 아닙니다. 그렇다면 상속과 다형성이 왜 그렇게 성공적일까요? 상속 / 다형성이 오리 타이핑보다 더 큰 장점을 간과하고 있습니까?
obj가 없다면 어떻게doSomething될까요? 예외가 발생합니까? 아무 일도 일어나지 않습니까?