Tôi có một switch
cấu trúc có một vài trường hợp để xử lý. Hoạt switch
động trên một enum
vấn đề đặt ra vấn đề về mã trùng lặp thông qua các giá trị kết hợp:
// All possible combinations of One - Eight.
public enum ExampleEnum {
One,
Two, TwoOne,
Three, ThreeOne, ThreeTwo, ThreeOneTwo,
Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree,
FourTwoThree, FourOneTwoThree
// ETC.
}
Hiện tại switch
cấu trúc xử lý từng giá trị riêng biệt:
// All possible combinations of One - Eight.
switch (enumValue) {
case One: DrawOne; break;
case Two: DrawTwo; break;
case TwoOne:
DrawOne;
DrawTwo;
break;
case Three: DrawThree; break;
...
}
Bạn có ý tưởng ở đó. Hiện tại tôi đã chia nó thành một if
cấu trúc xếp chồng để xử lý các kết hợp với một dòng duy nhất:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Điều này đặt ra vấn đề đánh giá logic cực kỳ dài, khó hiểu và khó duy trì. Sau khi tái cấu trúc điều này, tôi bắt đầu nghĩ về các lựa chọn thay thế và nghĩ về ý tưởng về một switch
cấu trúc với sự sụp đổ giữa các trường hợp.
Tôi phải sử dụng một goto
trong trường hợp đó vì C#
không cho phép rơi qua. Tuy nhiên, nó ngăn chặn các chuỗi logic dài vô cùng mặc dù nó nhảy xung quanh trong switch
cấu trúc, và nó vẫn mang lại sự sao chép mã.
switch (enumVal) {
case ThreeOneTwo: DrawThree; goto case TwoOne;
case ThreeTwo: DrawThree; goto case Two;
case ThreeOne: DrawThree; goto default;
case TwoOne: DrawTwo; goto default;
case Two: DrawTwo; break;
default: DrawOne; break;
}
Đây vẫn chưa phải là một giải pháp đủ sạch và có một sự kỳ thị liên quan đến goto
từ khóa mà tôi muốn tránh. Tôi chắc chắn phải có một cách tốt hơn để làm sạch điều này.
Câu hỏi của tôi
Có cách nào tốt hơn để xử lý trường hợp cụ thể này mà không ảnh hưởng đến khả năng đọc và bảo trì không?
goto
khi cấu trúc cấp cao không tồn tại trong ngôn ngữ của bạn. Đôi khi tôi ước có một fallthru
; từ khóa để thoát khỏi việc sử dụng cụ thể đó goto
nhưng oh tốt.
goto
ngôn ngữ cấp cao như C #, thì có thể bạn đã bỏ qua nhiều lựa chọn thay thế và / hoặc thiết kế khác (và tốt hơn). Rất nản lòng.