ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클린 코드 - 함수 (+ 추상화 수준이란?)
    클린 코드(Clean Code) 2022. 1. 18. 00:01
    728x90

    1. 작게 만들어라

    함수를 만드는 첫 번째 규칙은 '작게!'이며, 두 번째 규칙은 '더 작게!'입니다.

    if문,  while문으로 인한 들여쓰기 수준이 작을수록, 함수가 작을수록 이해하기 쉽습니다.

     

    2. 한가지 일만 해야 한다.

     

    한 가지 일만 하는척하면서 몰래 부수적인 효과를 일으키면 안 됩니다.

    예를 들어 사용자의 정보를 검증하는 UserValidator함수에서 ID와 Password를 검사하는 기능을 수행하고 있습니다.

    이때 함수에서 Session을 초기화하는 기능을 수행해버린다면 부수 효과가 숨겨져 있기 때문에 큰 혼란을 야기할 수 있습니다.

     

    명령과 조회를 분리해야 합니다.

    public boolean set(String attribute, String value);

    위의 함수는 이름이 attribute인 속성을 찾아 값을 value로 설정한 후 성공하면 true 실패하면 false를 반환하는 코드입니다.

    if( set("username" , "unclebob") )

    실제로 사용할 때 위와 같이 사용을 할 텐데 독자 입장에서 코드를 읽어본다면 혼란을 야기할 수 있습니다.

    username이 unclebob으로 설정되어 있는지 확인하는 함수?

    username을 unclebob으로 설정하는 함수?

    만약 함수 이름을 setAndCheckIfExist로 변경해도 되지만 if문 안에 들어가게 되면 형용사로 느껴지기 때문에 어색합니다.

     

    따라서 해결책을 제시한다면 명령과 조회를 분리합니다.

    if(attributeExists("username")){
    	setAttribute("username","unclebob");
    }

     

    함수는 한 가지 일을 해야 하고 그 일을 잘 수행해야 합니다.

     

    그런데 내가 만든 함수가 한 가지 일만 하는지 어떻게 알 수 있을까요?

    지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 합니다.

     

    추상화 수준이란?

    컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말합니다.

     

    즉, 함수의 추상화는 함수가 수행하는 기능을 간추려 내는 것이라고 할 수 있습니다.

     

    회원가입 코드를 예시로 함수의 추상화 수준에 대해 더 설명해 보겠습니다.

    public static void SignUp(String userId, String password, String checkPassword){
    	if(isUserInfoValidate(userId, password, checkPassword)){
        	registerUserInfo(userId,password,checkPassword)
        }
        
     static boolean isUserInfoValidate(String userId, String password, String checkPassword){
     	if(isUserIdExists(userId)) return isPasswordSame();    
        else return false;
     }
     
     static boolean isUserIdExists(userID){ 	
        //userID와 DB의 userID를 비교하는 세부로직이 들어감
     	return true or false //세부로직에 따라 true or false 반환
     }

    SignUP 함수의 경우에는 내부 함수의 세부내용을 세세하게 표현되지 않고 또 다른 함수들로만 내용이 이루어지기 때문에 "추상화 수준이 높다!"라고 할 수 있습니다.

     

    SignUp이 유저 정보도 검사하고, 유저정보도 등록하기 때문에 2가지 일을 하는 거 아닌가요?라고 생각할 수 있습니다.

    하지만 SignUp 함수의 내부는 높은 수준의 추상화(함수로만 구성됨)로만 이루어졌기 때문에 추상화 수준이 하나인 단계로만 수행되므로 한 가지 작업을 한다고 할 수 있습니다.

     

    반대로 isUserIdExists 함수의 경우에는 내부에 세부 로직이 표현되기 때문에 "추상화 수준이 낮다!"라고 할 수 있습니다.

     

    또한 아래의 코드도 추상화 수준을 이해하는데 도움이 될 것 같습니다

    getHtml() //높은 추상화 수준
    String pagePathName = pathParser.render(pagepath); //중간 추상화 수준
    .append("\n") // 낮은 추상화 수준

    3. 내려가기 규칙

    코드를 작성하는 행위는 글짓기와 비슷합니다. 

    코드는 이야기처럼 위에서 아래로 내려가며 읽혀야 합니다.

    main함수 기준에서 추상화가 높은 함수가 왔다면 그다음 함수에는 추상화 수준이 한 단계 낮은 함수가 오면 프로그램을 이야기를 읽듯이 읽을 수 있습니다.

     

     

    4. 함수의 인수는 적을수록 좋다.

    함수에서 이상적인 인수 개수는 0개입니다.

    다음은 1개, 그다음은 2개이며 3개 이상은 가능한 피하는 게 좋습니다.

    코드를 읽는 독자는 인수를 발견할 때마다 의미를 해석해야 하기 때문에 인수가 많아질수록 이해하기 어려워집니다.

     

    만약 위의 회원가입 코드의 인수를 줄이기 위해서는 userId, password, checkPassword를 하나의 객체인 User안의 멤버 변수로 사용하여 User 객체를 사용하여 인수를 1개로 줄일 수 있습니다.

    '클린 코드(Clean Code)' 카테고리의 다른 글

    클린 코드 - 객체와 자료 구조  (0) 2022.01.28
    클린 코드 - 형식 맞추기  (0) 2022.01.23
    클린 코드 - 주석  (0) 2022.01.21
    클린 코드 - 의미 있는 이름  (0) 2022.01.15
    클린 코드 시작  (0) 2022.01.14

    댓글

Designed by Tistory.