[클린 코드] 깨끗한 코드와 의미있는 이름

깨끗한 코드

나쁜 코드?

나쁜 코드에 발목이 잡혀 고생한 경험이 있는가?

이런 코드에선 오류의 단서를 찾으려해도 소용이 없다..

나중에 다시 정리하겠다고 다짐하지만 나중은 결코 오지 않는다

  • 이러한 나쁜 코드들은 개발 속도를 크게 떨어뜨린다.
  • 바꿀 방법이 없다.. 재설계를 할 수 밖에 없다.

좋은 코드를 사수하는 일이 바로 프로그래머의 책임이다.

기한을 맞추며 빨리 가는 방법은 언제나 코드를 깨끗하게 유지하는 습관

깨끗한 코드란 무엇일까?

  • 보기 즐거운 코드
  • 효율이 좋은 코드

    – 단순히 속도만이 아닌 CPU 자원을 낭비하지 않는 코드

  • 가독성이 좋은 코드

    – 해결할 문제의 긴장을 명확히 드러내야 함

    – 반드시 필요한 내용만 담아야 한다.

    – 다른 사람이 고치기 쉬운 코드

  • 테스트 케이스가 있는 코드
  • 중복이 없는 코드
  • 클래스, 메서드, 함수 등을 최대한 줄인 코드

    – 한 객체가 여러 기능을 수행한다면 여러 객체로 나눈다.

    – 기능을 명확히 기술하는 메서드 하나의 기능을 실제로 수행하는 메서드 여러개로 나눈다.

의미 있는 이름

의도를 분명히 밝혀라

의도가 분명한 이름이 정말 중요하다.

변수나 함수, 클래스 이름은 다음 질문에 모두 답해야 한다.

  1. 변수의 존재 이유는?
  2. 수행 기능은?
  3. 사용 방법은?

ex) int d;

  • d는 시간이나 날짜라는 아무 의미도 드러나지 않는다.
  • 이를 표현하기 위해선 int daysSinceCreation과 같은 이름을 사용해야 한다.
  • 코드의 맥락이 코드 자체에 명시적으로 드러나야 한다.

그릇된 정보를 피하라

코드에 그릇된 단서를 남기면 안된다!

  • 이미 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안된다.
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.
  • 유사한 개념은 유사한 표기법을 사용한다

의미있게 구분하라

컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하면 안된다!

  • 연속된 숫자를 덧붙이거나 불 용어를 추가하는 방식은 잘못된 방식

    ex)

      public static void copyChars(char a1[], char a2[]) {...}    // X
    
      public static void copyChars(char source[], char destination[]) {...}    // O
    
  • 읽는 사람이 차이를 알도록 이름을 지어야 한다.

    ex) getActiveAccout(), getActiveAccouts(), getActiveAccoutInfo() - 아무 차이가 없어 보인다.

발음하기 쉬운 이름을 사용하라

발음하기 쉬운 단어를 사용하자

  • DtaRcrd < Customer
  • 지적인 대화가 가능해진다

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

ex) 변수 이름이 e라고 가정하자

  • grep으로 검색하는 순간 모든 단어의 e와 함께 검색될 것
  • 이름을 의미있게 지으면 길어지지만 검색하기 훨씬 쉬워진다.

인코딩을 피하라

유형이나 범위정보까지 인코딩에 넣으면 이름을 해독하기 어려워진다.

  1. 헝가리식 표기법 - 컴파일러가 타입을 점검하지 않았던 시기의 표기법
  2. 접두어 제거 - m_ 같은 접두어는 구닥다리 코드
  3. 인터페이스 클래스와 구현 클래스
    • 인터페이스는 그냥 이름 짓고 구현클래스에 Impl을 붙히자.
    • ex) ShapeFactory와 ShapeFactoryImpl

자신의 기억력을 자랑하지 마라

명료함이 최고다

  • 남들이 이해하는 코드를 짜야한다.
  • ex) int a, b .. 같은 변수는 사용하면 안된다.

클래스 이름

클래스나 객체의 이름은 명사명사구를 사용한다

  • 좋은 예: Customer, WikiPage, Account, AddressParser …
  • 나쁜 예: Manager, Processor, Info …

메서드 이름

동사동사구

  • 좋은 예: postPayment, deletePage, save …
  • 접근자, 변경자, 조건자는 자바빈 표준에 따라 get, set, is로 이름을 붙인다.

기발한 이름은 피하라

재미있는 이름보다는 명료한 이름을 사용해라

  • 특정 문화에서만 사용하는 표현 자제
  • 의도를 분명하고 솔직하게 표현해야 한다.

한 개념에 한 단어 사용

추상적인 개념 하나단어 하나를 선택한다.

  • 똑같은 메서드를 클래스마다 fetch, get으로 제각각 이름붙이면 안된다.
  • 동일 코드 기반에 controller, manager, driver를 섞어쓰면 혼란스럽다.
  • 일관성 있게 코드를 작성해야 한다.

해법 영역에서 가져온 이름을 사용하라

코드를 읽을 사람도 프로그래머 이다.

  • 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어등을 사용해도 괜찮다.

문제 영역에서 가져온 이름을 사용하라

적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다

  • 해법 영역과 문제 영역을 구분할 줄 알아야 한다.
  • 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.

의미 있는 맥락을 추가하라

스스로 의미가 분명한 이름은 있지만 대다수는 그렇지 못하다.

  • 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다
  • 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.
  • ex) firstName, lastName → addrFirstname, addrSecondName

불필요한 맥락을 없애라

의미가 분명한 경우, 짧은 이름이 긴 이름보다 좋다

  • 이름에 불필요한 맥락을 추가하지 않도록 주의해야 함

ex) Gas Station Delux라는 어플리케이션을 작성하는 경우

  • 이름 앞에 모두 GSD를 붙임 → 비효율 적이다. 재사용할 경우 GSD를 모두 지워야함..

homebdy
homebdy 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람.
comments powered by Disqus