prgrms-web-devcourse / BE-Team-preArmand-Book-study

2 stars 2 forks source link

[아이템 15] 질문 모음 #6

Closed yuminhwan closed 2 years ago

yuminhwan commented 2 years ago

1.

P.98 세번째 문단 public 클래스의 protected멤버는 공개API이므로 영원히 지원돼야 한다.

상속을 통해 어디서든 접근할 수 있으니 공개 API라고 하는 걸까요?

2.

P.99 두번째 문단. 심지어 필드가 final이면서 불변 객체를 참조하더라도 문제는 여전히 남는다.

이 말 뜻이 public으로 지정된 필드를 외부에서 쓰고 있다면 public필드를 없앤다면 외부에서 사용하고 있는 코드를 모두 수정 해야하기 때문에 public필드를 없애는 방법으론 리팩토링이 불가능하다 라는 것을 말하는 것일까요?

  1. 책에 대한 질문은 아니지만 질문을 하나씩 올리는 게 더 좋을까요? 아님 아이템 별로 올리는 게 좋을까요? 답변하고 토론하기엔 전자가 좋아보이긴 한데 다들 어떻게 생각하는 지 궁금합니다!

HunkiKim commented 2 years ago

전 하나씩 올리는것도 괜찮아보입니다. 토요일날 이야기해봐요!

Leeyerimearth commented 2 years ago
  1. 저도 그렇게 이해했습니다. public을 없애려고 내부 리펙토링을 하려고해도, 이미 외부에서 이 public 필드를 가져다가 쓰고있기 때문에 없앨 수도 없다. (= 리펙토링을 할 수도없다.)
epicblues commented 2 years ago
  1. 저도 그렇게 생각했습니다. '다른 패키지에 있는' 클래스도 상속을 사용하면 protected 멤버를 사용하거나 재정의할 수 있어서 공개 API라고 한 것 같아요.
  2. 저도 그렇게 생각했습니다!
  3. 저는 전자가 댓글 흐름을 보기 편해서 좋을 것 같은데, 이슈 페이지가 지저분해 보일 수도 있다는 생각은 드네요. 하지만 답변이 완료된(팀원들이 모두 이해했다고 확인된) 질문을 close 한다면 크게 문제 될 것 같지는 않습니다.
kimziou77 commented 2 years ago
  1. 외부에서 사용할 건덕지가 조금이라도 있으면 public이 아니더라도 공개 API라고 칭하는걸까요? 책의 표현을 볼때마다 참 신기하네요... 👀
  2. public으로 지정된 필드를 제거하고 싶다면 보통 @Deprecated 로 선언해 시간을 둔 후에 제거작업도 하는 모양입니다 SpringApplication 클래스에 들어가서 @Deprecated 검색을 해보면 다음과 같은 내용이 나오네요

    @deprecated since 2.5.8 for removal in 2.7.0

    /**
    ... 
    * @since 2.5.7
    * @deprecated since 2.5.8 for removal in 2.7.0
    */
    @Deprecated
    public StandardEnvironment convertEnvironment(ConfigurableEnvironment environment) {
    return new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,
    deduceEnvironmentClass());
    }

    이 경우 해당 메서드를 사용하려고 하면 줄을 그어놓기 때문에 사용하는 쪽에서 해당 메서드를 사용하지 않도록 권고해줍니다 image

즉 리펙터링이 완전히 불가능한건 아니지만, 정말 해당 메서드에 문제가 생겨 제거해야한다면 다음과 같이 사용자에게 알려주는 과정을 해주어야 좋을것 같습니다. 하지만 이런식으로 제거를 한다고 하더라도 실제로 사용자측의 변경을 강제할순 없어서 결국 문제가 안생기리라고는 장담할수 없겠네요 결국 이런 문제를 근본적으로 해결하고자 한다면 설계시점에서 public은 신중하게 열어야 하는 것 같습니다.

  1. 민성님 의견에 동의합니다 ㅎㅎ