본문 바로가기

BOOK Review

[클린코드] TIL - 6장 객체와 자료 구조

🤍 TIL (Today I Learned)

  • 자료 추상화
    • 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋음
    • 인터페이스 조회/설정 함수만으로는 추상화가 아님
  • 자료/객체 비대칭
// 절차적인 도형
public class Square {
    public Point topLeft;
    public double side;
}

public class Rectangle {
    public Point topLeft;
    public double height;
    public double width;
}

public class Circle {
    public Point center;
    public double radius;
}

public class Geometry {
    public final double PI = 3.141592653589793;

    public double area(Object shape) throws NoSuchShapeException {
        if (shape instanceof Square) {
            Square s = (Square) shape;
            return s.side * s.side;
        } else if (shape instanceof Rectangle) {
            Rectangle r = (Rectangle) shape;
            return r.height * r.width;
        } else if (shape instanceof Circle) {
            Circle c = (Circle) shape;
            return PI * c.radius * c.radius;
        }
        throw new NoSuchShapeException();
    }
}
// 다형적인 도형
public class Square implements Shape {
    public Point topLeft;
    public double side;

    public double area() {
        return side * side;
    }
}

public class Rectangle implements Shape {
    public Point topLeft;
    public double height;
    public double width;

    public double area() {
        return height * width;
    }
}

public class Circle implements Shape {
    public Point center;
    public double radius;
    public final double PI = 3.141592653589793;
    
    public double area(){
        return   PI * radius * radius;
    }
}
  • 두 가지 코드는 상호 보완적인 특질을 가짐
    • 절차지항적 코드
      • 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉬움
      • 새 자료 구조를 추가하기 어려움 -> 모든 클래스의 수정이 필요
    • 객체지향적 코드
      • 기존 함수를 변경하지 않으면서 새 클래스 추가하기 쉬움
      • 새 함수를 추가하기 어려움 -> 모든 클래스 수정이 필요
    • 결론
      • 새로운 자료 타입이 필요한 경우 -> 객체 지향 기법 적합
      • 새로운 함수가 필요한 경우 -> 절차적인 코드와 자료구조가 적합
      • 늘 객체 지향이 옳은 것은 아님
  • 디미터 법칙 
    • 모듈은 자식이 조작하는 객체의 속사정을 몰라야 함 (객체는 자료를 숨기고 함수를 공개)
  • 자료 전달 객체
    • 공개 변수만 있고 함수가 없는 클래스 (DTO)
    • 활성 레코드 - DTO의 특이한 형태 - get뿐만 아닌 save/finve 함수도 제공
    • 활성 레코드에 비즈니스 규칙 메서드를 추가하게 되면 자료 구조도 아니고 객체도 아닌 잡종 구조가 됨
    • -> 내부 자료는 활성 레코드의 인스턴스에서 설정

❤️ 오늘 읽은 범위

6장 객체와 자료구조

🩷 기록

객체 지향 구조를 지향해야 된다는 이야기들을 정말 많이 듣고, 자바를 학습 할 때부터 객체 지향의 중요성을 익히 들어온 바 있다. 클린 코드에서는 그와 반대로 절차지향과 객체 지향을 용도에 맞게 사용하라고 이야기한다.

최근 프로젝트의 구조를 만들면서 객체 지향으로 만들기 위해 abstract를 활용한 코드를 짜다가 각 클래스마다의 차이로 인해 난항을 겪은 적이 있다. '각 클래스마다 비슷한 듯 다른데 어떻게 리턴 타입을 동일하게 abstract로 만들 수 있을까', '새 함수가 필요한데 특정 클래스에서 필요하지 않는 건 어쩌지' 등의 고민이었는데, 어쩌면 객체 지향적인 방법을 굳이 고수할 필요가 있었을까 라는 의문이 들게 했다.