# before
public class Point {
public double x;
public double y;
}
# after
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
}
객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.객체지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다./* 절차적인 도형 */
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();
}
}
/* 다형적인 도형 */
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;
}
}
모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.
# before
String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BuffredOutputStream bos = new BufferedOutputStream(fout);
# after
// ctxt 객체에 임시 파일을 생성하라고 시킨다.
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
DTO새로운 자료 타입이 필요한 경우에는 클래스와 객체 지향 기법이 가장 적합하다.
새로운 함수가 필요한 경우에는 절차적인 코드와 자료 구조가 좀 더 적합하다.
우수한 개발자는 편견없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다.