ฉันมี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 # คุณอาจมองข้ามการออกแบบ (และดีกว่า) อื่น ๆ และ / หรือทางเลือกในการนำไปใช้ ท้อแท้อย่างมาก