개발노트

5. [ASP .NET Core] IList 사용하기 본문

서버 개발/ASP .NET Core

5. [ASP .NET Core] IList 사용하기

mroh1226 2024. 11. 17. 03:01
반응형

IList<T> 사용으로 인한 변화 및 이점

1. 구체적인 구현에 의존하지 않음

  • 기존 방식 (List<T> 사용):
    • Order 클래스가 특정 구현인 List<T>에 의존합니다.
    • 만약 나중에 아이템을 배열(Array)이나 다른 컬렉션(LinkedList<T>, ObservableCollection<T>)으로 바꾸고 싶다면 Order의 코드를 수정해야 합니다.
  • IList<T> 사용:
    • Order는 IList<T> 인터페이스를 통해 아이템 목록을 관리하므로, 내부에서 사용하는 컬렉션의 구현에 대해 알 필요가 없습니다.
    • 이후 List<T> 대신 다른 컬렉션 구현으로 쉽게 교체할 수 있습니다.
//예시1
// List<IGameItem>을 전달
IList<IGameItem> gameItems = new List<IGameItem>();
gameItems.Add(new EquipmentItem("Sword"));
gameItems.Add(new MaterialItem("Wood"));
var order = new Order(gameItems); // `List<IGameItem>` 구현체 주입

//예시2
// ObservableCollection<IGameItem>을 전달
IList<IGameItem> observableItems = new ObservableCollection<IGameItem>();
observableItems.Add(new EquipmentItem("Shield"));
observableItems.Add(new MaterialItem("Stone"));
var order2 = new Order(observableItems); // `ObservableCollection<IGameItem>` 구현체 주입

//예시3
// LinkedList<IGameItem>을 전달
IList<IGameItem> linkedListItems = new LinkedList<IGameItem>();
linkedListItems.Add(new EquipmentItem("Bow"));
linkedListItems.Add(new MaterialItem("Iron"));
var order3 = new Order(linkedListItems); // `LinkedList<IGameItem>` 구현체 주입

2. 테스트 및 확장 용이성

  • 테스트 더블(Mock, Fake 등) 적용 가능
    • IList<T>를 사용하면 테스트 시 Mock<IList<T>> 또는 Fake 객체를 주입하여 테스트 환경을 설정하기가 쉽습니다.
    • 이를 통해 다양한 시나리오를 테스트할 수 있습니다.
  • 확장 가능한 디자인
    • 향후 특정 컬렉션을 사용하거나 새로운 동작을 추가할 때 유연하게 대응할 수 있습니다.
    • 예를 들어, 스레드 안전한 ConcurrentBag<T>나 실시간 반응이 필요한 ObservableCollection<T>로 변경이 가능합니다.

3. 코드 유지 보수성 향상

  • OCP(Open-Closed Principle)를 지원
    • 기존 Order 클래스는 수정하지 않고도 새로운 컬렉션 타입을 지원할 수 있습니다.

IList 사용전

public class Order
{
    private readonly List<IGameItem> _gameItems; // 특정 구현에 의존

    public Order()
    {
        _gameItems = new List<IGameItem>();
    }

    public void AddGameItem(IGameItem gameItem)
    {
        _gameItems.Add(gameItem);
    }
}

단점:

  • List<IGameItem>가 변경 불가능하면 다른 컬렉션 타입으로 전환하려면 Order 내부 코드를 수정해야 함.

 

IList 사용 후

public class Order
{
    private readonly IList<IGameItem> _gameItems; // 인터페이스에 의존

    public Order()
    {
        _gameItems = new List<IGameItem>(); // 생성자에서 구체적인 구현 선택
    }

    public Order(IList<IGameItem> gameItems) // 다른 구현체를 주입할 수도 있음
    {
        _gameItems = gameItems;
    }

    public void AddGameItem(IGameItem gameItem)
    {
        _gameItems.Add(gameItem);
    }
}

장점:

  • Order는 IList<IGameItem> 인터페이스만 알면 되므로, 구체적인 구현의 변경이 필요하지 않음.
  • 테스트 시 다른 컬렉션 구현을 주입하여 쉽게 테스트 가능.
반응형
Comments