로버트 마틴의 클린 코드(Clean Code) 2장 요약
2장 의미 있는 이름
▷ 의도를 분명하게 밝혀라
- 좋은 이름을 지으려면 시간이 많이 걸리지만, 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
- 변수나 함수 그리고 클래스 이름은 존재 이유, 수행 기능과 사용 방법과 같은 굵직한 질문에 모두 답해야 한다. 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다.
키워드: 추상화 레벨(책에는 없는 내용)
[이펙티브 코틀린] 아이템 26. 함수 내부의 추상화 레벨을 통일하라
▷ 그릇된 정보를 피하라
- 널리쓰이는 의미가 "있는" 단어를 다른 "의미"로 사용하면 안된다.
- 서로 흡사한 이름을 사용하지 않도록 주의한다. 유사한 개념은 유사한 표기법을 사용한다. 이것도 정보기 때문에, 일관성이 떨어지는 표기법은 그릇된 정보다.
- 실제 컨테이너가 List인 경우에도 컨테이너 유형을 이름에 넣지 않는 편이 바람직하다(추후 다룸)
▷ 의미있게 구분하라
컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하는 프로그래머는 스스로 문제를 일으킨다.
- 컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하기 못하다. 이름이 달라야 한다면 의미도 달라져야 한다.
- e.g) Product클래스가 있다고 가정하자. 다른 클래스를 ProductInfo, ProductData 라 부른다면 개념을 구분하지 않은 채 이름만 달리한 경우이다. Info나 Data는 a, an, the와 마찬가지로 의미가 불분명한 불용어다.
- a, the 같은 접두어를 사용하지 말라는 의미가 아님. zork 라는 변수가 존재한다고 해서 theZork라는 이름을 지으면 안된다는 의미
▷ 발음하기 쉬운 이름을 사용하라
발음하기 어려운 이름은 토론하기도 어렵다. 프로그래밍은 사회활동이기 때문.
▷ 검색하기 쉬운 이름을 사용하라
- 이름을 의미있게 지으면 함수가 길어지나, 그만큼의 장점이 존재한다. 찾기가 수월하다
▷ 인코딩을 피하라
- 인터페이스 클래스 이름과 구현 클래스 이름 중 하나를 인코딩해야 한다면 구현 클래스 이름을 택해라.
- ShapeFactoryImpl, CShapeFactory가 IShapeFactory보다 좋다.
▷ 자신의 기억력을 자랑하지 마라
문자 하나만 사용하는 변수 이름은 문제가 있다. 루프에서 반복 횟수를 세는 변수 i, j, k는 괜찮다. (I는 절대 안 된다!) 단, 루프 범위가 아주 작고 다른 이름과 충돌하지 않을 때만 괜찮다.
전문가 프로그래머는 남들이 이해하는 코드를 내놓는다.
▷ 클래스 이름
클래스 이름과 객체 이름은 명사나 명사구가 적합하다. 동사는 사용하지 않는다.
- Customer, WikiPage, Account 등이 좋은 예시
- Manager, Processor, Data, Info등과 같은 단어는 피하고, 동사는 사용하지 않는다.
▷ 메서드 이름
- 메서드 이름은 동사나 동사구가 적합하다.
- 접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.
생성자를 중복정의(overload)할 때는 정적 팩토리 메서드를 사용한다. 메서드는 인수를 설명하는 이름을 사용한다.
- Complex fulcrumPoint = new Complex(23.0) (X)
- Complex fulcrumPoint = Complex.FromRealNumber(23.0) (O)
♧ 정적 팩토리 메서드란?
정적 팩토리 메서드(Static Factory Method)
위 링크에서 static factory method의 개념을 알고 난 뒤, Builder 패턴과의 차이가 궁금해서 무엇을 언제 사용하는 것이 좋을지 검색해 보았다.
특히 DTO와 같은 불변 객체를 생성할 때 주로 Static Factory Method, Builder 패턴을 많이 사용하는 것 같다.
내가 생각한 방식은,
- 필드가 많고 null이 존재할 수 있는 값이 있으면 빌더 패턴을,
- 필드가 적고 모든 필드에 null이 존재하지 않아서 반드시 파라미터로 입력을 받아야 할 경우 정적 팩토리 메서드를
사용하는 것이 적합하지 않을까 생각한다.
또한 정적 팩토리 메서드에는 네이밍 컨벤션이 존재하는데, 아래와 같다.
- from : 하나의 매개 변수를 받아서 객체를 생성
- of : 여러개의 매개 변수를 받아서 객체를 생성
- getInstance | instance : 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
- newInstance | create : 새로운 인스턴스를 생성
- get[OtherType] : 다른 타입의 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
- new[OtherType] : 다른 타입의 새로운 인스턴스를 생성.
▷ 기발한 이름을 피하라
재미난 이름보다 명료한 이름은 선택하라.
▷ 한 개념에 한 단어를 사용하라
- 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
- 똑같은 메소드를 클래스 마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
- 마찬가지로, controller, manager, driver를 섞어 쓰면 혼란스럽다.
▷ 의미 있는 맥락을 추가하라
대다수 이름은 스스로 의미가 분명하지 않다. 그래서 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
- firstName, lastName, state (X)
- addrFirstName, addrLastName, addrState (O)
▷ 불필요한 맥락을 없애라
- 일반적으로는 짧은 이름보다는 긴이름이 좋지만, 이것은 의미가 분명한 경우에 한해서임. 이름에 불필요한 맥락을 추가하지 않도록 주의한다.
▷ 마치면서
우리들 대다수는 자신이 짠 클래스 이름과 메소드 이름을 모두 암기하지 못한다. -> 암기는 요즘 나오는 도구에게 맡기고, 우리는 문장이나 문단처럼 읽히는 코드 / 적어도 표나 자료구조처럼 읽히는 코드를 짜는데만 집중해야 마땅하다.
'프로그래밍 도서 > 클린 코드(로버트 마틴)' 카테고리의 다른 글
Clean Code] 7장 오류 처리 (0) | 2023.10.07 |
---|---|
Clean Code] 4장: 주석 (0) | 2023.09.10 |
Clean Code] 3장: 함수 (0) | 2023.08.26 |