คำถามติดแท็ก switch-statement

3
แบ่งในกรณีเริ่มต้นในสวิตช์
ฉันเป็นบิตงงงวยในเมื่อใดก็ตามหรือไม่รวมถึงหลังจากกรณีที่ผ่านมามักจะbreakdefault switch (type) { case 'product': // Do behavior break; default: // Do default behavior break; // Is it considered to be needed? } breakมีวัตถุประสงค์เพียงอย่างเดียวในความเข้าใจของฉันที่จะหยุดรหัสจากการทำงานผ่านส่วนที่เหลือของswitch-case ก็ถือว่าเป็นตรรกะมากขึ้นแล้วจะมีbreakที่ผ่านมาเนื่องจากความสอดคล้องหรือข้ามมีมันเกิดจากการbreakใช้ไม่มีการใช้งานการทำงาน แต่อย่างใด? ทั้งสองมีเหตุผลในรูปแบบที่แตกต่างกันในความคิดของฉัน ซึ่งอาจจะได้ในระดับหนึ่งนำมาเปรียบเทียบกับตอนจบไฟล์ที่มี.php ?>ฉันไม่เคยลงท้ายด้วย?>ส่วนใหญ่เนื่องจากความเสี่ยงของการแสดงผลช่องว่าง แต่ก็สามารถยืนยันได้ว่ามันจะเป็นสิ่งตรรกะที่จะจบไฟล์ด้วย

17
เหตุใดจึงต้องใช้วิธีการ OO แทนคำสั่ง“ สวิตช์” ขนาดใหญ่
ฉันทำงานใน. Net, C # shop และฉันมีเพื่อนร่วมงานที่คอยยืนยันว่าเราควรใช้คำสั่ง Switch ขนาดใหญ่ในรหัสของเราด้วย "คดี" จำนวนมากแทนที่จะเป็นวิธีเชิงวัตถุมากกว่า การโต้เถียงของเขากลับไปอย่างต่อเนื่องตามข้อเท็จจริงที่ว่าคำสั่ง Switch รวบรวมเป็น "ตารางกระโดด cpu" และเป็นตัวเลือกที่เร็วที่สุด (แม้ว่าในสิ่งอื่น ๆ ทีมของเราบอกว่าเราไม่สนใจความเร็ว) ฉันไม่ได้โต้แย้งเรื่องนี้ ... เพราะฉันไม่รู้ว่าเขากำลังพูดถึงเรื่องอะไร เขาพูดถูกมั้ย เขาเพิ่งพูดถึงลาของเขาหรือไม่? แค่พยายามเรียนรู้ที่นี่

12
หลีกเลี่ยงวูดู `goto 'หรือไม่
ฉันมี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; …

8
จำเป็นต้องเพิ่มตัวพิมพ์เริ่มต้นในขณะที่ใช้ตัวเรือนสวิตช์หรือไม่
ในระหว่างการตรวจสอบโค้ดเมื่อเร็ว ๆ นี้ฉันถูกขอให้ใส่defaultเคสในไฟล์ทั้งหมดทุกที่ที่switchบล็อกถูกใช้แม้ว่าจะไม่มีอะไรทำdefaultก็ตาม นั่นหมายความว่าฉันต้องใส่defaultเคสและไม่เขียนอะไรเลย นี่เป็นสิ่งที่ถูกต้องหรือไม่ มันจะมีจุดประสงค์อะไร

10
ฉันควรใช้คำสั่งสลับหรือยาวถ้า…โซ่อื่น ๆ ?
บ่อยครั้งที่ฉันได้ยินเกี่ยวกับคำสั่ง switch มันวางตัวเป็นวิธีการแทนที่ยาวถ้า ... else chains แต่ดูเหมือนว่าเมื่อฉันใช้คำสั่งเปลี่ยนฉันกำลังเขียนรหัสเพิ่มเติมที่ฉันจะเขียนถ้า ... อื่น นอกจากนี้คุณยังมีปัญหาอื่น ๆ เช่นการรักษาตัวแปรทั้งหมดสำหรับการโทรทั้งหมดอยู่ในขอบเขตเดียวกัน นี่คือโค้ดบางส่วนที่แทนโฟลว์ที่ฉันเขียนตามปกติ ( ขอบคุณ diam ) String comment; // The generated insult. int which = (int)(Math.random() * 3); // Result is 0, 1, or 2. if (which == 0) { comment = "You look so much better than usual."; …

8
เหตุใด Clang / LLVM จึงเตือนฉันเกี่ยวกับการใช้ค่าเริ่มต้นในคำสั่ง switch ที่ครอบคลุมทุกกรณีที่แจกแจง?
พิจารณาคำสั่ง enum และ switch ต่อไปนี้: typedef enum { MaskValueUno, MaskValueDos } testingMask; void myFunction(testingMask theMask) { switch (theMask) { case MaskValueUno: {}// deal with it case MaskValueDos: {}// deal with it default: {} //deal with an unexpected or uninitialized value } }; ฉันเป็นโปรแกรมเมอร์ Objective-C แต่ฉันเขียนสิ่งนี้ใน C บริสุทธิ์สำหรับผู้ชมที่กว้างขึ้น Clang / LLVM …

6
Refactoring Switch Statement และมีการใช้งานจริงสำหรับงบ Switch ใด ๆ ?
ฉันอ่านบทความนี้และสงสัยว่าเราจะกำจัดงบการเปลี่ยนทั้งหมดโดยการแทนที่พวกเขาด้วยพจนานุกรมหรือโรงงานเพื่อไม่ให้มีการเปลี่ยนงบเลยในโครงการของฉัน มีบางอย่างไม่ได้เพิ่มขึ้น คำถามคือคำสั่ง switch มีการใช้งานจริงหรือเราจะไปข้างหน้าและแทนที่ด้วยพจนานุกรมหรือวิธีการจากโรงงาน (ในการใช้วิธีการจากโรงงานแน่นอนว่าจะมีการใช้คำสั่งสวิตช์อย่างน้อยสำหรับการสร้างวัตถุ ใช้โรงงาน ... แต่มันเกี่ยวกับมัน)

5
อาร์กิวเมนต์หลายตัวในการเรียกใช้ฟังก์ชันเทียบกับอาร์เรย์เดียว
ฉันมีฟังก์ชั่นที่ใช้ในชุดของพารามิเตอร์จากนั้นนำไปใช้กับพวกเขาเป็นเงื่อนไขในแบบสอบถาม SQL อย่างไรก็ตามในขณะที่ฉันชอบอาร์เรย์อาร์กิวเมนต์เดียวที่มีเงื่อนไขตัวเอง: function searchQuery($params = array()) { foreach($params as $param => $value) { switch ($param) { case 'name': $query->where('name', $value); break; case 'phone': $query->join('phone'); $query->where('phone', $value); break; } } } เพื่อนร่วมงานของฉันต้องการแสดงรายการอาร์กิวเมนต์ทั้งหมดแทนอย่างชัดเจน: function searchQuery($name = '', $phone = '') { if ($name) { $query->where('name', $value); } if ($phone) { $query->join('phone'); …

6
แผนที่ของฟังก์ชั่นเทียบกับคำสั่งเปลี่ยน
ฉันกำลังทำงานในโครงการที่ประมวลผลคำขอและมีสององค์ประกอบในการร้องขอคือคำสั่งและพารามิเตอร์ ตัวจัดการสำหรับแต่ละคำสั่งนั้นง่ายมาก (<10 บรรทัดมัก <5) มีคำสั่งอย่างน้อย 20 คำและน่าจะมีมากกว่า 50 คำสั่ง ฉันคิดวิธีแก้ปัญหาสองสามข้อ: สวิตช์ใหญ่ / if-else หนึ่งคำสั่ง แผนที่ของคำสั่งไปยังฟังก์ชั่น แผนที่ของคำสั่งไปยังคลาสที่คงที่ / singletons แต่ละคำสั่งทำการตรวจสอบข้อผิดพลาดเล็กน้อยและบิตเดียวที่สามารถแยกออกได้คือการตรวจสอบจำนวนพารามิเตอร์ที่กำหนดไว้สำหรับแต่ละคำสั่ง อะไรจะเป็นทางออกที่ดีที่สุดสำหรับปัญหานี้และเพราะอะไร ฉันยังเปิดรับรูปแบบการออกแบบใด ๆ ที่ฉันอาจพลาดไป ฉันคิดรายการ pro / con ต่อไปนี้สำหรับแต่ละรายการ: สวิตซ์ ข้อดี เก็บคำสั่งทั้งหมดไว้ในฟังก์ชันเดียว เนื่องจากมันเรียบง่ายนี่ทำให้เป็นตารางการค้นหาด้วยภาพ ไม่ต้องวุ่นวายกับแหล่งข้อมูลด้วยฟังก์ชั่นขนาดเล็กจำนวนมาก / คลาสที่สามารถใช้งานได้ในที่เดียว ข้อเสีย นานมาก ยากที่จะเพิ่มคำสั่งโดยทางโปรแกรม (จำเป็นต้องโยงใช้ตัวพิมพ์เล็ก) คำสั่งแผนที่ -> ฟังก์ชั่น ข้อดี ชิ้นเล็กขนาดกัด สามารถเพิ่ม / ลบคำสั่งโดยทางโปรแกรม ข้อเสีย หากทำแบบอินไลน์เหมือนกับสวิตช์ …

8
ประโยชน์ของการสลับใช้ Strings ใน Java 7 คืออะไร
เมื่อฉันเริ่มโปรแกรมใน Java ความจริงที่ว่างบ switch ไม่ได้ทำให้สายผิดหวัง จากนั้นในการใช้ Enums ฉันตระหนักถึงประโยชน์ที่คุณได้รับกับพวกเขาแทนที่จะส่งผ่านค่าดิบ - ความปลอดภัยของประเภท ฉันกำลังดิ้นรนที่จะนึกถึงสถานการณ์ที่มี SE7 ตอนนี้ฉันตัดสินใจที่จะใช้สวิตช์ที่มีสตริงเป็นอินพุตแทนที่จะเป็น Enums หากพวกเขาจะดำเนินการผ่านการเปลี่ยนสตริงทั้งหมด (เช่นมากกว่าการแข่งขันบางส่วนหรือ regex) ก็ดูเหมือนจะไม่ให้เหตุผลน้อยกว่ารหัสที่จะเปลี่ยน และด้วยเครื่องมือ IDE และอัตราส่วนการอ่าน - เขียนของการเขียนโค้ดฉันจะมีความสุขมากขึ้นในการสร้าง Enum พิเศษโดยอัตโนมัติมากกว่าการส่งผ่านค่าสตริง พวกเขานำประโยชน์อะไรมาให้เราในฐานะโปรแกรมเมอร์ จานหม้อไอน้ำน้อยลงหรือไม่ ไม่รู้สึกว่าภาษากำลังใช้งานคุณสมบัตินี้ แม้ว่าอาจจะมีกรณีการใช้งานที่ฉันมองเห็น

2
เหตุใดภาษาต่างๆจึงไม่ใช้คำสั่งสลับอย่างชัดเจนบนคำสั่งสวิตช์
ผมอ่านทำไมเราต้องใช้breakในswitch? และทำให้ฉันสงสัยว่าทำไมอนุญาตให้ใช้งาน fall-through โดยนัยในบางภาษา (เช่น PHP และ JavaScript) ในขณะที่ไม่มีการสนับสนุน (AFAIK) สำหรับ fall-through อย่างชัดเจน ไม่ใช่ว่าจะต้องสร้างคำหลักใหม่ขึ้นมาตามความcontinueเหมาะสมอย่างสมบูรณ์และจะแก้ปัญหาความกำกวมไม่ว่าผู้เขียนจะมีความหมายต่อกรณีใดก็ตาม แบบฟอร์มที่รองรับในปัจจุบันคือ: switch (s) { case 1: ... break; case 2: ... //ambiguous, was break forgotten? case 3: ... break; default: ... break; } ในขณะที่มันเหมาะสมที่จะเขียนเป็น: switch (s) { case 1: ... break; case 2: ... continue; //unambiguous, …

7
การใช้งานที่เหมาะสมของคำสั่งเปลี่ยนผ่าน
เมื่อใดที่เหมาะสมที่จะใช้คำสั่ง switch-fall (classic) มีการแนะนำและสนับสนุนการใช้งานดังกล่าวหรือไม่และควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมดหรือไม่?

4
สลับกับความแตกต่างเมื่อจัดการกับรูปแบบและมุมมอง
ฉันไม่สามารถหาทางออกที่ดีกว่าสำหรับปัญหาของฉัน ฉันมีตัวควบคุมมุมมองที่นำเสนอรายการองค์ประกอบ องค์ประกอบเหล่านั้นเป็นแบบจำลองที่สามารถเป็นตัวอย่างของ B, C, D, ฯลฯ และสืบทอดจาก A. ดังนั้นในตัวควบคุมมุมมองแต่ละรายการควรไปที่หน้าจอที่แตกต่างกันของแอปพลิเคชันและส่งผ่านข้อมูลบางส่วนเมื่อผู้ใช้เลือกหนึ่งในนั้น . ทางเลือกสองทางที่อยู่ในใจของฉันคือ (กรุณาเพิกเฉยไวยากรณ์ไม่ใช่ภาษาที่เฉพาะเจาะจง) 1) สวิตช์ (ฉันรู้ว่า sucks) //inside the view controller void onClickItem(int index) { A a = items.get(index); switch(a.type) { case b: B b = (B)a; go to screen X; x.v1 = b.v1; // fill X with b data …

7
การใช้งานสถานะวัตถุในภาษา OO?
ฉันได้รับรหัส Java เพื่อดูซึ่งจำลองการแข่งรถซึ่งรวมถึงการใช้เครื่องรัฐขั้นพื้นฐาน นี่ไม่ใช่เครื่องคำนวณทางวิทยาศาสตร์คอมพิวเตอร์แบบดั้งเดิม แต่เป็นเพียงวัตถุที่มีหลายสถานะและสามารถสลับระหว่างสถานะต่าง ๆ ตามชุดการคำนวณ เพื่ออธิบายเพียงแค่ปัญหาฉันมีคลาสรถยนต์พร้อมคลาส enum ซ้อนกันซึ่งกำหนดค่าคงที่สำหรับสถานะของรถยนต์ (เช่น OFF, IDLE, DRIVE, REVERSE และอื่น ๆ ) ภายในคลาสรถยนต์เดียวกันนี้ฉันมีฟังก์ชั่นการอัปเดตซึ่งโดยทั่วไปประกอบด้วยคำสั่งสวิตช์ขนาดใหญ่ซึ่งเปลี่ยนสถานะปัจจุบันของรถยนต์ทำการคำนวณบางอย่างและเปลี่ยนสถานะรถยนต์ เท่าที่ฉันเห็นรัฐ Cars ใช้ในชั้นเรียนของตัวเองเท่านั้น คำถามของฉันคือนี่เป็นวิธีที่ดีที่สุดในการจัดการกับการใช้งานกลไกสถานะตามธรรมชาติที่อธิบายไว้ข้างต้นหรือไม่? มันฟังดูเหมือนโซลูชันที่ชัดเจนที่สุด แต่ก่อนหน้านี้ฉันเคยได้ยินมาเสมอว่า ปัญหาหลักที่ฉันเห็นที่นี่คือคำสั่ง switch อาจมีขนาดใหญ่มากเมื่อเราเพิ่มสถานะเพิ่มเติม (ถ้าจำเป็น) และรหัสอาจไม่สะดวกและยากต่อการบำรุงรักษา อะไรจะเป็นทางออกที่ดีกว่าสำหรับปัญหานี้?

6
จะลดสวิตช์ในคำสั่ง switch ได้อย่างไร?
ดังนั้นฉันจึงสร้างวิธีการสร้างบรรทัดคำทักทายตามคนสองคนจากฐานข้อมูล มีพารามิเตอร์สี่ตัว ได้แก่ สองชื่อ ( name1และname2) และสองเพศ ( genderและgender2) สำหรับการรวมเพศทุกครั้งฉันมีเอาท์พุทที่แตกต่างกัน ตัวอย่างเช่น: ถ้าเพศ 1 คือM(ชาย) และเพศ 2 เป็นเช่นMกันผลลัพธ์ควรเป็นดังนี้: Dear Sir name1 and Sir name2, ในเวลานี้สวิตช์ของฉันมีลักษณะดังนี้: switch(gender1){ case 'M': switch(gender2){ case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break; case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break; …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.