SOLID ?
Single Responsibility Principle(단일 책임 원칙)
- 클래스는, 오직 하나의 대해서만 책임져야 한다.
- 만약 클래스가 여러가지 작업을 책임져야 한다면, 이는 버그 발생 가능성을 높이게 됩니다. 또한 많은 기능 중 한가지를 변경할 때 모르는 사이에 다른 기능에 영향을 줄 수 있기 때문이다.
- SRP의 목적은 행동을 분리하는 것이고, 이로 인해 어떤 기능을 수정하더라도, 연관없는 기능에는 영향이 가지 않게 될 것이다.
여러가지 책임을 하고 있는 경우
- 아래의 예시는 캐릭터가 검사일때와 궁수일때의 책임을 수행하고 있으며 두 가지의 책임을 가지고 있으며 응집도가 낮다고 할 수 있다.
- 다른 책임과 position이라는 필드를 공유하고 있는 것처럼 의존도가 높아 결합도가 높다고 할 수 있다.
public class Character {
String position;
public Character(String position) {
this.position = position;
}
public String attack() {
if (position == "검사") {
return "칼로 휘두른다.";
} else {
return "활을 쏜다.";
}
}
}
한가지 책임만 하는 경우
- 아래의 클래스는 추상클래스를 통해 검사와 궁수의 책임을 분리하여 각 하나의 책임만 맡고 있기 때문에 응집도가 높으며 의존도가 존재하지 않기 때문에 결합도도 낮다고 할 수 있다.
public abstract class Character {
public abstract String attack();
}
public class Warrior extends Character {
public String attck() {
return "칼을 휘두른다.";
}
}
public class Archer extends Character {
public String attck() {
return "활을 쏜다.";
}
}
Open-Closed Principle(개방-폐쇄 원칙)
- 클래스는 확장에는 개방적이어야 하고, 변경이는 폐쇄적이어야 한다.
- 클래스의 현재 코드를 변경하는것은 해당 클래스를 사용하고 있는 모든 시스템에 영향을 주게 된다.
- 만약 클래스에 더 많은 기능을 부여하고 싶다면, 가장 이상적인 접근방법은 기존 기능을 변경하는것이 아닌 새로운 함수를 추가하는 것이다.
- OCP의 목적은 클래스의 존재하는 기능의 변경 없이 해당 클래스의 기능을 확장시키는 것이다. 이로 인해 사용중인 클래스의 변경으로 인한 버그 발생을 피할 수 있다.
예시
- 아래는 단일책임 원칙에 사용했던 예시로 새로운 직업이 만약에 새로 생긴다 해도 다음과 같이 다른 클래스의 변경 없이 단순히 새로운 직업에 대한 클래스를 추가하기만 하면 된다.