반응형
태그가 달린 클래스라는 것이 있습니다.
두가지 이상의 기능을 커버하는 클래스인데
아래 예제를 보죠.
class Figure {
enum Shape { RECTANGLE, CIRCLE };
final Shape shape;
double length;
double width;
double radius;
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
Figure(double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch (shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError();
}
}
}
한 클래스 안에서 두개의 기능을 구현하고 있습니다.
생성자도 두개고 한 기능에 사용되는 필드도 다 따로있습니다.
당연하지만, 이렇게 만드는 건 한 기능을 한 클래스나 객체에서 구현한다는 객체지향에서도 아웃이고
반복되는 코드도 많고, 한 기능을 구현할 때 다른 기능의 필드도 자동생성되서 메모리도 잡아먹고
코드 해석하는데 가독성도 떨어집니다.
절대 해서는 안되는 코드가 되겠죠.
이런 코드는 아래와 같이 바꿔줍시다.
abstract class Figure {
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle(double radius) { this.radius = radius; }
double area() { return Math.PI * (radius * radius); }
}
class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
double area() { return length * width; }
}
흔하게 볼 수 있는 계층 구현입니다. 깔끔하고 보기도 좋고 중복도 제거됐습니다.
이펙티브 자바에서는 쓰지 말라고하는데
존재 자체를 몰랐으니.. 애초에 문제될 게 없었군요.
반응형
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 21 - 전략을 표현하고 싶을 때는 함수 객체를 사용해라 (0) | 2018.02.21 |
---|---|
이펙티브 자바 규칙 19 - 인터페이스는 자료형을 정의할 때만 사용하라 (0) | 2018.02.18 |
이펙티브 자바 규칙 18 - 추상 클래스 대신 인터페이스를 사용하자 (0) | 2018.02.17 |