개발/프로그래밍
클린코드 - 객체와 자료구조
덤벨로퍼
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에서) 추가하려면 각 도형마다 다 수정해줘야한다.
계속해서 새로운 자료구조가 필요한경우 이방법을 쓰는게좋다.
정리하여
함수보다 새로운 자료구조가 필요한 경우 객체지향 방법을 사용
새로운 함수가 필요한경우 자료구조와 절차적인 코드가 더 적합하다.