รูปแบบการประกาศสมัครแตกต่างจาก gotos อย่างไร


11

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

ฉันเห็นสิ่งที่คล้ายกันในโปรแกรมจาวาสคริปต์จำนวนมากซึ่งใช้ในการ "กระโดด" ข้ามโมดูล ฉันขาดอะไรบางอย่างเกี่ยวกับรูปแบบการประกาศสมัครสมาชิกหรือเหตุการณ์ที่ขับเคลื่อนโดย


5
return, try/catch, break, continue, switch- ผู้ที่มีทั้งหมด goto . ที่มีระดับต่าง ๆ ของข้อ จำกัด ในตัวไปถือว่าอันตรายเป็นอันตรายต่อความคิดเกี่ยวกับวิธีการทำงานของรหัส

@MichaelT: สำหรับกรณีส่วนใหญ่ที่ครอบงำมีทางเลือกในการข้ามไปที่ทำให้ง่ายต่อการให้เหตุผลเกี่ยวกับรหัส ไม่มีอันตรายใด ๆ ในการซาบซึ้งข้อเท็จจริงนั้น ความเสียหายจะเกิดขึ้นเฉพาะในกรณีที่คุณไม่ได้ใช้ goto เมื่อมีการรับประกัน (ซึ่งโดยปกติจะไม่ใช่) หรือหากคุณใช้ goto อย่างไม่ระมัดระวัง ฉันเชื่อว่าแอปเปิ้ลแสดงให้เราเห็นตัวอย่างที่ดีของหลัง
back2dos

... ความคิดว่าบางส่วนของโปรแกรมที่มีการสมัคร ... : ความแตกต่างที่สำคัญครั้งแรกกับgotoการโกหกในsในตอนท้ายของชิ้นส่วน ประการที่สองความแตกต่างอยู่ที่สำคัญในความคิด ความแตกต่างที่ใหญ่เป็นอันดับสามคือว่ามันเป็นแนวคิดไม่gosub goto
mouviciel

1
ใกล้กับ "มาจาก" ของ INTERCAL แล้ว
CodesInChaos

@ back2dos มันเป็นตัวอย่างที่ดีว่าทำไมฉันถึงชอบใช้วงเล็บปีกกาแม้กระทั่งสำหรับโค้ด 1 บรรทัด
MetaFight

คำตอบ:


19

อ๋อคุณจะหายไปแน่นอนบางสิ่งบางอย่าง โดยทั่วไปแล้ว Gotos จะถูกใช้อย่างที่คุณพูดเพื่อทำการถ่ายโอนการควบคุมทางเดียว

อย่างไรก็ตามเหตุการณ์ไม่ทำเช่นนั้น เมื่อโค้ดเริ่มทำงานเหตุการณ์มันรู้ดีว่าเมื่อมีการเผยแพร่เหตุการณ์ (หรือประมวลผล, เข้าคิว, ถูกไล่ออก ... ฯลฯ ) การประมวลผลโค้ดจะกลับมาทำงานในบรรทัดถัดไปในโค้ดที่สร้างเหตุการณ์

การใช้ goto สร้างการเชื่อมต่ออย่างแน่นหนาระหว่างรหัสที่เรียกใช้คำสั่งนั้นและรหัสที่อยู่ในจุดสิ้นสุดการรับ นักพัฒนาจะต้องมีความรู้ที่ใกล้ชิดของทั้งสองสถานที่เพื่อใช้ข้ามไป

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

หากคุณอยู่กับฉันจนถึงตอนนี้สิ่งที่ฉันอธิบายไว้ข้างต้นเป็นกรณีในอุดมคติของรูปแบบผับ / ย่อย น่าเสียดายที่ในโลกแห่งความเป็นจริงนั้นไม่เหมาะเสมอไปและมีบางกรณีที่ผู้จัดพิมพ์สร้างเหตุการณ์ผู้ใช้บริการจะถูกเรียกใช้การเปลี่ยนแปลงทั้งรัฐและการประมวลผลรหัสเวลากลับสู่ผู้เผยแพร่ "โลก" ถูกพลิกคว่ำ และฉันแน่ใจว่าคุณเคยพบปัญหานี้ในอดีตเพราะเงื่อนไขนี้มักเกิดขึ้นเมื่อรูปแบบ pub / sub ถูกนำมาใช้ในแบบง่าย ๆ (เช่นผ่านการใช้ผู้ได้รับมอบหมายหรือเหตุการณ์ใน C # หรือตัวชี้ / ฟังก์ชัน / อินเตอร์เฟสใน C / C ++)

แต่ปัญหานี้ไม่จำเป็นต้องเป็นรูปแบบ pub / sub แต่เป็นการใช้งานมัน นี่คือสาเหตุที่ระบบจำนวนมากใช้คิวเพื่อให้เมื่อมีการเผยแพร่เหตุการณ์มันจะถูกจัดคิวเพื่อเรียกใช้ในภายหลังทำให้ผู้เผยแพร่มีโอกาสที่จะดำเนินการให้เสร็จสิ้นในขณะที่โลกยังไม่บุบสลาย เมื่อผู้จัดทำเสร็จแล้วก็จะใช้งานได้การวนรอบเหตุการณ์ (aka การจัดส่งวนซ้ำ) จะปรากฏขึ้นจากเหตุการณ์และเรียกสมาชิก


+1 เผยแพร่ / สมัครสมาชิกช่วยให้การมีเพศสัมพันธ์หลวม; goto ไม่
Fuhrmanator

6

มีความแตกต่างสองสามอย่าง ขั้นแรกเมื่อโค้ดรัน GOTO มันจะยกเลิกการควบคุมและไม่มีการรับประกันว่าจะสามารถควบคุมได้ อย่างไรก็ตามผู้เผยแพร่ใน pub / sub จะยังคงทำงานและดำเนินการตามตรรกะโดยจะส่งข้อความตามความเหมาะสม พฤติกรรมของมันเป็นที่เข้าใจและคาดการณ์ได้

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

ความแตกต่างที่สำคัญคือผู้เผยแพร่และผู้สมัครสมาชิกมีการดำเนินการที่กำหนดไว้อย่างชัดเจนและโดยพื้นฐานแล้วพวกเขาจะทำงานวนรอบและทำงานในขณะที่ส่งและรับข้อความ รหัสกับ GOTO สามารถเขียนได้ดีและเป็นระเบียบ แต่มันก็สามารถทำให้เสื่อมเสียได้และไม่มีการรับประกันพฤติกรรมที่เข้าใจได้อย่างชัดเจน

คุณพูดถูก บางคนสามารถเขียนระบบ pub / sub ที่มีข้อความจำนวนมากและมีการกระโดดเล็ก ๆ น้อย ๆ ที่ติดตามการไหลของการประมวลผลอาจกลายเป็นฝันร้าย ในทางกลับกันคุณสามารถเขียนระบบด้วย GOTO ที่ทำงานอย่างเป็นระเบียบและเข้าใจง่าย (ฉันกำลังคิดถึงรหัสชุดประกอบสำหรับระบบที่ซับซ้อนมากก่อนที่ภาษาเชิงสัญลักษณ์จะเข้ามาแทนที่)

แต่โดยทั่วไป decoupling ที่คุณได้รับจาก pub / sub ช่วยลดความยุ่งยากของการประมวลผลแบบกระจายและตรรกะ decouples ภายในระบบของคุณ นอกจากนี้โดยทั่วไปแล้ว GOTO แบบตรงขึ้นมีแนวโน้มที่จะสร้างระบบที่ซับซ้อนซึ่งการเข้าใจการไหลของการควบคุมกลายเป็นปัญหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.