Tôi có một switchcấu trúc có một vài trường hợp để xử lý. Hoạt switchđộng trên một enumvấ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 switchcấ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 ifcấ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 switchcấ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 gototrong 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 switchcấ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 gototừ 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?
gotokhi 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ể đó gotonhưng oh tốt.
gotongô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.