Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
[클린 코드] TIL 의미 있는 이름 - 2022.04.24
#clean_code
2년 전
1,393

DAY 2

오늘 공부한 범위 : 2장. 의미 있는 이름

📘 책에서 기억하고 싶은 내용


  • 위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다.

  • 그릇된 정보를 피하라

    • 특수한 의미가 있는 단어는 사용할 때 주의한다.

      • 여러 계정 그룹을 묶을 때, 실제 List가 아니라면 accountList라 명명하지 않는다. => accountGroup, bunchOfAccounts, 아니면 단순히 Accounts라 명명한다.

    • 서로 흡사한 이름을 사용하지 않도록 주의한다.

      • ex) XYZControllerForEfficientHandlingOfStrings와 XYZControllerForEfficientStorageOfStrings

    • 숫자 1처럼 보이는 소문자 l, 숫자 0처럼 보이는 대문자 O를 사용할 때는 주의한다.

  • 검색하기 쉬운 이름을 사용하라

    • ex) 그냥 숫자 7은 찾기어려움 => MAX_CLASSES_PER_STUDENT = 7 과 같이 사용하면 검색하기 용이할 뿐만아니라 의도도 파악 가능하다.

  • 인터페이스 이름은 접두어를 붙이지 않는 편이 좋다고 생각한다.

    • ex) IShapeFactory보다는 ShapeFactoryImp나 CShapeFactory가 보기 좋다.

  • 한 개념에 한 단어를 사용하라

    • 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.

  • 한 단어를 두 가지 목적으로 사용하지 마라. 다른 개념에 같은 단어를 사용한다면 그것은 말장난에 불과하다.

    • add 메서드 : 기존 값 두 개를 더하거나 이어서 새로운 값을 만든다고 가정한다.

    • 집합에 값 하나를 추가하는 새로운 메서드를 작성하려고 하는데 과연 이 메서드를 add라고 불러도 괜찮을까?

    • 답 : No! => 새 메서드는 기존 add 메서드와 맥락이 다르기 때문에 insert나 append라는 이름이 적당하다.

  • 코드를 읽을 사람도 프로그래머이기 때문에 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다!

  • 우수한 프로그래머와 설계자라면 해법 영역(프로그래머가 알아볼 수 있는 영역)과 문제 영역(domain)을 구분할 줄 알아야한다. 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야한다.

  • 의미있는 맥락을 추가하라

    • firstName, lastName, street, houseNumber, city, state, zipcode라는 변수를 보면 주소라는 사실을 알 수 있다. 하지만 만약 어느 메서드에서 state라는 변수 하나만 사용한다면 변수 state가 주소 일부라는 사실을 알 수 있을까?

    • 답 : No! => addr라는 접두어를 추가해주거나 Address라는 클래스를 생성해 의미있는 맥락을 추가해줄 수 있다. (접두어보다는 클래스 생성이 좋음.)


  • 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.

    • Customer, WikiPage, Account, AddressParser 등 좋은 예

    • Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않음.

  • 메서드 이름은 동사나 동사구가 적합하다.

    • postPayment, deletePage, save 등이 좋은 예

    • 접근자(Accessor), 변경자(Mutator), 조건자(Predicate)는 javabean 표준에 따라 값 앞에 get, set, is를 붙임.

      • ex)

      string name = employee.getName();
      customer.setName("mike");
      if (paycheck.isPosted())...
  • 생성자(Constructor)를 중복정의(Overload)할 때는 정적 팩토리 메서드를 사용한다.

    • Complex fulcrumPoin = Complex.FromRealNumber(23.0)아래 코드보다 좋다.

    • Complex fulcrumPoint = new Complex(23.0)

    • 참고로 생성자 사용을 제한하려면 해당 생성자를 private으로 선언!

📗 오늘 읽은 소감


  • "위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다."라는 구절을 보니 예전에 읽었던 [완벽한공부법(저자 고영성, 신영준)]의 지식의 저주가 생각이 난다. 지식의 저주란 어떤 개인이 다른 사람들과 의사소통을 할 때 다른 사람도 이해할 수 있는 배경을 가지고 있다고 자신도 모르게 추측하여 발생하는 인식적 편견이다.(위키백과) 내가 코드를 짜는 이상 간단한 테스트코드를 짜더라도 다른 프로그래머가 본다면 항상 이 코드가 의미하는 것이 무엇인지 정확하게 알 수 있도록 노력해야겠다고 느꼈다.

  • 항상 코드를 짤 때 변수명, 함수명 등을 어떻게 해야 지어야할지 고민이 많았는데 이번 장에서 정말 디테일하게 설명이 되어있어 적극 활용해야겠다라는 생각을 했다.

📙 궁금한 점, 잘 이해되지 않는 점