이론/설계

클린코드 6장 (객체와 자료 구조)

tsyang 2021. 5. 10. 00:31

6장 - 객체와 자료 구조


흔히 필드를 private로 선언하고 getter, setter를 public으로 놓는데 이게 뭔 의미가 있을까? 저자인 로버트 C. 마틴도 `조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지는 않는다.` 라고 말한다. 그보다는 추상 인터페이스를 제공해야 한다고 말한다. 즉, 자료를 하나하나 공개하기보다는 추상적인 개념으로 묶어서 표현하는 것이 좋다.

public interface FuelTank
{
    double getFuelTankCapacity();
    double getFuel();
}

public interface FuelTank
{
    double getPercentFuelRemaining();
}

즉, 위에꺼보다 아래꺼가 낫다. 개발자는 자료를 표현할 가장 좋은 방법을 고민해야 한다. 그저 조회/설정 함수를 추가하는 것은 나쁜 방법이다.

 

자료구조는 아무런 메서드를 제공하지 않는 클래스(구조체)이다. 당연히 내부 구조를 노출하게 된다.

 

자료구조는 절차적인 코드와 쓸 수 있다.

 

public class Square
{
    public Point topLeft;
    public double side;
}

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

public class Geo
{
    public double GetArea(Object shape)
    {
        switch (shape)
        {
            case Circle c:
                return PI * c.radius * c.radius;
            case Square s:
                return s.side * s.side;
        }
    }
}

객체지향 관점에서는 좋지 않은 코드이다. 그러나 장점도 있는데 만약 Geo 클래스에 둘레길이를 구하는 함수를 추가한다면? 도형 클래스(자료구조)들은 아무런 수정이 필요하지가 않다. 

 

반면 객체지향적인 코드를 짰다면 모든 도형 클래스에 수정이 필요하다. (도형 클래스들이 shape인터페이스를 구현하고.. shape에 메서드를 추가할 태니) 물론 Visitor 패턴이나 Dual-Patch 기법을 사용하면 되나, 얘네도 문제가 있다.

 

물론 절차지향적 코드에도 문제가 있다. 새로운 도형 클래스를 추가하려면 Geo클래스를 수정해야 한다. 

 

정리하자면,

  • 새로운 자료 타입이 필요한 경우가 생길 것이라면 클래스와 객체 지향 기법이 적합.
  • 새로운 함수가 필요한 경우라면 절차적인 코드와 자료 구조가 적합.

모든 것이 객체라는 생각은 미신이다. 때로는 자료 구조와 절차적인 코드가 적합하다.

 


디미터 법칙

모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다.

 

클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다.

  • 클래스 C
  • f가 생성한 객체
  • f 인수로 넘어온 객체
  • C 의 인스턴스에 저장된 객체

반환하는 객체의 메서드 호출이 빠져있다는것에 주목하자. 또한 디미터 법칙은 객체에 대한 법칙이다. 자료 구조는 해당이 되지 않는다.


자료 구조의 종류

 

잡종 구조

절반은 객체, 절반은 자료 구조인 그런건 그냥 쓰지마라. 둘의 단점만 모아놓은 셈이다.

 

자료 전달 객체 (DTO)

자료 구조의 전형적인 형태로, 공개 변수만 있고 함수는 없는 클래스이다.

 

빈(bean)

DTO의 한 형태로 private 변수에 조회/설정 함수를 추가한거다. 이건 별다른 이익이 없는 사이비 캡슐화이다. 

 

활성 레코드

DTO의 한 형태로 save, find같은 탐색 함수도 제공한다. 활성 레코드는 자료 구조로 취급해야 한다.


요약 

  • 객체는 동작(메서드)를 공개하고 자료(필드)를 숨긴다. 자료구조는 메서드가 없고 자료는 노출시킨다.
  • 객체와 객체지향 코드는 메서드를 추가할 경우 유연성이 없고 객체를 추가할때 유연성이 있다.
  • 자료구조와 절차지향 코드는 메서드를 추가할 때 유연이 있고 자료 구조를 추가할 때 유연성이 없다.
  • 상황에 따라 둘을 잘 쓴다.

'이론 > 설계' 카테고리의 다른 글

클린 코드 - 경계  (0) 2021.06.13
클린코드 7장 - 오류 처리  (0) 2021.05.21
클린코드 4,5장 (주석, 형식)  (0) 2021.05.07
클린 코드 2,3장 (이름, 함수)  (2) 2021.05.02
클린 아키텍쳐  (0) 2021.04.25