[개발도서] CleanCode 1~3장

2 분 소요

CleanCode 책을 읽고…

Clean Code 3장 함수 부분까지 읽고, 3가지 질문으로 정리를 해본다.

  1. Clean Code는 왜 중요한가?
  2. Clean Code는 무엇인가?
  3. Clean Code는 어떻게 실제 코드에 적용시킬 수 있는가?

Clean Code는 왜 중요한가?

저자가 말한 Clean Code를 중요성은 개발 시간 절약에 있다. 나쁜 코드를 작성했을 때 새로운 기능을 추가하거나 기존의 소스 코드를 변경하면 개발 시간이 기하급수적으로 늘어나는 걸 보여줬다. 개발시 코드 입력 시간과 읽는 시간의 비율이 9:1인 것을 통해 가독성이 떨어지는 코드는 개발자의 생산성을 떨어트릴 수 있다는 걸 보여줬다.

Clean Code를 적용하지 않고 빠른 기능 개발을 우선시 하는 프로젝트가 있다면, 오히려 실제 개발 과정이나 이후 유지보수할 때 시간과 물질적 자원을 더 소비하게 된다는 것을 말해준다. 그러므로 가진 자원의 절약과 생산성 유지를 위해 개발과정에서 Clean Code를 적용하는 것이 나와 다른 개발자들에게 필요하다.

Clean Code는 무엇인가?

책에서 나왔듯이 Clean Code의 기준에 정답은 없다. 하지만 이전에 권위있는 개발자들의 이야기를 통해서 일반적으로 Clean Code를 이루고 있는 구성요소들을 추출해볼 수 있다.

  1. 코드간의 낮은 의존성
  2. 철저한 오류 처리
  3. 테스트 코드
  4. 가독성
  5. 명확한 한가지 기능
  6. 중복 최소화

Clean Code에 대한 책의 개발자들 정의는 6가지 구성요소로 이루어진다. 일반적으로 우리들이 하는 프로젝트가 6가지의 요건을 충족한다면 Clean Code를 적용한 것으로 보면 될 것 같다.

Clean Code를 어떻게 적용할 것인가?

  1. 의미 있는 이름 짓기

    • 분명한 의도 명시

      • 수정시간 : int d; -> int daysSinceModification;
    • 그릇된 정보 명시 금지

      • 고객 정보가 담긴 배열 : accountList -> accoutGroup 또는 Account
    • 의미 있는 구분

      • 시작날짜, 종료날짜 : date1, date2 -> startDate, endDate
    • 발음하기 쉬운 이름

      • 생성시간 : Date genymdhms -> generationTimestamp
    • 검색하기 쉬운 이름

      • 학생당 최대 청강 수 : int e -> int MAX_CLASSES_PER_STUDENT
    • 인코딩 명시(헝가리 표기법) 금지

      • 핸드폰 번호 : phoneString -> phone
    • 클래스 이름

      • 명사 & 명사구 사용
      • Customer, WikePage, Account
    • 메서드 이름

      • 동사 & 동사구 사용
      • postPayment, deletePage, save
    • 한 개념에 한 단어 사용

      • controller, manager, driver -> controller로 통합
    • 의미 있는 맥락 추가

      • firtName, lastName -> addrFirstName, addrLastName
    • 불필요한 맥락 삭제

      • GSDAccountAddress [Class] -> AccountAddress [Class] , GSDAccountAddress [Instance]
  2. 함수

    • 함수는 작아야 하며, 한가지 일만 수행해야 한다.

      • 함수는 1~30줄 정도가 적당한 것 같다.
      • 함수는 내부의 코드들이 추상화 수준이 동일하면 한가지 일을 수행하는 것으로 본다.
    • 내려가기 규칙

      • 코드는 글을 읽듯이 위에서 아래로 추상화 수준을 낮춰가며 작성한다.

        def eat(food) :
        	if food ==  :
            useSpoon()
          elif food == 반찬 :
            useChopstics()
                   
        def useSpoon():
          pass
               
        def useChopstics():
          pass
        
    • 함수 인자는 최소화

    • 함수의 인자는 늘어날수록 개발자에게 생각할 여지를 주기 때문에 최소화하는 것이 좋다.
    • 0개(무항) Best : getHtml()
    • 1개(단항) : fileExists(fileName)
    • 2개(이항) : writeField(outputStream, name)
    • 3개(삼항) 이상 Worst : assertEquals(message, expected, actual)

    • 부수 효과 금지

      • 함수명에서 나타나는 기능 이외에 다른 부수적인 기능을 내부에서 수행하게 되면 의도치 않은 버그가 발생할 수 있다.

        public class UserValidator {
        private Crtptographer cryptographer;
               
        public boolean checkPassword(String userName, String password) {
        	User user = UserGateway.findByName(userName);
        	if (user != User.NULL) {
        		String codedPhrase = user.getPhraseEncodeByPassword();
        		
        		if (Valid Password.equals(phrase)){
        			// Session.initialize() // 유저 유효성 검사 내부에 부수적 효과 Seesion 초기화 존재 
        		}
        		
        	}
        }
        
    • 오류코드 보다 예외 사용

      • 오류 코드는 새로 생성되거나 변경될 수 있기 때문에 Try Catch를 통해 예외 처리하는 것이 좋다.

결론

Clean Code를 3장까지 읽으며 내가 평소에 적용하고 있던 것도 있지만, 그릇된 정보 명시 금지처럼 코드 작성에 있어 미숙한 부분이 있다는 것을 알 수 있었다. 그래서 미숙했던 부분들은 이후 코드를 작성을 할 때 더 주의를 기울이며 개발과정에서 보완해 나갈 것이며, 기존에 짰던 내 코드들을 리팩토링 하는 시간들을 가져볼 것이다.

카테고리:

업데이트: