양도 논법
나는 객체 지향 실습에 관한 많은 모범 사례를 읽었으며, 읽은 거의 모든 책은 열거 형이 코드 냄새라고 말하는 부분을 가지고있었습니다. 열거 형이 유효 할 때 설명하는 부분을 놓친 것 같습니다.
따라서 열거 형이 코드 냄새 가 아니며 실제로 유효한 구조 가되는 지침 및 / 또는 사용 사례를 찾고 있습니다.
출처 :
"경고 일반적으로 열거 형은 코드 냄새이며 다형성 클래스로 리팩토링해야합니다. [8]"Seemann, Mark, Dependency Injection in .Net, 2011, p. 342
Martin Fowler et al., Refactoring : 기존 코드의 디자인 개선 (New York : Addison-Wesley, 1999), 82.
문맥
내 딜레마의 원인은 거래 API입니다. 그들은이 방법을 통해 Tick 데이터 스트림을 제공합니다.
void TickPrice(TickType tickType, double value)
어디 enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... }
변경 사항을 깨는 것이이 API의 삶의 방식이기 때문에이 API를 래퍼로 만들려고했습니다. 래퍼에서 마지막으로 수신 된 각 틱 유형의 값을 추적하고 싶고 사전 유형의 사전을 사용하여이를 수행했습니다.
Dictionary<TickType,double> LastValues
나에게 이것은 키로 사용되는 열거 형을 올바르게 사용하는 것처럼 보였습니다. 그러나이 컬렉션을 기반으로 결정을 내리는 장소가 있고 스위치 문을 제거 할 수있는 방법을 생각할 수 없으므로 공장을 사용할 수는 있지만 공장에는 여전히 어딘가에 스위치 문. 나는 단지 물건을 움직일 뿐이지 만 여전히 냄새가납니다.
열거 형의 DO N'T를 쉽게 찾을 수는 있지만 DO는 쉽지 않습니다. 사람들이 전문 지식, 장단점을 공유 할 수 있다면 감사하겠습니다.
두번째 생각
일부 결정과 행동은 이것들을 기반 TickType으로하며 열거 형 / 스위치 진술을 제거하는 방법을 생각할 수없는 것 같습니다. 내가 생각할 수있는 가장 깨끗한 솔루션은 팩토리를 사용하고에 기반한 구현을 반환하는 것입니다 TickType. 그럼에도 불구하고 여전히 인터페이스 구현을 반환하는 switch 문이 있습니다.
아래 열거 형은 열거 형을 잘못 사용하고 있는지 의심되는 샘플 클래스 중 하나입니다.
public class ExecutionSimulator
{
Dictionary<TickType, double> LastReceived;
void ProcessTick(TickType tickType, double value)
{
//Store Last Received TickType value
LastReceived[tickType] = value;
//Perform Order matching only on specific TickTypes
switch(tickType)
{
case BidPrice:
case BidSize:
MatchSellOrders();
break;
case AskPrice:
case AskSize:
MatchBuyOrders();
break;
}
}
}
enums as switch statements might be a code smell ...