2009-01-28 2 views
5

많은 기능을 구현하는 클래스 A가 있습니다. Class A는 매우 안정적입니다.C++에서 클래스 리펙토링

이제 새로운 기능 요구 사항이 생겼습니다. 일부 기능이 A에 의해 구현 된 기능과 일치합니다. 클래스 A에서 새로운 클래스를 직접 상속받을 수 없으므로 새로운 클래스에 많은 중복성이 생길 수 있습니다.

그럼 두 클래스 모두에서 공통 코드를 복제해야합니까?

또는 새 기본 클래스를 만들고 기본 코드로 기본 코드를 이동하고 클래스 A와 새 클래스를 파생시켜야합니까? 그러나 이것은 나의 기존 수업의 변화로 이어질 것입니다.

그래서 더 나은 접근 방법이 될까요?

+0

코드를 복사해도 코드에 더 많은 중복이 생성되지 않습니까? – mmmmmmmm

답변

16

클래스 A를 수정하지 않는 아주 좋은 이유가없는 한, 리팩토링하고 공통베이스 (또는 더 좋게는 둘 다 사용할 수 있지만 꼭 그런 것은 아닌 공통 클래스)를 만드십시오.

클래스를 외부 인터페이스로 수정하지 않고도 항상 공유 기능에 액세스하려면 개인 상속을 사용할 수 있습니다.이 변경 사항은 다시 작성해야하지만 더 이상 필요하지 않습니다. 클래스 A의 모든 함수를 그대로두고 공유 구현 클래스로 전달하도록합니다.

리팩토링하지 않으려는 이유 중 하나는 새로운 클래스의 기능이 변경 될 가능성이 있지만 이전 클래스에서 동일한 변경이 필요하지 않은 경우 일 것입니다. 코드를 복제하지 않은 이유 중 하나는 수정 또는 변경이 한 곳에서만 이루어져야하기 때문입니다. 원래 클래스를 깨뜨릴 변경 사항이 발생하면 대신 코드를 복사 할 수 있습니다. 대부분의 경우,이 두 클래스가 생각만큼 유사하지 않은 경우에만 발생하며 일반적인 기능 집합을 추상화하려고 시도하고 있습니다.

+0

당신 말이 맞아요. 내 새 클래스 구현은 미래에 변경 될 가능성이 가장 높으며 클래스 A와 동일한 구현을 공유하지 않을 수 있습니다. – chappar

+0

당연히 당신은 어쨌든 공통된 것을 어딘가의 클래스로 옮기고 그 것을 사용하는 것이 더 나을 것입니다. – Eclipse

+0

공통 코드를 말하는 +1은 A와 B의 기본 클래스가 아니라 A와 B가 사용하는 클래스에 들어갈 수 있습니다. –

8

(1) 귀하 또는 귀하의 고용주가 두 복사본을 모두 무기한으로 유지할 준비가되어 있지 않으면 두 클래스 모두에서 공통 코드를 복제하지 마십시오.

(2) 리팩토링으로 정의하면 이미 가지고있는 클래스가 변경됩니다. 제안한 리펙터는 "Extract SuperClass"이고 그 뒤에는 파생 클래스에 공통 인 각 메서드에 대해 "Pull Up Method"이옵니다. 이것은 훌륭한 접근 방식입니다.

편집 : 나는 진짜 보석을 기억하고있다. 리팩토링 : 이유는 그것이 완벽하게 유동적이고 가역적이다. 결코 "권리"가 없다. 오직 "현재 권리"만있다. 나중에 이러한 클래스에 대한 상속을 사용하면 좋은 객체 모델이 아니라고 결정하면 다시 Josh가 제안한대로 컴포지션을 다시 사용할 수 있습니다.

1

클래스가 대체 가능한 클래스 인 경우 ("IS-A"관계) 클래스는 공통 기본 클래스를 공유해야합니다.

구성을 고려해보십시오. 새 클래스 B는 클래스 A 유형의 개인 멤버 변수를 둘러싼 래퍼 클래스가 될 수 있습니다. 클래스 B는 클래스 A를 변경하지 않고 클래스 A를 새로운 메소드 또는 로직으로 보완 할 수 있습니다. 클래스 A를 변경할 수없는 경우 편리합니다 (예 : 다른 팀 소유의 폐쇄 소스 소프트웨어이거나 클래스 A를 사용하는 기존 코드와의 호환성을 두려워 할 수 있습니다.

좋은 다이어그램을 보려면 "Replace Inheritance with Delegation" 리팩토링 패턴을 참조하십시오.

관련 문제