본문 바로가기
개발방법론

[Clean Code] 깨끗한 코드란(클린코드)?

by byeongoo 2020. 4. 2.

깨끗한 코드란 무엇일까요? 이제 막 2년차가 된 제가 요새 생각하고있는 부분입니다. 기존 코드를 살펴보다보면 이거는 이렇게 바꾸면 더 깔끔하지 않을까, 이 부분은 공통화를해서 관리했어야하지 않을까? 단순히 주어진 업무를 받아서 하는 수준에서 이제는 기존코드를 어떻게 바꿔야할지에 대해서 고민을 많이하고 있습니다. 이에 대한 기준을 얻기 위해 최근 많은 전문가들이 함께 고민해서 클린 코드에 대해서 제시하는 클린 코드를 구매하여 읽고 있습니다. 

 

1. 클린 코드 철학 

  • 정리(정렬) : 적절한 명명법 등과 같은 방법을 사용해 무엇이 어디에 있는지 알아야합니다.
  • 정돈(체계화) : 물건마다 모두 제자리에 있다라는 속담처럼 코드는 누구나 예상하는 위치에 있어야합니다.
  • 청소(광내기) : 과거이력이나 미래 바람을 기억한 주석 혹은 주석으로 처리한 코드는 제거하기 바랍니다.
  • 청결(표준화) : 그룹 내에서 일관적인 구현 스타일과 기법. 표준화
  • 생활화(규율) : 관례를 따르고, 자기 작품을 자주 돌아보고 기꺼이 변경하는 규율

읽기 좋은 코드는 작동하는 코드만큼 중요합니다. 지속적으로 코드 리팩토링을 진행해야합니다. 그렇지 않으면 몇년마다 한번씩 소프트웨어를 새로 만들어야 할 것입니다. 또한 나쁜 코드는 쌓일수록 팀 생상선을 떨어트립니다. 기한을 맞추기 위해서는 나쁜 코드를 양산할 수 밖에 없다고 느낍니다. 하지만 빨리가는 유일한 방법은 언제나 코드를 최대한 깨끗하게 유지하는 것 입니다. 깨진 창문이라는 용어가 있습니다. 창문이 깨진 건물은 누구도 상관하지 않는다는 인상을 풍깁니다. 외벽에 낙서를 방치하고, 차고에 쓰레기가 쌓여도 치우지 않습니다. 창문이 깨지고 쇠퇴하는 과정이 진행됩니다.

 

다음으로는 깨끗한 코드에 대한 많은 전문가들의 정의가 있는데, 그래디 부치, 빅 데이브 토마스, 론 제프리스 등의 말을 인용해서 적어 보겠습니다.

 

깨끗한 코드는 단순하고 직접적입니다. 잘 쓴 문장처럼 읽히고 결코 설계자의 의도를 숨기지 않습니다. 명쾌한 추상화와 단순한 제어문으로 가득합니다. 단위테스트 케이스와 인수 테스트 케이스가 존재합니다. 의존성을 최소이며 각 의존성을 명확히 정의합니다. 

 

  • 모든 테스트를 통과합니다
  • 중복이 없습니다.
  • 시스템 내 모든 설계 아이디어를 표현합니다.
  • 클래스, 메서드, 함수 등을 최대한 줄입니다.
  • 짐작했던 기능을 그대로 수행합니다.
  • 의미있는 이름을 짓습니다.
  • 작게 추상화합니다.

2. 의미있는 이름

다음으로는 의미있는 이름에 대해서 알아보겠습니다. 패키지이름, 클래스 이름, 변수 이름, 메소드 이름을 지을 때는 의도가 분명하게 이름을 지어야 합니다. 기존 이름보다 더 나은 이름이 있다면 변경하는 작업을 진행해야합니다. 예를 들어서 서로비슷한 이름을 사용하지 않도록 주의해야합니다. "data", "info" 이런 단어는 서로 비슷하며 무엇이 다른지 구분하기 힘듭니다. 의미있는 이름을 짓는 몇가지 방법을 소개해드리겠습니다.

 

  • 발음하기 쉬운 이름을 사용합니다.
  • 이름의 의도를 명확하게 합니다.
  • 검색하기 쉬운 이름 사용합니다. 이름 길이는 범위 크기에 비례해야합니다. 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직합니다.
  • 클래스 이름이나 객체 이름을 지을 때는 명사나 명사구가 적합합니다. "Customer", "Account", "AddressParser" 등이 좋은 예시입니다. "Manager", "Processor", "Data", "Info" 등과 같은 단어는 피하고 동사는 사용하지 않습니다.
  • 메소드 이름을 지을 때는 동사나 동사구가 적합합니다. "postPayment", "deletePage", "save" 등이 좋은 예시입니다.변경자, 조건자는 javabean표준에 따라 값앞에 get, set, is를 붙입니다.

생성자를 중복정의 할 때는 정적 팩토리 메서드를 사용합니다. 메서드 인수를 설명하는 이름을 사용합니다.

Complex fulcrumPoint = Complex.FromRealNumber(23.0);

위의 코드가 아래 코드 보다 좋습니다.

Complex fulcrumPoint = new Complex(23.0);
  • 한 단어를 가지고 두가지 목적으로 사용하면 안됩니다. 예를 들어 상품 등록의 경우, 업데이트의 경우, 2개다 가능한경우 사용하는 단어가 달라져야합니다.
  • 해법 영역과 문제영역에서 가져온 이름을 사용합니다. 코드를 읽는 사람도 개발자이기 때문에 전산용어, 알고리즘이름, 패턴 이름, 수학 용어 등을 사용해도 됩니다. 적절한게 없다면 문제영역에서 이름을 가져옵니다.
  • 불필요한 맥락을 없애야합니다. 일반적으로 짧은 이름이 긴 이름보다 좋습니다. 단, 의미가 분명한 경우여야합니다.
  • 기발한 이름은 피합니다.

클린 코드를 작성하는 시작은 이름 짓기입니다. 코드 개선을 위한 노력과 마찬가지로 이름을 바꿀 경우 누군가는 질책할수도 있습니다. 그렇다고 코드를 개선하는 노력을 중단해서는 안됩니다.