2024-09-12

소프트웨어 설계에서 지켜야 할 다섯 가지 핵심 원칙
유연하고 관리하기 쉬운 객체 지향 설계를 추구하기 위해 사용된다.
의존 역전 원칙 (DIP) : 고수준 모듈과 저수준 모듈이 서로 의존하지 않도록 하고, 대신 추상화(인터페이스나 추상 클래스) 에 의존하도록 한다는 원칙이다.
즉,
1. 고수준 모듈은 저수준 모듈에 의존해서는 안 된다.
- 둘 다 추상화에 의존해야 한다.
2. 추상화는 세부사항에 의존해서는 안 된다.
- 세부사항이 추상화에 의존해야 한다.
- 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
고수준 모듈 : 어떤 의미 있는 단일 기능을 제공하는 모듈 (interface, 추상 클래스)
저수준 모듈 : 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능의 실제 구현 (메인클래스, 객체)
Player 클래스 : Weapon 클래스를 직접 생성하고 의존하는 구조
public class Weapon
{
public void Attack()
{
Console.WriteLine("Attacking with the weapon!");
}
}
public class Player
{
private Weapon _weapon;
public Player()
{
_weapon = new Weapon(); // 직접 의존
}
public void Attack()
{
_weapon.Attack();
}
}
// 실제 플레이어 공격 호출
Player player = new Player();
player.Attack();
이때, 만약 무기를 변경해야 한다면 Player 클래스를 직접 수정해야 한다.
IWeapon 인터페이스 : 공격을 위한 인터페이스
public interface IWeapon
{
void Attack();
}
public class Sword : IWeapon
{
public void Attack()
{
Console.WriteLine("검 휘두르기");
}
}
public class Bow : IWeapon
{
public void Attack()
{
Console.WriteLine("활 쏘기");
}
}
public class Player
{
private IWeapon _weapon;
public Player(IWeapon weapon) // 의존성
{
_weapon = weapon;
}
public void Attack()
{
_weapon.Attack();
}
}
// 플레이어 공격 호출
IWeapon sword = new Sword();
Player playerWithSword = new Player(sword);
playerWithSword.Attack();
IWeapon bow = new Bow();
Player playerWithBow = new Player(bow);
playerWithBow.Attack();
이를 통해, Player 클래스는 각각 다른 무기 클래스에 의존하지 않게 된다.
즉, Player 클래스는 IWeapon 인터페이스에 의존하며, 다양한 무기(Sword, Bow)를 인스턴스화하여 사용할 수 있다.
무기를 쉽게 변경할 수 있고, 새로운 무기를 추가하는 것도 간편해진다는 이점이 있다.
객체지향의 5대 원칙인 SOLID 를 마무리 지었다.
처음부터 SOLID 원칙을 잘 준수하며 코드를 짜기는 어렵겠지만,
더 많은 코드를 작성해보고, 리팩토링하는 과정을 거쳐 성장할 수 있을 거라고 생각한다.