ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3장 함수
    DevBook/CleanCode 2021. 7. 1. 16:51

    명령과 조회를 분리하라!

    함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나를 수행하도록 해야 함 -> 객체 상태 변경하거나 아니면 객체 정보 반환하거나 둘 중 하나

    [예시]

    문제) 수행 내용이 명확하지 않은 함수(명령과 조회를 하나의 함수에서 수행함)

    public boolean set(String attribute, String value);

    -> 주어진 함수는 이름이 attribute인 속성을 찾아 값을 value로 설정한 후 성공하면 true를 반환함

    if(set("username", "fordevelop")) . . .

    -> 실제 사용 시 코드를 보면, 'username이 fordevelop으로 설정되어 있는지 확인하는 코드인지' or 'username을 fordevelop으로 설정하는 코드인지' 의미가 모호함 

    해결) 명령과 조회를 분리하기 

    if (attributeExists("username")){
    	setAttribute("username", "fordevelop");
        . . .
    }

    -> attributeExists()을 통해 속성을 조회하고, setAttribute()를 통해 해당 속성에 주어진 값을 설정하도록 함 


    오류코드보다 예외를 사용하라!

    상황) 오류 코드 사용하는 경우

    if (deletedPage(page) == E_OK){
    	if(registry.deleteReference(page.name) == E_OK){
        		if(configKeys.deleteKey(page.name.makeKey() == E_OK){
            		logger.log("page deleted");
            	} else {
            		logger.log("configKey not deleted");
            	}
        	} else {
        	logger.log("deletereference from registry failed");
        	}
    } else {
    	logger.log("delete failed");
    	return E_ERROR;
    }

    -> 여러 단계로 중첩되는 코드 야기함 

    -> 오류 코드 반환 시 오류 코드를 곧바로 처리해야 한다는 문제

     

    개선 상황1) 오류 코드 대신 예외 사용하기 : try-catch 블록 사용하는 경우

    try{
        deletePage(page);
        registry.deleteReference(page.name);
        configKeys.deleteKey(page.name.makeKey());
    }
    catch(Exception e){
    	logger.log(e.getMessage());
    }

    -> but 코드 구조에 혼란을 줄 수 있음 

     

    개선 상황2) 오류 코드 대신 예외 사용하기 : try-catch 블록을 별도의 함수로 뽑아내기

    //예외처리 함수 따로 빼기
    public void delete(Page page){ //예외처리 담당 함수 
        try{
        	deletePageAndAllReferences(page);
        } catch(Exception e){
            logerror(e);
        }
    }
    
    private void deletePageAndAllReferences(Page page) throws Exception { //실제로 삭제 담당하는 함수 
        deletePage(page);
        registry.deletedReference(page.name);
        configKeys.deleteKey(page.name.makeKey());
    }
    
    private void logError(Exception e){
    	logger.log(e.getMessage);
    }

    -> 함수는 한 가지 작업만 해야한다고 했을 때, 오류 처리도 '한 가지' 작업에 속함

    -> 정상 동작과 오류 처리 동작을 분리하여 코드를 가독성 높이고, 수정하기 쉬워짐 


    함수를 어떻게 짜죠?

    마음 가짐 : 소프트웨어를 짜는 행위는 글짓기와 비슷하다! 글을 작성할 때 먼저 생각을 기록한 후 읽기 좋게 다듬는다. 함수를 짤 때도 마찬가지고 처음에는 길고, 복잡하고, 중복된 루프도 많다. 하지만 함수를 다시보며 개선해나가면 된다! 


    인상깊은 말

    시스템은 구현할 프로그램이 아니라 풀어갈 이야기다. 프로그래밍 언어라는 수단을 사용해 풍부하고 표현력이 강한 언어를 만들어 이야기를 풀어간다. 시스템에서 발생하는 모든 동작을 설명하는 함수 계층이 바로 그 언어에 속한다. 

    프로그래밍으로 하나의 이야기를 만든다..! 낭만적이다

    'DevBook > CleanCode' 카테고리의 다른 글

    4장 주석  (0) 2021.07.08
    2장 의미있는 이름  (0) 2021.06.29

    댓글

Designed by Tistory.