중요도 순이며 이 4가지 규칙을 따르면, 코드 구조와 설계를 파악하기 쉬워진다.
-> SRP, DIP와 같은 원칙을 적용하기 쉬워져 창발성을 촉진시킬 수 있다.
논문이 있는데 그 논문에 주장만 가득하고 주장을 뒷받침 할 실험이나 근거가 없다면 아무도 주장을 믿지 않고, 논문이라고 할 수 없다.
-> 프로그램도 테스트로 증명할 수 없으면 소용이 없다.
결국, 이 규칙을 따르면 시스템은 낮은 결합도와 높은 응집력이라는 객체 지향 방법론이 지향하는 목표를 달성하게 되고 이를 통해 설계 품질을 높힐 수 있다.
중복은 추가 작업, 추가 위험, 불필요한 복잡도를 뜻한다.
int size() {
boolean isEmpty() {}
}
위와 같은 메서드가 있을 때, 각 메서드를 따로 구현할 수도 있다.
(isEmpty는 bool값을 반환하며, size 메서드는 개수를 반환)
-> 하지만 isEmpty 메서드에 size 메서드를 이요하면 중복 구현하지 않아도 된다.
boolean isEmpty(){
return 0 == size();
}
아래는 중복된 부분을 추출해서 새로운 메서드로 만드는 예시이다.
// 중복 코드
public void scaleToOneDimension(float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension - imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01f);
RenderedOpnewImage = ImageUtilities.getScaledImage(image, scalingFactor, scalingFactor);
image.dispose();
System.gc();
image = newImage;
}
public synchronized void rotate(int degrees) {
RenderedOpnewImage = ImageUtilities.getRotatedImage(image, degrees);
image.dispose();
System.gc();
image = newImage;
}
// 중복 추출 코드
public void scaleToOneDimension(float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension - imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float) Math.floor(scalingFactor * 10) * 0.01f);
replaceImage(ImageUtilities.getScaledImage(image, scalingFactor, scalingFactor));
}
public synchronized void rotate(int degrees) {
replaceImage(ImageUtilities.getRotatedImage(image, degrees));
}
private void replaceImage(RenderedOp newImage) {
image.dispose();
System.gc();
image = newImage;
}
자신이 코드를 짤 때는 모든 것을 이해하지만, 코드를 유지보수하는 사람이 이해할 가능성은 희박하다.
어려운 코드는 이해하느라 시간도 잡아먹고, 오해할 가능성이 높아서 위험하다.
이를 방지하기 위해서는
아무리 좋은 개념인 SRP도 극단으로 치닫으면 득보다 실이 많아진다.
의미없이 클래스와 메서드 크기를 줄인다고 조그만 클래스와 메서드를 만들지 말고, 클래스와 메서드의 수는 최소한으로 유지해야한다.
-> 정말 필요로 한지 고민하고 필요할 때만 분리를 하는 것!