ฉันมีswitchโครงสร้างที่มีหลายกรณีที่ต้องจัดการ การswitchดำเนินการมากกว่าenumที่ poses ปัญหาของรหัสที่ซ้ำกันผ่านค่ารวม:
// 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.
}
ขณะนี้switchโครงสร้างจัดการแต่ละค่าแยกกัน:
// 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;
...
}
คุณได้รับความคิดที่นั่น ขณะนี้ฉันได้แยกย่อยเป็นifโครงสร้างแบบซ้อนเพื่อจัดการชุดค่าผสมด้วยบรรทัดเดียวแทน:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
สิ่งนี้ทำให้เกิดปัญหาของการประเมินเชิงตรรกะที่ไม่น่าเชื่อมานานซึ่งทำให้สับสนในการอ่านและยากที่จะรักษา หลังจากเปลี่ยนสิ่งนี้ออกมาฉันเริ่มคิดถึงทางเลือกและคิดถึงความคิดของswitchโครงสร้างที่มีการตกลงระหว่างกรณี
ฉันต้องใช้ a gotoในกรณีนั้นเนื่องจากC#ไม่อนุญาตให้ล้มลง อย่างไรก็ตามมันจะป้องกันโซ่ลอจิกที่ยาวอย่างไม่น่าเชื่อแม้ว่ามันจะกระโดดไปมาในswitchโครงสร้าง
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;
}
นี่ยังไม่เป็นโซลูชันที่สะอาดเพียงพอและมีมลทินที่เกี่ยวข้องกับgotoคำหลักที่ฉันต้องการหลีกเลี่ยง ฉันแน่ใจว่าต้องมีวิธีที่ดีกว่าในการทำความสะอาด
คำถามของฉัน
มีวิธีที่ดีกว่าในการจัดการกรณีนี้โดยไม่มีผลต่อการอ่านและการบำรุงรักษาหรือไม่?
gotoเมื่อไม่มีโครงสร้างระดับสูงในภาษาของคุณ บางครั้งฉันหวังว่าจะมีfallthru; คำหลักเพื่อกำจัดการใช้งานนั้นโดยเฉพาะgotoแต่โอ้ดี
gotoภาษาในระดับสูงเช่น C # คุณอาจมองข้ามการออกแบบ (และดีกว่า) อื่น ๆ และ / หรือทางเลือกในการนำไปใช้ ท้อแท้อย่างมาก