Дилема
Я читав багато книг найкращих практик щодо об'єктно-орієнтованих практик, і майже кожна книга, яку я прочитав, мала частину, де вони кажуть, що перерахунки - це запах коду. Я думаю, що вони пропустили ту частину, де вони пояснюють, коли перерахунки дійсні.
Як такий, я шукаю вказівки та / або випадки використання, коли перерахунки НЕ є запахом коду, а насправді є дійсною конструкцією.
Джерела:
"ПОПЕРЕДЖЕННЯ Як правило, перерахунки є кодовими запахами і повинні бути відновлені до поліморфних класів. [8]" Seemann, Mark, Dependency Injection in .Net, 2011, p. 342
[8] Мартін Фаулер та ін., Рефакторинг: Покращення дизайну існуючого коду (Нью-Йорк: Аддісон-Веслі, 1999), 82.
Контекст
Причина моєї дилеми - торговий API. Вони передають мені потік даних Tick, надсилаючи за допомогою цього методу:
void TickPrice(TickType tickType, double value)
де enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... }
Я намагався зробити обгортку навколо цього API, оскільки порушення змін - це спосіб життя цього API. Я хотів відслідковувати значення кожного останнього отриманого типу галочок на моїй обгортці, і я це зробив, використовуючи Словник тиктів:
Dictionary<TickType,double> LastValues
Мені це здавалося правильним використанням перерахунків, якщо вони використовуються як ключі. Але у мене є другі думки, оскільки у мене є місце, де я приймаю рішення на основі цієї колекції, і я не можу придумати спосіб, як я міг би усунути оператор переключення, я міг би використовувати завод, але цей завод все ще матиме переключити заяву кудись. Мені здалося, що я просто переміщую речі, але все одно пахне.
Легко знайти ДОН'Ь переліків, але НД, не так просто, і я би вдячний, якщо люди можуть поділитися своїм досвідом, плюсами і мінусами.
Перегляд точки зору
Деякі рішення та дії базуються на цих, TickType
і я не можу придумати спосіб усунення тверджень enum / switch. Найчистішим рішенням, про який я можу придумати, є використання фабрики та повернення реалізації на основі TickType
. Навіть тоді у мене все ще буде оператор перемикання, який повертає реалізацію інтерфейсу.
Нижче перелічено один із зразкових класів, де я маю сумніви, що я можу неправильно використовувати переписку:
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 ...