Tôi đã đi qua một tuyên bố chuyển đổi trong codebase tôi đang làm việc trên và tôi đang cố gắng tìm ra cách thay thế nó bằng một cái gì đó tốt hơn kể từ switch statements are considered a code smell. Tuy nhiên, khi đọc qua several các bài đăng trên stackoverflow về replacingswitchstatements Tôi dường như không thể nghĩ ra một cách hiệu quả để thay thế tuyên bố chuyển đổi cụ thể này.Khi nào một người nên cố gắng loại bỏ một tuyên bố chuyển đổi?
Còn lại tôi tự hỏi liệu câu lệnh chuyển đổi cụ thể này có ổn không và nếu có trường hợp cụ thể trong đó câu lệnh chuyển đổi được coi là phù hợp.
Trong trường hợp của tôi mã (hơi obfuscated tự nhiên) mà tôi đang phải vật lộn với là như thế này:
private MyType DoSomething(IDataRecord reader)
{
var p = new MyType
{
Id = (int)reader[idIndex],
Name = (string)reader[nameIndex]
}
switch ((string) reader[discountTypeIndex])
{
case "A":
p.DiscountType = DiscountType.Discountable;
break;
case "B":
p.DiscountType = DiscountType.Loss;
break;
case "O":
p.DiscountType = DiscountType.Other;
break;
}
return p;
}
bất cứ ai có thể đề xuất một cách để loại bỏ chuyển đổi này? Hay đây có phải là cách sử dụng thích hợp của công tắc không? Và nếu có, có sử dụng thích hợp nào khác cho các câu lệnh chuyển đổi không? Tôi thực sự muốn biết họ thích hợp ở đâu vì vậy tôi không lãng phí quá nhiều thời gian để loại bỏ mọi câu lệnh chuyển đổi mà tôi gặp phải chỉ vì chúng được coi là mùi trong một số trường hợp.
Cập nhật: Tại gợi ý của Michael Tôi đã làm một chút tìm kiếm sự trùng lặp của logic này và phát hiện ra rằng ai đó đã tạo ra logic trong một lớp học có hiệu quả đưa ra tuyên bố toàn bộ công tắc không cần thiết. Vì vậy, trong bối cảnh của mã bit cụ thể này, câu lệnh switch là không cần thiết. Tuy nhiên, câu hỏi của tôi là nhiều hơn về sự phù hợp của báo cáo chuyển đổi trong mã và cho dù chúng ta luôn luôn cố gắng thay thế chúng bất cứ khi nào chúng được tìm thấy như vậy trong trường hợp này, tôi nghiêng chấp nhận câu trả lời rằng câu lệnh chuyển đổi này là phù hợp.
Bạn có thể thêm thẻ để bao gồm ngôn ngữ lập trình được viết bằng ngôn ngữ này không? Rõ ràng mã đang làm gì, nhưng tôi nghĩ sẽ hữu ích khi phân biệt. Rõ ràng không phải Java vì không có lớp "chuỗi" trong Java. –
@Amir Tôi đã xác định mã là C# trong thẻ. Lý do tôi không ở nơi đầu tiên là vì tôi không muốn đặt câu hỏi cụ thể cho C# vì câu hỏi của tôi là nhiều hơn về sự phù hợp chung của việc sử dụng câu lệnh chuyển đổi ... – mezoid
Tôi muốn mạo hiểm để đoán C# – bbqchickenrobot