Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
클린 코드 TIL #6
#clean_code
2년 전
671


TIL (Today I Learned)

2022.03.01

오늘 읽은 범위

6장. 객체와 자료구조

책에서 기억하고 싶은 내용을 써보세요.

  • 자료 추상화

    • 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다.(p.119)

    • 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다.(p.119)

    • 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다.(p.119)

    • 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.(p.119)

  • 자료/객체 비대칭

    • 객체를 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.(p.119)

    • 자료구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.(p.119)

    • 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 함수를 추가하기 쉽지만 모든 함수를 고쳐야 하기 때문에 새로운 자료 구조를 추가하기 어렵다. (p.122)

    • 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽지만 모든 클래스를 고쳐야 하기 때문에 새로운 함수를 추가하기 어렵다.(p.122)

  • 디미터 법칙

    • 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.(p.123)

    • 클래스 C의 메서드 f는 클래스C, f가 생성한 객체, f인수로 넘어온 객체, C인스턴스 변수에 저장된 객체의 메서드만 호출해야 하고 위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안된다.(p.123)

  • 기차 충돌

    • 함수가 반환하는 객체의 함수를 이어서 호출 하는 코드를 기차 충돌이라 부르며 피하는 편이 좋다.(p.123)
      ex) final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath()

    • 코드 형태로 함수가 많은 객체를 포함 한다는 사실을 안다.

    • 객체라면 디미터 법칙을 신경써야 하지만 자료 구조라면 디미터 법칙이 적용되지 않는다.

  • 잡종 구조

    • 절반은 객체, 절반은 자료 구조인 구조이다.

    • 새로운 함수는 물론이고 새로운 자료 구조도 추가하기 어렵다. (p.125)

  • 구조체 감추기

    • 객체라면 뭔가를 하라고 말해야지 속을 드러내라고 말하면 안된다.(p.125)


      (예시처럼 절대경로를 가져오기위해 내부구조를 드러내는 것보다 아예 그 경로를 사용해서 하려는 목적을 객체에게 하라고 하는 것이 더 적당하다)

  • 자료 전달 객체

    • 공개 변수만 있고 함수가 없는 클래스 형태의 자료 구조체를 자료 전달 객체(Data Transfer Object)라 한다.

    • 일종의 사이비 캡슐화로 별다른 이익을 제공하지 않는다.

  • 활성 레코드

    • DTO의 특수한 형태로 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료구조지만, 탐색 함수도 제공한다.

    • 활성 레코드는 자료 구조로 취급한다.

    • 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다.

  • 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하고, 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다.(p.128)

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 이번 챕터를 읽으면서 내가 객체에 대해서 잘못된 지식을 갖고 있음을 깨달았다. 뭔가 너무 단순하게 배웠던 것 같기도하고 잘못 배웠던거 같기도하다... 지금이라도 알아서 다행이랄까... 다시 공부해야겠다는 생각이 들었다.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • VISITOR 패턴 : 방문자와 방문 공간을 분리하여, 방문 공간이 방문자를 맞이할 때, 이후에 대한 행동을 방문자에게 위임하는 패턴이다. 행동의 대상이 되는 객체가 행동을 일으키는 객체를 입력으로 받는다. (객체 구조로 부터 연산이 분리)

    • 작업 대상(방문 공간) 과 작업 항목(방문 공간을 가지고 하는 일)을 분리시킨다.

      • 작업 대상(방문 공간) 은 단지 데이터를 담고있는 자료구조로 만들고,

      • 작업 주체(방문자) 는 visit() 안에 이 작업 대상을 입력받아 작업 항목을 처리하면 된다.

      • 즉, 데이터와 알고리즘이 분리되어, 데이터의 독립성을 높여준다.