기본 클래스에서 객체 인스턴스테이션 '후크'를 갖는 것이 좋습니까?

StackOverflow https://stackoverflow.com/questions/148056

  •  02-07-2019
  •  | 
  •  

문제

나는 내 자신의 트리 구현을 만들었습니다 여러가지 이유 그리고 논리로 가득 찬 일반적인 트리 노드 인 '기본'클래스와 더 전문화 된 다른 클래스 인 '기본'클래스 인 두 가지 클래스를 생각해 냈습니다.

내 기본 클래스에서 특정 방법에는 새로운 트리 노드 (예 : 어린이 추가)를 인스턴스화하는 것이 포함됩니다. 이러한 인스턴스는 논리 (중첩 루프) 내부에있어 논리를 인스턴스화와 분리하기 어렵게 만듭니다.

따라서 특정 클래스에서 이러한 인스턴스를 무시하지 않으면 잘못된 유형의 노드가 생성됩니다. 그러나 나는 그렇지 않습니다 원하다 복제되지 않아야하는 공유 논리가 포함되어 있기 때문에 이러한 방법을 무시합니다!

문제는 이것으로 끓을 수 있습니다.

public class Foo {
    public String value() { return "foo"; }

    public Foo doStuff() {
        // Logic logic logic..
        return new Foo();
    }
}

class Bar extends Foo {
    public String value() { return "bar"; } 
}

new Bar().doStuff().value(); // returns 'foo', we want 'bar'

내 머리에 튀어 나온 첫 번째 것은 확장 클래스를 무시할 수있는 'Create Hook'가 있습니다.

public Foo createFooHook(/* required parameters */) {
  return new Foo();
}

지금. 그것은 첫 번째 생각 이었지만, 그 코드가 끔찍한 무언가로 나오는 악취가 있습니다. 뭔가 아주 ... 잘못된 그것에 대해.

알몸으로 요리하는 것과 같습니다. 위험하고 위험하다고 느낍니다. 불필요한.

그래서, 이 상황을 어떻게 처리 하시겠습니까?

도움이 되었습니까?

해결책

그래서 내 사본을받은 후 디자인 패턴 그리고 내가 공정하게 확신하는 것이 내가 원하는 것을 처음 발견 한 것입니다.

그것은 The라고합니다 공장 방법 그리고 그것은 대부분 완벽합니다. 내 슈퍼 클래스 (내 슈퍼 클래스) 때문에 여전히 약간 추악합니다 (Foo 위의 예에서)는 추상적이지 않으며 이는 서브 클래스가 후크를 구현하지 않아야한다는 것을 의미합니다.

그것은 약간의 리팩토링으로 고칠 수 있으며, 나는 다음의 효과에 대한 무언가로 끝날 것입니다.

abstract class AbstractFoo {
    public String value() { return "Foo"; }

    public AbstractFoo doStuff() {
        // Logic logic logic
        return hook();
    }

    protected abstract AbstractFoo hook();
}

class Foo extends AbstractFoo {
    protected AbstractFoo hook() { return new Foo(); }
}

class Bar extends AbstractFoo {
    public String value() { return "Bar"; }

    protected AbstractFoo hook() { return new Bar(); }
}

new Bar().doStuff().value(); // Returns 'Bar'!

다른 팁

공장 패턴 외에도 복합 패턴을 살펴 보았습니다. 나무 기반 상황에서 공장과 함께 일하는 데 잘 어울리는 경향이 있습니다.

복합 디자인 패턴

더 나은 접근 방식이 있다고 생각하지 않습니다. 생성자 로부터이 후크를 호출하지 않도록주의하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top