SOLID 원칙
태그: SOLID
카테고리: Common
SOLID
1. SRP (Single Responsibility Principle) 단일 책임의 원칙
이론
한 클래스는 하나의 책임을 가져야 한다.
클래스를 변경하는 이유는 단 하나여야 한다.
왜? 유지보수를 효율적으로 하기 위해
적용
Player 라는 클래스에 Player의 정보와 Player의 움직임에 대한 기능이 구현되어 있다면
둘 중 어느 하나를 수정하려고 해도 Player 스크립트에서 수정을 해야한다.
스크립트가 길어질수록 유지보수에 비효율적이기 때문에 이를 분리시켜야 한다.
2. OCP (Open Close Principle) 개방폐쇄의 원칙
이론
확장에는 열려있어야 하고 변경에는 닫혀 있어야 한다.
기존 구성요소는 수정이 일어나지 말아야 하며,
기존 구성요소를 쉽게 확장이 가능해야 한다.
기존 구성요소를 수정하게 되면 해당 요소를 이용하는 모듈들을 모두 고쳐야 한다.
매우 비효율적이기 때문에 변경에는 닫혀 있어야 한다.
적용
Player 는 Stat 을 가지게 된다.
하지만 Player 뿐만 아니라 Monster 와 같은 객체도 Stat 을 가질 수 있다.
Stat 클래스를 추상화 시킴으로써 Player 와 Monster 가 상속받도록 만들 수 있다.
이를 통해 Stat 을 상속받는 유닛들을 쉽게 만들어 확장이 편리하게 된다.
3. LSP (The Liskov Substitution Principle) 리스코브 치환의 원칙
이론
자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다.
자식클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고
확장만 수행하도록 해야 한다는 원칙이다.
적용
게임에서 Monster 라는 베이스 클래스가 있다.
이를 상속받은 Slime, Dragon 등의 서브 클래스가 있다.
Monster 클래스에서 SetDamage(int damage) 메소드를 이용하여 공격을 정의했다.
이 때 이를 상속받은 Slime, Dragon 에서 공격수치를 바꿔주고 싶어서
SetDamage(int damage) 메소드를 재정의 하게 된다면 어떨까?
1
2
3
4
5
6
7
8
9
10
// Monster
public void SetDamage(int damage)
{
_damage = damage;
}
// Slime
public new void SetDamage(int damage)
{
_damage = damage * 1.1f;
}
1
2
3
4
5
Monster slime = new Monster();
slime.SetDamage(100);
Slime slime = new Slime();
slime.SetDamage(100);
이들은 각각 다른 결과를 출력한다.
같은 slime 변수지만 재정의를 통해 다른 메소드를 출력하는 것이다.
이런 경우 기존 Monster 의 행위를 손상하는 것이기 때문에 재정의를 하지 않아야 한다.
Monster 의 기능은 그대로 상속받으면서 새로운 SetBonusDamage() 를 추가하면 된다.
4. ISP (Interface Segregation Principle) 인터페이스 분리의 원칙
이론
클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써,
클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록
만들어야 하는 것이 핵심!!!
적용
인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 한다.
Unity 에는 많은 인터페이스가 존재한다.
IPointer 에 관련된 인터페이스들은 각 기능별로 나누어져 있기 때문에
클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않는다.
5. DIP (Dependency Inversion Principle) 의존성 역전의 원칙
이론
구체화된 클래스에 의존하기 보다는 추상클래스나 인터페이스에 의존해야 한다.
적용
게임 캐릭터는 Q, W, E 스킬을 가지고 있다.
캐릭터가 사용하는 스킬은 바뀔 수 있다.
그래서 Skill 클래스를 추상화 시키고 이를 상속받은 Q, W, E 스킬을 만든다.
캐릭터가 각 스킬에 의존하는 것이 아닌 이들의 상위 모듈인 Skill 에 의존함으로써
의존관계를 역전하는 것이 DIP 원칙이다.
댓글남기기