본문 바로가기
books

코딩의 기술

by kanlee2010 2021. 10. 4.

오즈 모리하루/윤인성 : 한빛미디어

작고 얇은 책의 분량이지만 필살 기술을 전수 해 주고 싶은 마음으로 다양한 방면에서 꼭 필요한 내용들을 이야기 해주려고 노력한 듯 보입니다. 저자는 일본공학원 하치오지 전문학교 전임 강사로 게임 프로그래밍과 관련한 전반적인 수업을 담당한다고 하는데 다른 저서의 책들은 찾을 수 없었습니다. Slideshare에 3개 자료가 올라와 있는데 한개는 34만 뷰가 넘었네요. (일본어로 작성되어 있어 공부해 볼 수는 없었습니다.)
전체가 3개장으로 구성되어 있으며 첫째장은 클린 코드 구현, 둘째장은 설계, 셋째장은 품질 측정에 대한 내용 입니다. 전반적인 내용은 로버트 마틴의 Clean Code와 Clean Architecture 내용이 많이 들어가 있었습니다. 인상 깊고 좋았던 내용은 1장에서 실제 STL을 활용하여 구현한 예제 코드들과 같이 설명이 된 부분들 이었습니다. 현업에서 사용하기 매우 유용하네요.

아무래도 작고 얇은 책이라 뭔가 아쉬운 생각이 들면 로버트 마틴의 Clean Code와 Clean Architecture를 꼭 읽어야 할 것 같습니다.

 

1장. 읽기 좋은 코드를 작성하는 기술

__1.1__ 읽기 좋은 코드란?
    ① 높은 가독성, 보수성에 영향
    ② 의도를 명확하게 전달
    "복잡한 코드 문제를 작게 나누고, 읽기 좋은 이름을 붙여 정리하자"
    "코드의 문제를 작게 나누려면 해당 문제를 깊이 이해하고 있어야 합니다.
    그리고 알기 쉬운 이름을 붙이려면 분할된 대상의 본질을 제대로 잡을 수 있어야 합니다."

__1.2__ 변수와 상수
    무엇을 해야 하는지에 대한 본질을 이해하지 못하면 적절한 이름을 붙일 수 없습니다.
    ① 의미가 명확한 이름, 사용 목적이 구제적인 이름 → 가독성 향상
    ② 이름있는 상수 → 열거형
__1.3__ 조건식과 계산식
    ① 주석 대신에 설명 전용 const 변수
    ② 조건식 함수화
__1.4__ assert 활용
    사전/사후 조건은 assert로 명시 : assert(0 < cond && "Error string");
__1.5__ 제어문
    if 조건문은 작고 단순하게, 코드의 복잡성은 조건 분기 수에 비례, 실행 경로는 일직선으로 구성되는 것이 가장 이상적
    ① 하한값/상한값 함수 → std::min(), std::max(),
    ② 조기 리턴
    ③ 자료구조(배열) 사용
    ④ 조건식을 결정표로 풀어서,
    ⑤ null을 check하는 if를 줄이기 위해서 null 객체 추가
    ⑥ for loop 줄이기 → STL로 치환
    ⑦ 반복문 최소 단위로 분리 및 중복 제거 후 STL 및 람다식으로 일반화
    ⑧ switch case 내부 함수화, Statechart design pattern으로 리팩토링
__1.6__ 함수
    ① 1개 함수는 1개 역할만(SRP) ← 함수 인자 개수도 최소화
    ② 자연어처럼 읽을 수 있게 함수화 해서 구현(주석이 불필요하게)
    ③ 함수의 변수는 최소로 (0~2개)
    ④ 함수는 단일 기능으로 작게 구현 → 자기 설명적인 코드, 개별 테스트 가능한 코드
    함수화는 중복 제거라는 목적 이외에도 자기 설명적인 코드, 추상도 향상
    → 복잡도 완화 목적으로 중복이 없어도 함수화 필요

__1.7__ 클래스
    큰 함수 분할 → 각 함수 뒤의 명사를 모아서 클래스로
    중복 제거 ← 상속이나 구성으로 구현 (구성을 우선 고려)
    기본 자료형(int, float 등)으로 구성된 멤버 변수 클래스화
    함수의 매개 변수 클래스화
    배열등의 container를 조작하는 전용 클래스
__1.8__ 작은 클래스
    작은 클래스를 사용하면 추상화 레벨을 한 단계 올릴 수 있습니다.
    연산자 오버로드로 단순화
__1.9__ 마치며
    공통된 방식은 복잡한 것을 분할해서 간략화, 작은 덩어리로 나누면, 복잡한 코드를 간략하게 만듬
2장. 간결한 설계를 위한 원칙과 패턴
__2.1__ 객체 지향 설계의 기본
    __2.1.1__ 캡슐화, 응집도, 결합도
    __2.1.2__ 상속과 구성의 관계
        상속보다는 구성을 사용
        기능 상속과 추상 인터페이스 구현
    __2.1.3__ 객체 지향 설계의 원칙 (SOLID)
        단일 책임 원칙 (SRP, Single Responsibility Principle)
        개방 폐쇄 원칙 (OCP, Open-Closed Principle)
        리스코프 치환 원칙 (LSB, Liskov Substitution Principle)
        인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
        의존 관계 역전 원칙 (DIP, Dependency Inversion Principle)
        + 데메테르 법칙 (Law of Demeter)
    __2.1.4__ 디자인 패턴
        GoF의 디자인 패턴 23개에서 중요한
        Template Method 패턴, Strategy 패턴, State 패턴
        Composite 패턴, Iterator 패턴, Observer 패턴, Singleton 패턴
__2.2__ 클래스 설계 요령
    __2.2.1__ 클래스 설계의 기본
    __2.2.2__ 클래스의 역할
        작업 역할 클래스와 관리 역할 클래스
        중재 역할 클래스 (Mediator 패턴)
        창구 역할 클래스 (Facade 패턴)
        생성 역할 클래스 (Abstract Factory 패턴)
        전용 클래스와 범용 클래스
    __2.2.3__ 클래스의 책임
    __2.2.4__ 클래스의 추상도
    __2.2.5__ 클래스 결합
    __2.2.6__ 추상 인터페이스 사용 방법
        클래스 공통화
        구현 수단 교환
        변화하기 쉬운 부분 분리
        부적절한 결합 관계 분리
        패키지 경계 분리
        추상 인터페이스는 사용자 측에 배치
        추상 인터페이스는 분리와 교환을 위한 도구
    __2.2.7__ 그 밖의 주의점 또는 테크닉
        생성자로 완전한 상태 만들기
        멤버 함수 호출 순서화 관련한 대처 방법
        초기화는 생성자, 뒤처리는 소멸자로 시행 (RAII (Resource Acquisitino Is Initialization))
        구현 상세를 은폐하는 이름 붙이기
    __2.2.8__ 클래스 설계 초급 편
        대략적인 클래스 조사
        사용자 관점에서 멤버 함수의 사양을 결정
        멤버 함수 구현
        역할과 책임을 생각하면서 클래스 분할
        결합을 생각
        캡슐화, 응집도, 결합도 확인
    __2.2.9__ 클래스 설계 중급 편
    __2.2.10__ 문제 영역과 구현 영역 분리
        문제 영역을 중심으로 설계
        추상 인터페이스로 분리
        복잡한 것은 여러 개의 계층으로 분리
    __2.2.11__ 클래스 설계 고급 편
        컨셉과 컨텍스트
        규모에 맞는 설계
        코드의 수명
        작업의 편의성
        하나의 방법에 관한 집착
        최소한의 코드만 작성
    __2.3__ 마치며
3장. 소스 코드 품질 측정
    __3.1__ 매트릭스 측정
        __3.1.1__ 파일 또는 함수 단위 메트릭스
            코드 줄 수
            주석 줄 수
            문장 수
            최대 중첩 수
            사이크로매택 복잡도
            Halstead 복잡도
            보수성 지표
        __3.1.2__ 객체 지향 매트릭스
            응집도
            클래스 결합도
            상속의 깊이와 자식 클래스 수
            클래스의 메서드 수
    __3.2__ 코드 클론 검출
    __3.3__ 정적 코드 분석
    __3.4__ 매트릭스 활용 방법
        __3.4.1__ 코딩 규약으로 활용
        __3.4.2__ 코드 리뷰의 우선 순위 결정에 활용
        __3.4.3__ 매트릭스 측정을 목적으로 하기 말기
        __3.4.4__ 매트릭스 측정으로 개발자 평가하지 말기
    __3.5__ 툴 소개
        __3.5.1__ SourceMonitor
        __3.5.2__ Cppcheck
    __3.6__ 마치며

'books' 카테고리의 다른 글

컴퓨터과학이 여는 세계  (0) 2022.04.16
Effective Modern 이펙티브 모던 C++  (0) 2022.04.16
전문가를 위한 C++  (0) 2022.04.16
클린 아키텍쳐  (0) 2022.04.16
클린 코드  (0) 2022.04.16

댓글