ทางเลือกที่ใช้ได้จริงใด ๆ กับรูปแบบสัญญาณ + สล็อตสำหรับการเขียนโปรแกรม GUI?


9

GUI Toolkits ส่วนใหญ่ทุกวันนี้ใช้รูปแบบสัญญาณ + สล็อต มันเป็น Qt และ GTK + ถ้าฉันไม่ผิดใครเป็นผู้บุกเบิก

คุณรู้หรือไม่ว่าวิดเจ็ตหรือวัตถุกราฟิก (บางครั้งแม้แต่รายการที่ไม่ได้แสดง) จะส่งสัญญาณไปยังตัวจัดการหลักของลูป ตัวจัดการหลักของวงแล้วเรียกเหตุการณ์ , การเรียกกลับหรือช่องที่ได้รับมอบหมายสำหรับเครื่องมือวัตถุที่ / กราฟิก โดยปกติจะมีvirtualตัวจัดการเหตุการณ์เริ่มต้น (และในกรณีส่วนใหญ่) ชุดเครื่องมือสำหรับการจัดการสัญญาณที่กำหนดไว้ล่วงหน้าทั้งหมดซึ่งแตกต่างจากการออกแบบก่อนหน้านี้ที่ผู้พัฒนาต้องเขียนทั้ง main-loop และ handler สำหรับแต่ละข้อความ (คิดว่า WINAPI) ผู้พัฒนาเพียง แต่ต้องกังวลเกี่ยวกับสัญญาณที่เขาต้องการในการใช้งานฟังก์ชั่นใหม่

ตอนนี้การออกแบบนี้ถูกใช้ในชุดเครื่องมือที่ทันสมัยที่สุดเท่าที่ฉันรู้ มี Qt, GTK +, FLTK เป็นต้นมี Java Swing C # มีคุณสมบัติภาษาสำหรับมัน (เหตุการณ์และผู้รับมอบสิทธิ์) และ Windows Forms ได้รับการพัฒนาในการออกแบบนี้ ในความเป็นจริงในทศวรรษที่ผ่านมาการออกแบบสำหรับการเขียนโปรแกรม GUI นี้ได้กลายเป็นมาตรฐานที่ไม่ได้เขียนไว้ เนื่องจากมันช่วยเพิ่มผลผลิตและให้สิ่งที่เป็นนามธรรมมากขึ้น

อย่างไรก็ตามคำถามของฉันคือ:

มีการออกแบบทางเลือกอื่นใดที่ขนานกันหรือเป็นประโยชน์สำหรับการเขียนโปรแกรม GUI ที่ทันสมัย?

นั่นคือการออกแบบสัญญาณ + สล็อตสิ่งเดียวที่ใช้ได้ในเมือง? เป็นไปได้ไหมที่จะทำการเขียนโปรแกรม GUI ด้วยการออกแบบอื่น ๆ ชุดเครื่องมือ GUI ที่ทันสมัย ​​(ประสบความสำเร็จและเป็นที่นิยม) ชุดเครื่องมือที่สร้างขึ้นบนการออกแบบทางเลือกหรือไม่?


กระบวนทัศน์ของคิวข้อความที่คุณค้นหาใน Windows API ไม่เหมือนกับเหตุการณ์และผู้รับมอบสิทธิ์ ผู้ได้รับมอบหมายจะเรียกว่าพร้อมและทันทีเช่นstd::function, ไม่ได้เป็นสัญญาณไม่ตรงกัน นอกจากนี้ WinAPI ยังให้การDefWindowProcประมวลผลข้อความ Windows เป็นการใช้งานเริ่มต้น ดังนั้นฉันจะวางตัวว่าคำถามของคุณอยู่บนพื้นฐานของตรรกะที่มีข้อบกพร่อง
DeadMG

2
QT และ GTK + อยู่ไกลจากการซ้อนเฟรมเวิร์ก GUI แรกซึ่งใช้วิธีการขับเคลื่อนเหตุการณ์ แนวคิดนี้กลับไปที่ Smalltalk-80 ( en.wikipedia.org/wiki/Smalltalk )
Doc Brown

คำถามที่น่าสนใจฉันอยากรู้ว่ารุ่นนี้เปลี่ยนไปมากด้วยอินเทอร์เฟซแบบมัลติทัช
Ben DeMott

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

JavaFx จัดเตรียมกลไกที่คล้ายกันผ่าน Bindings API
อังกฤษ

คำตอบ:


7

แม้ว่าฉันจะไม่เรียกมันว่าทั้งหมดที่ได้รับความนิยม แต่ก็มีการเขียนโปรแกรมแบบโต้ตอบสำหรับ GUI โดยเฉพาะอย่างยิ่งการเขียนโปรแกรมแบบใช้งานได้ตามที่นำมาใช้ตัวอย่างเช่นโดย. NET Rx Frameworkเช่นเดียวกับชุดเครื่องมืออื่น ๆ เช่นreactive-bananaหรือFrTimeสำหรับHaskellและRacketตามลำดับ


5

นั่นเป็นเรื่องที่ฉันโปรดปรานและเป็นเวลาประมาณหนึ่งทศวรรษ ('70s ถึง '86) ฉันคิดว่าการมี GUI ประกอบด้วยวัตถุที่ตอบสนองต่อเหตุการณ์เป็นเพียงวิธีที่เหมาะสมในการทำเช่นนั้น

จากนั้นฉันก็สะดุดในทางที่จะทำมันอีกอธิบายไว้ที่นี่และมีโครงการ SourceForge ที่นี่

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

นั่นคือสิ่งที่แพ็คเกจทำ สำหรับการโต้ตอบง่าย ๆ มันจะบันทึกลำดับความสำคัญเป็นรหัส สำหรับกล่องโต้ตอบการเปลี่ยนแปลงที่ซับซ้อนแบบไดนามิกมันทำให้เป็นไปได้

ป.ล. ฉันได้ทำสิ่งนี้เพื่อเดสก์ท็อป UIs และเทอร์มินัล UIs ระยะไกลไม่ใช่เว็บเบราว์เซอร์ ฉันแน่ใจว่าเป็นไปได้ แต่ฉันไม่ได้มีโอกาสลอง


+1, แต่เป็นไปได้อย่างไรที่จะได้รับฟังก์ชั่นพิเศษเช่นการป้อนข้อมูลที่ผู้ใช้กำหนด?
ApprenticeHacker

@IntermediateHacker: ฉันไม่แน่ใจว่าคุณหมายถึงอะไรจากการป้อนข้อมูลที่ผู้ใช้กำหนด คุณหมายถึงการมีแอพออกแบบฟอร์มหรือไม่?
Mike Dunlavey

2

มีสองวิธีที่แตกต่างในการทำสิ่งนี้:

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

นี่คือตัวอย่างสำหรับวิธีที่สอง:

interface Action {
     void execute();
     Bool isEnabled();
     Null<String> description();//used for tooltip
}
interface LabledAction extends Action {
     String getName();
}

และตอนนี้คุณสามารถสร้างรหัสLabelButtonต่อต้านLabledActionและไคลเอนต์ก็สามารถนำไปใช้หรือใช้การเริ่มต้นทั่วไปบางอย่างถ้ามีและเหมาะสม

วิธีที่สองมีความยืดหยุ่นน้อยกว่า แต่เข้มงวดกว่า คุณไม่เพียง แต่เชื่อมโยงมุมมองเข้ากับโมเดลด้วยวิธีอะตอมมิก คุณออกแบบ GUI ที่เหมาะสมตามความต้องการของคุณจากนั้นคุณใช้อะแดปเตอร์ระหว่าง GUI นั้นกับตรรกะโดเมน / แอปพลิเคชันของคุณ


Model / View / Controller นั้นดี แต่เป็นเพียงส่วนขยายของรูปแบบการสังเกตเนื่องจากส่วนควบคุมเป็นเพียงผู้สังเกตการณ์ของวิดเจ็ตและในส่วนของแบบจำลองวิดเจ็ตนั้นเป็นผู้สังเกตการณ์ของโมเดลดังนั้นมันจึงเป็นกลไกแบบเดียวกัน .
Jan Hudec

1

ระบบประเภทการควบคุมบางตัวใช้วิธีการฐานข้อมูล - การควบคุม gui แต่ละตัวเชื่อมโยงกับไฟล์ในฐานข้อมูลเพื่อให้ Gui แสดงสถานะฐานข้อมูลเสมอ DB hooks ถูกใช้เพื่อเรียกใช้ฟังก์ชันเมื่อมีการเปลี่ยนแปลงค่า


4
นี่ไม่ใช่สัญญาณช่องเสียบที่มีเลเยอร์ DB พิเศษหรือไม่
วงล้อประหลาด

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