Java의 상속과 조합에 대한 잘못된 사용 예

절대 다수의 사람들이 자바의'계승'과'조합'이라는 두 가지 것에 대해 비교적 익숙하다고 믿는다. 이 글은 주로 이 두 가지 화제에 대해 이야기한다.만약 내가 어떤 곳에 잘못 썼거나 비교적 유치하고 논증이 명확하지 않다면, 모두가 메모를 남겨 바로잡는 것을 환영합니다.
조합과 계승이란 무엇인가
class:AB 2개가 있다고 가정합니다.
  • 만약classAextendsB가 있다면 우리는 A가 B를 계승하고 A가 자류, B가 부류라고 말한다. 이런 상황이 계승이다.
  • 만약에 A에 속성의 유형이 B라면 우리는 이런 상황이 조합이라고 말한다.
  • 각각 어떤 상황에서 사용하는가
    우리가 보통 어떤 상황에서 이 두 가지를 고려하는지 생각해 볼까요?내가 대충 생각해 보니 종종 다음과 같은 장면이 있다.
  • 공통 코드
  • 사물 간의'공통성'을 나타내기 위해 또는 단지'범형'을 위해 추출abstract class 또는interface
  • 내가 이리저리 생각해 보니 정말 이 두 가지 상황밖에 없는 것 같다. 그러나 이 두 가지 상황은 특별한 관련이 있다. 예를 들어 공용 코드라는 일은 사실abstract classinterface(Java8의 default method)에 도달할 수 있다.
    그래, 이렇게 쓸데없는 말을 많이 했으니 내 의견을 내놓겠다. 벽돌을 찍는 것을 환영한다.
  • 만약에 공용 코드만 생각하고 이 공용 코드를 사용하는class나method가 뚜렷한 연락이 없다면 조합을 사용하십시오.
  • 만약에 몇 개의class 또는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에 두는 것이다
    이런 생각은 전체 항목의 것이다
    후기
    위의 부정적인 교재의 예는 개인적으로 자주 볼 수 있기 때문에 단독으로 꺼내서 말씀드리지만 여러분의 프로젝트에서 이런 상황이 있었는지 확실하지 않습니다.어쨌든 나는 이미 동료의 이런 작법에 여러 번 속은 적이 있다.
    '그룹'과'계승'과 관련된 흔한 실수에 대해 저는 아직 잘 생각하지 못했습니다. (적어도 저는 아무도 범하지 않을 것 같습니다.) 만약에 제가 다음에 확실하게 생각하거나 독자 여러분께서 다른 건의가 있으면 메시지를 남겨서 교류해 주시기 바랍니다.

    좋은 웹페이지 즐겨찾기