Clean Code 스터디 내용 정리; 6장 객체와 자료구조
이 장에서는 객체와 자료구조의 차이와 특징 그리고 바람직한 구현방법을 소개한다.
객체
- 추상화 뒤로 자료를 숨긴다. 구현을 외부로 노출하지 않는다.
- 자료를 다루는 함수만 공개한다.
- 객체 지향 코드는 새로운 함수를 추가하려면 모든 클래스를 고쳐야 하기 때문에 어렵지만, 기존 함수를 변경하지 않으면서 새 클래스를 추가하기는 쉽다.
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
<객체 지향 코드>
public class Square implements Shape {
private Point topLeft;
private double side;
public double area() {
return side * side;
}
}
public class Rectangle implements Shape {
private Point topLeft;
private double height;
private double width;
public double area() {
return height * width;
}
}
자료구조
- 자료를 그대로 공개한다. 구현을 외부로 노출한다.
- 별다른 함수를 제공하지 않는다.
- 자료구조를 사용하는 절차적 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기는 쉽지만, 새로운 자료 구조를 추가하려면 모든 함수를 고쳐야 하기 때문에 어렵다.
- 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는, 자료 전달 객체(DTO)이다. 활성 레코드 또한 DTO의 특수한 형태이므로 자료 구조로 취급해야 한다.
public class Point {
public double x;
public double y;
// 변수를 private으로 선언하여도 각 값마다 getter와 setter를 제공하면 구현을 외부로 노출하는 것.
}
<절차적 코드>
public class Square {
public Point topLeft;
public double side;
}
public class Rectangle {
public Point topLeft;
public double height;
public double width;
}
public class Geometry {
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;
}
}
}
잡종 구조
- 절반은 객체, 절반은 자료 구조인 건 잡종 구조에 불과하다.
- 양쪽의 단점만 모아놓은, 새로운 함수를 추가하기도 어렵고 새로운 자료 구조도 추가하기 어려우므로 되도록 피하는 게 좋다.
새로운 자료 타입을 추가하는 유연성이 필요하다면 동작을 공개하고 자료를 숨기는 객체가 더 적합하고, 새로운 동작을 추가하는 유연성이 필요하면 별다른 동작 없이 자료를 노출하는 자료 구조와 절차적 코드가 더 적합하다. 드러낸 것을 변경하는 것은 어렵다
고 기억해두면 좋겠다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해하여 최적의 해결책을 선택한다.
'STUDY > Books' 카테고리의 다른 글
[Clean Code] 8장 경계 (0) | 2021.05.24 |
---|---|
[Clean Code] 7장 오류 처리 (0) | 2021.05.23 |
[Clean Code] 5장 형식 맞추기 (0) | 2021.05.18 |
[Clean Code] 4장 주석 (0) | 2021.05.16 |
[Clean Code] 3장 : 함수 (0) | 2021.05.11 |