양도 논법
나는 객체 지향 실습에 관한 많은 모범 사례를 읽었으며, 읽은 거의 모든 책은 열거 형이 코드 냄새라고 말하는 부분을 가지고있었습니다. 열거 형이 유효 할 때 설명하는 부분을 놓친 것 같습니다.
따라서 열거 형이 코드 냄새 가 아니며 실제로 유효한 구조 가되는 지침 및 / 또는 사용 사례를 찾고 있습니다.
출처 :
"경고 일반적으로 열거 형은 코드 냄새이며 다형성 클래스로 리팩토링해야합니다. [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 ...