6장 객체와 자료 구조
📖 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.
아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.
목차
🗒️ 책에서 기억하고 싶은 내용
자료/객체 비대칭
● 절차적인 도형
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 {
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;
}
}
public class Circle implements Shape {
private Point center;
private double radius;
public final double PI = 3.141592653589793;
public double area() {
return PI * radius * radius;
}
}
절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다.
객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.
디미터 법칙
자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
객체는 자료를 숨기고 함수는 공개한다.
● 구조체 감추기
ctxt.getAbsolutePathOfScratchDirectoryOption()
ctx.getScratchDirectoryOption().getAbsolutePath()
임시 디렉터리의 절대 경로를 얻으려면 둘 중 어떤 방법이 좋을까?
둘 다 내키지 않는다.
여기서 절대 경로를 얻는 이유는 임시 파일을 생성하기 위해서다.
그렇다면 ctxt 객체에 임시 파일을 생성하라고 시키면 어떨까?
ctxt는 내부 구조를 드러내지 않으며, 모듈에서 해당 함수는 자신이 몰라야 하는 여러 객체를 탐색할 필요가 없다.
따라서 디미터 법칙을 위반하지 않는다.
🗒️ 소감
POP와 OOP의 코드를 직접 보며 비교해 보니 각각의 장단점이 와닿아서 흥미로웠다.
무작정 객체 지향 코드가 좋은 것이 아니라는 것을 알게 되었고, 절차 지향과 객체 지향에 대해 더 깊이 배워보고 싶다고 생각했다.
구조체 감추기에서는 절대 경로를 가져오는 코드를 수정하는 것이 아니라 절대 경로가 필요한 이유를 찾고 거기에 맞는 메서드를 생성하는 방식이 신선해서 흥미로웠다.
🗒️ 궁금하거나 어려웠던 내용
X
'도서 > Clean Code' 카테고리의 다른 글
[Clean Code/클린 코드] 8장 경계 (0) | 2023.12.11 |
---|---|
[Clean Code/클린 코드] 7장 오류 처리 (0) | 2023.12.04 |
[Clean Code/클린 코드] 5장 형식 맞추기 (0) | 2023.12.04 |
[Clean Code/클린 코드] 4장 주석 (2) | 2023.12.04 |
[Clean Code/클린 코드] 3장 함수 (2) | 2023.12.03 |