1. 절차적인 도형
public 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();
}
}
절차적인 도형 클래스다. Geometry 클래스는 세 가지 도형 클래스를 다룬다. 각 도형 클래스는 간단한 자료구조다. 즉, 아무 메서드도 제공하지 않는다. 도형이 동작하는 방식은 Geometry클래스에서 구현한다.
객체 지향 프로그래머가 위 코드를 본다면 코웃음을 칠지도 모르겠다. 클래스가 절차적이라 비판한다면 맞는말이다. 하지만 그런 비웃음이 100% 옳다고 말하기는 어렵다. 만약 Geometry 클래스에 둘레 길이를 구하는 perimeter() 함수를 추가하고 싶다면? 도형 클래스는 아무 영향도 받지 않는다! 도형 클래스에 의존하는 다른 클래스도 마찬가지다! 반대로 새 도형을 추가하고 싶다면? Geometry 클래스에 속한 함수를 모두 고쳐야 한다.
2. 다형적인 도형 (객체지향)
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;
}
}
여기서 area()는 다형메서드다. Geometry 클래스는 필요 없다. 그러므로 새 도형을 추가해도 기존 함수에 아무런 영향을 미치지 않는다. 반면 새 함수를 추가하고 싶다면 도형 클래스를 전부 고쳐야 한다.
3. 결론
위의 1번과 2번은 상호 보완적인 특질이 있다. 사실상 반대다! 그래서 객체와 자료 구조는 근본적으로 양분된다.
(자료 구조를 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
반대쪽도 참이다.
절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.
다시 말해, 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차 적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다!
복잡한 시스템을 짜다 보면 새로운 함수가 아니라 새로운 자료 타입이 필요한 경우가 생긴다. 이때는 클래스와 객체 지향 기법이 가장 적합하다. 반면, 새로운 자료 타입이 아니라 새로운 함수가 필요한 경우도 생긴다. 이때는 절차적인 코드와 자료 구조가 좀 더 적합하다.
분별 있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다. 때로는 단순한 자료구조와 절차적인 코드가 가장 적합한 상황도 있다.
출처 : 클린코드(애자일 소프트웨어 장인 정신), 로버트 C.마틴
'개발 > 리뷰' 카테고리의 다른 글
[실용주의 프로그래머 리뷰] 1. 깨진 창문을 내버려 두지 말라. (0) | 2023.01.11 |
---|---|
[클린코드 리뷰] 5. TDD, 테스트 코드를 깨끗하게 유지하자. (0) | 2022.12.31 |
낡은 자바스크립트 작성 습관, 이젠 바뀌어야겠지 (2) | 2022.12.25 |
[클린코드 리뷰] 3. 나쁜 코드에 주석을 달지 마라. 새로 짜라. (2) | 2022.11.17 |
[클린코드 리뷰] 2. 의미 있는 이름을 사용해야 한다. (0) | 2022.11.06 |
[클린코드 리뷰] 1. 좋은 코드와 나쁜 코드에 대하여 (0) | 2022.11.06 |
댓글