Tình trạng khó xử
Tôi đã đọc rất nhiều sách thực hành hay nhất về thực hành hướng đối tượng và hầu hết mọi cuốn sách tôi đã đọc đều có một phần mà họ nói rằng enum là một mùi mã. Tôi nghĩ rằng họ đã bỏ lỡ phần mà họ giải thích khi enums hợp lệ.
Như vậy, tôi đang tìm kiếm các hướng dẫn và / hoặc các trường hợp sử dụng trong đó enum KHÔNG phải là mùi mã và trên thực tế là một cấu trúc hợp lệ.
Nguồn:
"CẢNH BÁO Theo quy tắc thông thường, enum là mùi mã và nên được tái cấu trúc thành các lớp đa hình. [8]" Seemann, Mark, Dependency Injection trong .Net, 2011, tr. 342
[8] Martin Fowler và cộng sự, Tái cấu trúc: Cải thiện thiết kế của Bộ luật hiện tại (New York: Addison-Wesley, 1999), 82.
Bối cảnh
Nguyên nhân của tình trạng khó xử của tôi là một API giao dịch. Họ cung cấp cho tôi luồng dữ liệu Tick bằng cách gửi thông qua phương thức này:
void TickPrice(TickType tickType, double value)
Ở đâu enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... }
Tôi đã thử tạo một trình bao bọc xung quanh API này bởi vì phá vỡ các thay đổi là cách sống của API này. Tôi muốn theo dõi giá trị của từng loại đánh dấu nhận được cuối cùng trên trình bao bọc của mình và tôi đã thực hiện điều đó bằng cách sử dụng Từ điển đánh dấu:
Dictionary<TickType,double> LastValues
Đối với tôi, điều này có vẻ như là một cách sử dụng enum đúng cách nếu chúng được sử dụng làm chìa khóa. Nhưng tôi có suy nghĩ thứ hai vì tôi có một nơi để đưa ra quyết định dựa trên bộ sưu tập này và tôi không thể nghĩ ra cách nào để loại bỏ tuyên bố chuyển đổi, tôi có thể sử dụng một nhà máy nhưng nhà máy đó vẫn sẽ có một tuyên bố chuyển đổi ở đâu đó. Dường như với tôi rằng tôi chỉ di chuyển mọi thứ xung quanh nhưng nó vẫn có mùi.
Thật dễ dàng để tìm thấy những điều tuyệt vời, nhưng DO, không dễ dàng như vậy và tôi đánh giá cao nếu mọi người có thể chia sẻ chuyên môn, ưu và nhược điểm của họ.
Suy nghĩ thứ hai
Một số quyết định và hành động dựa trên những điều này TickType
và dường như tôi không thể nghĩ ra cách nào để loại bỏ các tuyên bố enum / switch. Giải pháp sạch nhất tôi có thể nghĩ đến là sử dụng một nhà máy và trả lại việc thực hiện dựa trên TickType
. Thậm chí sau đó tôi vẫn sẽ có một câu lệnh chuyển đổi trả về việc thực hiện giao diện.
Được liệt kê dưới đây là một trong những lớp mẫu mà tôi nghi ngờ rằng tôi có thể sử dụng enum sai:
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 ...