티스토리 뷰

Item51에서는 메서드 시그니처를 신중히 설계하라 한다

규모가 큰 프로젝트를 진행할 때 절실히 깨달을 수 있다

개념적으로 유사한 행위를 하는 메서드의 이름이 다를 때, 하나하나 구현 부분을 찾아가 봐야 하고

어떤 기능을 하는지 뭐가 다르길래 이름의 뉘앙스가 다른지를 파악해야 한다

메서드를 작성하는 입장에서는 아주 명확하다고 생각하고 작성했더라도

메서드를 사용하는 입장에서도 과연 그런지 고민해볼 필요가 있다

 

나의 경험으로는 클린 코드를 읽고 서술적인 메서드명에 꽂혀서 표현력 있는 메서드를 작성했다고 뿌듯해했었는데

코드 리뷰에서 개념적 유사성을 고려한 메서드명을 지으라는 피드백을 받은 적이 있다

도메인 엔티티를 수정할 때, 어떤 메서드는 changeXX를 사용하고 어떤 메서드는 editXX을 사용했었다

작성하는 시점에 내게는 의미가 아주 명확했다

필드 단건을 변경할 때 changeXX를 썼고, 여러 필드를 한 번에 변경할 때 editXX을 사용했다

이 메서드를 사용하는 입장에서는 메서드명만을 보고 이 미묘한 뉘앙스를 캐치해 사용할 수 있을까?

주석이라도 달려있으면 모를까 쉽지 않을 것이다

클린 코드를 지향하는 이들에게는 주석조차 잡음일 뿐이니 주석 사용은 임시방편이다

 

외부로 공개되는 Public API라면 더욱 신중해야 한다, 자바는 하위 호환성을 아주 중요하게 생각하고 지원도 잘해준다

자바를 사용하는 개발자 또한 가지고 있어야 할 자세라고 생각한다

물론 인기 있는 라이브러리 제공자 수준까지는 아니어도 의식은 해야 한다

대규모 프로젝트를 생각해보면 멀티 모듈 또는 MSA 구조로 되어있을 것이고

하나의 모듈에서의 메서드 이름 변경은 여러 모듈에 영향을 줄 수 있다

core 같은 핵심 모듈에서 공개되는 메서드 이름을 변경한다면

멀티 모듈에서는 새로 컴파일한 후 배포해야 하고 MSA에서는 각각의 서비스를 다 컴파일한 후 배포해야 한다

이것만으로도 메서드 이름을 신중하게 지어야 할 이유는 충분하다

 

객체지향 설계를 어느 정도 이해했다면 다음은 편의 메서드를 고려해볼 때다

여러 컴포넌트에서 발생하는 중복을 줄이고 책임을 몰아넣기 위해

Helper, Util 등의 클래스로 공통화할 때가 있을 텐데 정말 필요한 메서드인지 생각해봐야 한다

공통화를 남발하다 보면 자칫 Helper 클래스가 엄청나게 비대해지고 사실 상 핵심 로직이 다 들어있다

역할과 구현을 철저하게 분리하고 메서드를 작성할 때 해당 클래스의 책임이 맞는지 고민해보자

 

책임에 대한 한 가지 예로 Enum에서의 대소문자를 가리지 않는 valueOf가 있다

enum이 기본으로 제공하는 valueOf는 대소문자를 가린다

요럴 때 apache.common.lang이 제공하는 EnumUtils를 사용할 수 있는데

이미 만들어져 있는 메서드를 사용하면 되니 나쁘지 않은 방법이지만 클라이언트가 EnumUtils를 사용하도록 강제한다

대소문자를 가리지 않고 생성하는 책임을 누가 가져야 할까?

해결책 중 하나로 enum으로 넘겨버리는 방법이 있다

enum 내부에서 EnumUtils를 사용하거나 String.upperCase()로 직접 대문자로 바꿔 반환해주면 된다

 

메서드의 매개변수 또한 중요하다, 메서드 시그니처에서 매개변수 이름도 신중히 지어야 한다

맥북에서 cmd + p를 누르면 매개변수 목록이 보이는데 표현력 있는 이름을 사용했다면 메서드를 찾아가지 않고도

어떤 인자들을 넘겨야 하는지 확실하게 알 수 있고 어떤 기능을 하는지도 파악하기 쉽다

매개변수 개수는 적을수록 좋고 없으면 가장 좋다

현실적으로 매개변수 없는 메서드 작성하기가 쉽지는 않으니 매개변수가 여러 개라면

여러 개들을 묶어줄 수 있는 클래스를 따로 만들어 응집력을 높일 수 있다

 

마지막으로 매개변수는 가능한 상위 타입으로 지정해두면 좋다

변경 가능성이 거의 없다면 구현 클래스로 해도 되지만 확장성을 고려해 인터페이스로 받으면

클라이언트에 영향을 주지 않고 내부를 변경할 수 있다

List, Set, Map 으로 받지 말고 Collection으로 받는 식이다

내부 구현에서 List 특화 기능을 사용해야 한다면 Collection으로 받지 말거나 강제 형 변환을 때려야 한다

다만 강제 형 변환은 에러 발생하기 딱 좋으니 지양해야 한다

댓글
링크
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday