kimyu0218
  • [Good Code, Bad Code] 2장 추상화 계층
    2024년 02월 01일 04시 05분 53초에 업로드 된 글입니다.
    작성자: @kimyu0218

    추상화로 문제의 본질에 집중하기

    미술에서 "추상화"는 실제 대상을 단순화하거나 왜곡하여 본질을 강조하는 예술적 기법을 의미한다. 소프트웨어에서 추상화도 이와 유사한 의미를 갖는다. 추상화는 구체적이고 특정한 것에서 벗어나 핵심적인 특징에 집중하는 것이다.

    🧑‍🎨 : 구체적인 부분은 무시하고 사물의 본질만 다룰 거야
    🧑‍💻 : 세부 사항은 무시하고 핵심 기능에 집중할 거야

    커다란 문제를 여러 개의 하위 문제로 쪼개면 한 계층에서는 쉽게 이해할 수 있는 소수의 개념만을 다룬다. 전체적으로 봤을 땐 규모가 큰 문제지만 개별 문제는 상대적으로 그 복잡도가 낮아진다.
     

    • 가독성 - 모든 세부사항을 이해하긴 어렵지만, 작게 분리된 개념을 이해하는 것은 상대적으로 쉽다. 
    • 모듈화 - 계층을 분리함으로써 구현 사항이 다른 계층에 영향을 미치지 않는다.
    • 재사용성 & 일반화성 - 최소한의 핵심 기능만을 가지고 있기 때문에 다른 프로젝트에서 재사용하고, 일반화하기 쉬워진다.
    • 테스트 용이성 - 소수의 개념만 다루므로 복잡도가 낮아 테스트하기 용이하다.

    함수를 이용한 추상화

    함수가 하나의 잘 써진 문장으로 읽히는가

    이상적인 함수는 단일 업무를 수행한다. 함수를 작게 만들어 하나의 명확한 업무만 수행하도록 하면 가독성과 재사용성을 높일 수 있다.
     

    클래스를 이용한 추상화

    클래스 내부 요소들이 응집력이 있고, 한 가지 일에 집중하고 있는가

    함수와 마찬가지로 클래스도 단일 업무에 관심을 가져야 한다. 응집력이 강한 요소들만 포함하여 클래스에 방대한 내용이 들어가는 것을 예방하면 가독성과 재사용성을 높일 수 있고 테스트도 훨씬 쉬워진다.
     

    인터페이스를 이용한 추상화

    특정 계층에서 정의해야 하는 메서드나 속성을 제공하여 퍼블릭 API를 명확하게 제공한다. 다른 모듈에 구현 세부 사항을 노출하지 않음으로써 다른 부분 간 결합도를 최소화할 수 있다.


    추상화 적용해보기

    아주 간단한 프로그램에 추상화를 적용해봤다. 주중 시간표를 출력하는 프로그램으로, 사용자의 입력값을 바탕으로 시간표에 일정을 추가한다.

     

    시간표 프로그램은 크게 두 가지 기능으로 나눌 수 있다. 하나는 사용자의 입력값을 검증하고 시간표를 출력하는 기능, 다른 하나는 시간표를 관리하는 기능이다.

    • 시간표 입력 받고 출력하기
    • 시간표 관리하기

    각 기능은 좀 더 작은 하위 기능으로 분리할 수 있다. 먼저 시간표를 입력하고 출력하는 기능은 다음 하위 기능으로 쪼갤 수 있다.

    • 사용자의 입력값을 검증하고 파싱하기
    • 시간표 출력하기

    시간표 프로그램은 주중 시간표를 관리하는 프로그램으로, 월요일부터 금요일까지 시간표를 출력한다. 즉, 시간표 어플리케이션은 일별 시간표를 관리하고 이를 한 번에 출력한다. 시간표를 관리하는 기능은 상위 계층으로 주중 시간표를 두고, 하위 계층에서 일별 시간표를 관리하도록 구현했다.

    위와 같이 추상화를 구현했더니 테스트 파일을 작성하기 용이했다. 소수의 기능만 다루고 있기 때문에 테스트 파일이 방대해지는 것을 막을 수 있었다.

     

    또한 어느 부분에서 오류가 발생한 것인지 추적하기 굉장히 쉬웠다. 기존에는 시간표 출력 부분과 관리 부분이 분리되지 않아 잘못된 시간표를 출력하는 경우 출력에서 오류가 난 것인지, 시간표 관리에서 오류가 난 것인지 확인하기 어려웠다.

    하지만 출력 부분과 관리 부분을 분리함으로써 오류 추적이 쉬워졌다. 올바른 시간표를 정상적으로 출력하는 테스트가 통과한다면 오류가 발생한 곳은 시간표 관리 부분인 것이다.

    '학습기록 > 독서' 카테고리의 다른 글

    [Good Code, Bad Code] 1장 코드 품질  (1) 2024.01.24
    댓글