개발/프로그래밍

클린코드 - 객체와 자료구조

덤벨로퍼 2020. 10. 6. 17:05

자료를 세세하게 공유하기보다 추상적인 개념으로 표현하는게 좋다.

아무생각없이 get set 함수를 만드는것은 추상화를 이루지않는다.

 

객체는 자료를 숨기고

자료를 다루는 함수만 공개한다.

 

자료구조는 자료를 공개하고

함수가 없다.

 

 

class Square {
  Point topLeft;
  double side;
}

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

class Geometry {
  final double pi = 3.14;

  double area(dynamic shape) {
    if (shape is Square) {
      Square s = shape;
      return s.side * s.side;
    } else if (shape is Rectangle) {
      Rectangle r = shape;
      return r.height * r.width;
    }
  }
}

위 클래스는 자료구조를 사용한 절차적인 클래스이다.

만약 area 가아닌 다른 함수, 예로 둘레를 구하는 새로운 함수를 구현할때

Square 라는 클래스(자료구조)는 영향받지 않는다.

즉 새로운 함수를 구현할때마다 자료 구조를 변경하지 않는다.

 

하지만 새로운 자료구조 (도형 타입) 이 나오면 Geometry 의 함수들을 다 고쳐야한다.

만약 앞으로 구현해야할 시스템에 삼각형, 원, 오각형 등등... 이런식으로 필요하다면 이렇게 구현하면 안된다.

더 이상의 자료구조가 필요없고  도형의 길이, 반지름, 변의갯수 둘레 등등... 이런식으로 새함수가 필요하다면

이렇게 구현하는게 좋다.

 

 

class Square implements Shape {
  Point topLeft;
  double side;

  @override
  double area() {
    return side * side; 
  }
}

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

  @override
  double area() {
    return height * width;
  }
}

위 클래스는 객체지향적이다. 새 도형 (자료구조) 을 추가해도 기존 함수들을 영향을 받지않는다.

하지만 area가 아닌 다른 새로운 함수를(Shape에서) 추가하려면 각 도형마다 다 수정해줘야한다.

계속해서 새로운 자료구조가 필요한경우 이방법을 쓰는게좋다.

 

 

정리하여

함수보다 새로운 자료구조가 필요한 경우 객체지향 방법을 사용

새로운 함수가 필요한경우 자료구조와 절차적인 코드가 더 적합하다.