서버 개발/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> 인터페이스만 알면 되므로, 구체적인 구현의 변경이 필요하지 않음.
- 테스트 시 다른 컬렉션 구현을 주입하여 쉽게 테스트 가능.
반응형