JAVA 반 상속 개념 구현 관련..
글쓴이: jino0330 / 작성시간: 금, 2010/06/25 - 10:52오전
배치에서 해당 클래스의 메소드를 콜하는 프로그램입니다.
콜되는 메소드는 B.execute() 라고 합니다. 콜할때 execute()를 위한 info객체를 세션으로 넘겨줍니다.
해당 클래스는 execute()할때 생성이 됩니다. (팩토리 패턴 이용)
B는 info객체를 참조해서 결과객체를 만드는데, info가 특정값이면 A클래스랑 동일한 로직을 타고, 아닌 경우는 전혀다른 로직을 탑니다.
class A
{
protected execute()
{
a;
b;
c;
}
이럴 때, B 클래스는 A클래스를 상속 받아서 구현하는게 맞을까요? 아니면 따로 만드는게 나을까요?
Forums:
이미 말씀만으로도...
A에도 execute()가 있고 B에도 execute()가 있는데, B에서 execute() 할 때에는 세션의 info를 참조해서 특정 값이면 A의 execute()랑 동일한 로직을 수행한다는 말씀만으로도 형제내지 상속으로 보여집니다.
A의 execute()에 있는 로직이 execute가 가져야 하는 기본적인 로직을 포함하는 것이면 A를 B가 상속 받는게 맞는 것 같고,
그렇지 않다면, Z를 abstract 또는 interface 등을 활용해 기본으로 하고 A, B 모두 Z를 상속받아 설계하여야 할 것으로 보여집니다.
지금은 B에서 info의 조건을 비교해서 로직을 수행하지만,
비교하는 로직이 다른 클래스로 위임되어야 하는 상황(Abstract Factory 등의 활용)이 되면
어떻게든 A와 B의 hierarchy는 있어야 할 것으로 생각됩니다.
추가) 근데 반상속이 먼가요?
--------------------------------
그래날아보자꾸나
--------------------------------
그래날아보자꾸나
말씀감사합니다.
B에서 info = a 이면 a;b;c;를 수행해야 하는 로직이구요.
info = d 이면 d;e;f;를 수행해야 합니다.
따라서 B와 A의 관계를 상속이라기 보다 B안에서 if문을 따라 info = a 일때 A를 호출하여 a;b;c;의 결과를 받아오기만 하는 로직으로 갈까 생각중입니다.
좀 더 현명한 방법이 있으면 알려주시면 감사하겠습니다.
SYSTEM ARTIST를 꿈꾸는 전도무망한 청년입니다
SYSTEM ARTIST를 꿈꾸는 전도무망한 청년입니다
class B { execute(Info
제가 제대로 이해했는지 모르겠는데 이건 어때요?
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
저도 능력이 부족해서...
현명한 방법이라기 보다... 저 같은 경우에,
현재 info가 a 또는 b의 2가지 경우밖에 없고 향후에도 2가지 경우밖에 없다면은 A, B 클래스를 나누는 것도 불필요 하다고 생각됩니다.
클래스를 하나로 하고 로직의 복잡성 등을 고려해서 메소드를 if (info.equals(a)) { executeA() } elseif (info.equals(b)) { executeB() } 와 같은 형태면은 충분하다고 생각됩니다.
물론 A, B가 execute 외에 다른 역할이 있으면 클래스가 나뉘어 져야 하겠지만요..
하지만, 현재 info가 2가지 경우밖에 없지만 향후에 경우의 수가 늘어날 수가 있다거나,
사용자에게 확장을 제공해야 한다면 당연히 상속할 수 있도록 구조를 가져가야 할 것 입니다.
이 경우 당연히 info의 상태를 검사하는 코드는 A, B 클래스 안에 있으면 안 될 것이고,
별도의 클래스에서 info의 상태를 검사해서 A 또는 B 등의 클래스를 생성해서 execute를 호출하는 형태가 되겠지요.
좀 더 유연하게 한다면 info의 상태에 따라 생성해야 되는 클래스에 대한 정보를 어노테이션이나 별도의 설정을 통해 관리하겠구요.
개인적으로 과유불급이란 말을 좋아하는데, 아키텍쳐도 디자인도 마찬가지라 생각합니다.
타겟 시스템을 충분히 고려해서 그에 맞게 만들때가 제일 아름다워 보이더군요.
--------------------------------
그래날아보자꾸나
--------------------------------
그래날아보자꾸나
A랑 동일한 로직을 탈때는
B를 생성하지 말고 A를 생성해서 처리하시고, 아닌 경우는 B에서 처리하시면 되겠네요.
물론 두 클래스 모두 execute() 가 정의된 인터페이스를 구현해야겠지만요.
글 쓰신 내용을 전혀
글 쓰신 내용을 전혀 이해못했지만 -_-;
상속인지 아닌지는 "리스코프 치환 법칙" 하나만 보면 됩니다.
코드 재사용, 비슷한 로직 등은 부차적인 내용입니다.
댓글 달기