ภาวะที่กลืนไม่เข้าคายไม่ออก
ฉันได้อ่านหนังสือฝึกหัดที่ดีที่สุดมากมายเกี่ยวกับการฝึกฝนเชิงวัตถุและหนังสือเกือบทุกเล่มที่ฉันอ่านมีส่วนที่พวกเขาบอกว่า enums เป็นกลิ่นรหัส ฉันคิดว่าพวกเขาพลาดส่วนที่พวกเขาอธิบายเมื่อ enums ถูกต้อง
ดังนั้นฉันกำลังมองหาแนวทางและ / หรือกรณีการใช้งานที่ enums ไม่ได้กลิ่นรหัสและในความเป็นจริงโครงสร้างที่ถูกต้อง
แหล่งที่มา:
"คำเตือนตามกฎของหัวแม่มือ, enums เป็นรหัสที่มีกลิ่นและควรได้รับการ refactored เพื่อเรียน polymorphic [8]" Seemann, Mark, การฉีดพึ่งพาใน. Net, 2011, p. 342
[8] Martin Fowler et al., Refactoring: การปรับปรุงการออกแบบของรหัสที่มีอยู่ (นิวยอร์ก: Addison-Wesley, 1999), 82
บริบท
สาเหตุของภาวะที่กลืนไม่เข้าคายไม่ออกของฉันคือการซื้อขาย API พวกเขาให้กระแสข้อมูล Tick โดยส่งผ่านวิธีนี้:
void TickPrice(TickType tickType, double value)
ที่ไหน enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... }
ฉันได้ลองทำ wrapper รอบ ๆ API นี้เพราะการแตกการเปลี่ยนแปลงเป็นวิถีชีวิตของ API นี้ ฉันต้องการติดตามมูลค่าของแต่ละประเภทที่ได้รับติ๊กบนเสื้อคลุมของฉันและฉันได้ทำโดยใช้พจนานุกรมของ ticktypes:
Dictionary<TickType,double> LastValues
สำหรับฉันแล้วนี่ดูเหมือนจะเป็นการใช้งาน enum ที่เหมาะสมหากใช้เป็นกุญแจ แต่ฉันมีความคิดที่สองเพราะฉันมีสถานที่ที่ฉันตัดสินใจตามคอลเลกชันนี้และฉันไม่สามารถคิดวิธีที่ฉันสามารถกำจัดคำสั่งเปลี่ยนฉันสามารถใช้โรงงาน แต่โรงงานจะยังคงมี เปลี่ยนงบที่ไหนสักแห่ง สำหรับฉันมันดูเหมือนว่าฉันจะย้ายสิ่งต่าง ๆ รอบ ๆ แต่ก็ยังมีกลิ่น
มันง่ายที่จะหาสิ่งที่ไม่ต้องจ่ายเงิน แต่เป็นสิ่งที่ไม่ง่ายและฉันจะขอบคุณถ้าผู้คนสามารถแบ่งปันความเชี่ยวชาญข้อดีและข้อเสียของพวกเขา
ความคิดที่สอง
การตัดสินใจและการกระทำบางอย่างขึ้นอยู่กับสิ่งเหล่านี้TickType
และฉันไม่สามารถนึกถึงวิธีที่จะกำจัดคำสั่ง enum / switch TickType
วิธีการแก้ปัญหาที่สะอาดที่ฉันสามารถคิดจะใช้โรงงานและกลับไปดำเนินการบนพื้นฐานของ แม้ว่าฉันจะยังคงมีคำสั่ง switch ที่คืนค่าการใช้อินเตอร์เฟส
รายการด้านล่างเป็นหนึ่งในกลุ่มตัวอย่างที่ฉันสงสัยว่าฉันอาจใช้ผิด enum:
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 ...