Java의 상속과 조합에 대한 잘못된 사용 예
조합과 계승이란 무엇인가
class:
A
및 B
2개가 있다고 가정합니다.extends
B가 있다면 우리는 A가 B를 계승하고 A가 자류, B가 부류라고 말한다. 이런 상황이 계승이다.우리가 보통 어떤 상황에서 이 두 가지를 고려하는지 생각해 볼까요?내가 대충 생각해 보니 종종 다음과 같은 장면이 있다.
abstract class
또는interface
abstract class
과interface
(Java8의 default method)에 도달할 수 있다.그래, 이렇게 쓸데없는 말을 많이 했으니 내 의견을 내놓겠다. 벽돌을 찍는 것을 환영한다.
abstract class
또는interface
비교적 흔히 볼 수 있는 예: 우리는 실제 프로젝트에서 좋은
POJO
또는 model
를 정의하는데 이런 모델들은 명사와 유형이 같은 속성을 가진다. 예를 들어 다음과 같다.// db table primary key
private int id;
흔하죠? 하지만 저는 실제 업무에서 많은 동료를 만났습니다. 시스템은 이름이 BaseModel
또는 RootModel
일 수 있는 클래스를 정의하고 위의 속성id
을 안에 넣은 다음에 전체 프로젝트의 모든 모델이 이 BaseModdel 클래스를 계승합니다.당신들은 이런 동료를 만난 적이 있습니까?너희는 이렇게 쓰면 무슨 좋은 점과 나쁜 점이 있다고 생각하니?먼저 좋은 점을 말하자면, 굳이 어떤 좋은 점을 가져다 줄 수 있다면, 키보드를 몇 번 두드리지 말고, 하위 클래스에서 이런 속성을 적게 하는 것 외에는 실질적인 좋은 점이 있는 것을 보지 못했다.하지만 프로젝트의 후속 유지보수에 골치 아픈 일이 생겼다.
그리고 이런 작법의 잠재적인 문제를 말해라.
어느 날, 몇 가지 이유로 하위 클래스 A(BaseModel 계승)의 속성
id
이 프로젝트 중 어떤 곳에서 사용되는지 찾고 싶습니다슬기로운 당신은 IDE의
find usages
를 능숙하게 사용하게 됩니다. 그리고 당신이 찾은 사용 위치가 매우 많고 전혀 관심이 없는 경우가 많다는 것을 알게 될 것입니다.하지만 어쩔 수 없이 베이스모델의 클래스를 계승한 다른 속성 id의 사용 위치를 검색했습니다.만약 항목이 크지 않다면, 검색하는 숙련이 비교적 적을 것이다. 만약 항목이 좀 크다면?수색 숙련이 50곳을 넘으면 어떻게 할 거예요?BaseModel
을 사용하지 말고 속성 계승을 사용하는 것이다.물론 엄밀한 기간을 위해 저는 이 뜻을 상세히 말씀드려야 합니다. 저는 속성 계승을 완전히 반대하지 않았습니다. 명확하게:내가 반대하는 것은 전체 프로젝트의 모든 모델이 BaseModel을 계승하고 공용 속성을 BaseModel에 두는 것이다
이런 생각은 전체 항목의 것이다
후기
위의 부정적인 교재의 예는 개인적으로 자주 볼 수 있기 때문에 단독으로 꺼내서 말씀드리지만 여러분의 프로젝트에서 이런 상황이 있었는지 확실하지 않습니다.어쨌든 나는 이미 동료의 이런 작법에 여러 번 속은 적이 있다.
'그룹'과'계승'과 관련된 흔한 실수에 대해 저는 아직 잘 생각하지 못했습니다. (적어도 저는 아무도 범하지 않을 것 같습니다.) 만약에 제가 다음에 확실하게 생각하거나 독자 여러분께서 다른 건의가 있으면 메시지를 남겨서 교류해 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.