สิ่งที่คุณกำลังพูดถึงน้อยไวยากรณ์กว่าโครงสร้าง คุณสามารถมีwhen
คำสั่งแบบนั้นได้ในระบบที่ใช้ตรรกะจำนวน จำกัด จากนั้นจึงเรียกใช้when
คำสั่งจากนั้นวนรอบและดำเนินการตรรกะอีกครั้งโดยดำเนินการต่อในวงวนไม่สิ้นสุด
ยกตัวอย่างเช่นการเขียนโปรแกรม Windows โดยทั่วไปจะเป็น "เหตุการณ์ตาม" การสมัครรับข้อมูลClick
กิจกรรมของปุ่มหมายถึง "ทำสิ่งนี้เมื่อคลิก" อย่างไรก็ตามสิ่งที่เกิดขึ้นภายใต้ประทุนคือการประมวลผลข้อความ Windows ส่งข้อความไปยังแอปพลิเคชันเมื่อผู้ใช้คลิกปุ่มและวนรอบการประมวลผลข้อความในแอปพลิเคชันเรียกใช้ตัวจัดการเหตุการณ์ที่เหมาะสม
ตัวอย่างเช่นหากคุณใช้เหตุการณ์ใน C # คุณสามารถทำได้โดยไม่มีการวนรอบข้อความ แต่ข้อ จำกัด คือคุณต้องประกาศเหตุการณ์ล่วงหน้าดังนั้นคุณจึงไม่สามารถเขียนwhen
คำสั่งคลังข้อมูลที่เฝ้าดูประเภทใดก็ได้ สถานะ. คุณต้องรอเหตุการณ์เฉพาะ
ในการรับพฤติกรรมนี้ในสถาปัตยกรรม Von Neumann คุณต้องเรียกใช้การวนซ้ำแบบไม่สิ้นสุดที่ตรวจสอบเงื่อนไขทั้งหมดทุกครั้งผ่านการวนซ้ำที่เรียกใช้รหัสที่เหมาะสมหากเหมาะสม ภายในคุณจะได้รับรายการif
/ then
หรือswitch
ข้อความสั่งจำนวนมาก เดสก์ท็อปแอปพลิเคชันและโปรแกรมเมอร์เว็บส่วนใหญ่จะอาเจียนถ้าพวกเขาเห็นโครงสร้างดังกล่าวดังนั้นจึงเป็นเรื่องที่น่าพึงพอใจจริงๆถ้าคุณห่อมันด้วยน้ำตาล syntactic บางชนิดเช่นรูปแบบเหตุการณ์ของ Windows (แม้ว่าจะเป็นสิ่งที่เกิดขึ้น)
ในทางกลับกันถ้าคุณดูที่การพัฒนาเฟิร์มแวร์แบบฝังตัวผู้บริหารแบบเรียลไทม์หรือผู้ควบคุมอุตสาหกรรมโปรแกรมแบบนี้เป็นเรื่องธรรมดามาก ตัวอย่างเช่นหากคุณมีโปรแกรมเรียลไทม์คุณอาจต้องการแสดง:
outputA = input1 && input2
รหัสตรงไปตรงมาเพื่อทำความเข้าใจ (เพราะมันเป็นการประกาศ) อย่างไรก็ตามเพื่อให้มันใช้งานได้คุณจะต้องรันมันเป็นวงแคบ คุณประเมินoutputA
ทุกครั้งผ่านลูป ผู้เขียนโปรแกรมบนเดสก์ท็อปหรือเว็บจำนวนมากไม่ชอบสิ่งนี้เพราะมันไม่มีประสิทธิภาพ สำหรับพวกเขาเวลาเดียวที่คุณควรประเมินใหม่outputA
คือเมื่อใดinput1
หรือinput2
การเปลี่ยนแปลง พวกเขาค่อนข้างจะเห็นอะไรมากกว่านี้เช่นคุณกำลังอธิบาย:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
ทีนี้ถ้านี่คือสิ่งที่คุณต้องการ (และโดยส่วนตัวแล้วฉันไม่ชอบความคิดนี้) และเป้าหมายของคุณคือประสิทธิภาพคุณก็ต้องถามตัวเองว่าโปรเซสเซอร์กำลังทำอะไรอยู่ภายใต้ประทุน เห็นได้ชัดว่ายังคงมีการวนรอบบางอย่างที่เปรียบเทียบสถานะอินพุตกับสถานะอินพุตก่อนหน้าทุกครั้งและเรียกใช้งานรหัสที่เหมาะสมเมื่อมีการเปลี่ยนแปลงครั้งเดียว ดังนั้นจริงๆแล้วมันมีประสิทธิภาพน้อยกว่าและยากต่อการอ่านและยากที่จะรักษา
ในทางกลับกันถ้างานที่คุณต้องทำเมื่อinput1
การเปลี่ยนแปลงมีความสำคัญwhen
ประโยคของคุณอาจสมเหตุสมผล ใน PLC คำสั่งประเภทนี้เรียกว่า "การตรวจจับขอบที่เพิ่มขึ้น" มันช่วยประหยัดสถานะของinput1
ในครั้งล่าสุดผ่านลูปเปรียบเทียบกับค่าในเวลานี้และดำเนินการตรรกะถ้าสถานะสุดท้ายเป็นเท็จและรัฐนี้เป็นจริง
หากคุณไม่มีสถาปัตยกรรม Von Neumann เกมจะเปลี่ยนไป ตัวอย่างเช่นหากคุณกำลังเขียนโปรแกรม FPGA ในVHDLจากนั้นเมื่อคุณเขียน:
outputA = input1 && input2
( ... หรืออะไรก็ตามไวยากรณ์ VHDL ที่เหมาะสมจะเป็น) แล้ว FPGA จริงได้รับสายขึ้นดังกล่าวว่าinput1
และจะมีสายการป้อนข้อมูลของและประตูเมืองและการส่งออกของและประตูจะสายไปinput2
outputA
ดังนั้นไม่เพียง แต่เป็นรหัสที่เข้าใจง่ายเท่านั้นมันยังทำงานควบคู่ไปกับตรรกะอื่น ๆ ทั้งหมดและมีประสิทธิภาพ
เมื่อคุณกำลังพูดถึงคอนโทรลเลอร์อุตสาหกรรมเช่น PLC หรือ PAC ซึ่งตั้งโปรแกรมในหนึ่งในห้าภาษา IEC-61131-3 กรณีทั่วไปคือการจัดการประเภทนี้:
- อ่านอินพุตและเก็บไว้ในหน่วยความจำ
- รันโปรแกรมหลัก
- เขียนเอาต์พุตจากหน่วยความจำไปยังเอาต์พุตจริง
- ไปที่ขั้นตอนที่ 1
สิ่งนี้สร้างขึ้นในสถาปัตยกรรมของระบบดังนั้นจึงคาดว่าคุณจะเขียน:
outputA = input1 && input2
... และมันจะถูกดำเนินการในการวนซ้ำอย่างต่อเนื่อง
นอกจากนี้ยังมีการขัดจังหวะตามปกติในเครื่องเหล่านี้ สิ่งเหล่านี้เหมือนกับการสนับสนุนระดับฮาร์ดแวร์สำหรับwhen
ผู้ให้บริการที่คุณกำลังพูดถึง ฮาร์ดแวร์ interruptเป็นวิธีการดำเนินรหัสบางอย่างเกี่ยวกับเหตุการณ์ภายนอก ตัวอย่างเช่นเมื่อการ์ดเครือข่ายแจ้งว่ามีข้อมูลรออยู่ตัวประมวลผลจะต้องอ่านข้อมูลนั้นทันทีหรือคุณจะใช้พื้นที่บัฟเฟอร์หมด อย่างไรก็ตามสำหรับจำนวนครั้งที่คุณต้องขอให้ขัดจังหวะฮาร์ดแวร์จริงฉันสงสัยว่ารวมถึงคำภาษาสำหรับมันคุ้มค่า คุณจะถูก จำกัด ที่ขาอินพุต CPU และดูเหมือนว่าคุณต้องการทดสอบสถานะโปรแกรมภายใน
ดังนั้นในภาษาดั้งเดิม (ที่ไม่มีการวนซ้ำที่ไม่ จำกัด ) คุณต้องถามคำถามว่า "เมื่อใดที่โค้ดการประเมินทำงาน"
ถ้าคุณเขียน:
when A do
launchNukes()
... และสมมติว่าA
เป็นนิพจน์บูลีนโดยพลการคุณจะรู้ได้อย่างไรว่าเมื่อใดที่จะประเมินการแสดงออกนั้น การนำไปใช้ที่ไร้เดียงสาจะหมายความว่าคุณต้องประเมินอีกครั้งหลังจากการเขียนหน่วยความจำทุกครั้ง คุณอาจคิดว่าคุณสามารถ จำกัด ให้แคบลงได้ แต่ให้พิจารณาสิ่งนี้:
when systemTime > actionTime do
launchNukes()
สังเกตว่าsystemTime
มีการเปลี่ยนแปลงอยู่เสมอ (ทุกครั้งที่คุณอ่านคุณจะได้รับหมายเลขที่แตกต่างกัน) ซึ่งหมายความว่าส่วนที่มีเงื่อนไขของwhen
คำสั่งทั้งหมดของคุณจะต้องได้รับการประเมินใหม่อย่างต่อเนื่อง เกือบจะเป็นไปไม่ได้ (และลองพิจารณาสักครู่ว่าจะเกิดอะไรขึ้นถ้านิพจน์เงื่อนไขของคุณมีผลข้างเคียง!
ข้อสรุป
คุณสามารถมีwhen
คำสั่ง (เช่นที่คุณกำลังอธิบาย) ในสถาปัตยกรรมที่มีวงวนไม่สิ้นสุดที่รันโปรแกรมหลักจากนั้นเรียกใช้when
คำสั่งหากเงื่อนไขเปลี่ยนจากเท็จเป็นจริงบนลูปนี้ แม้ว่าสถาปัตยกรรมนี้จะพบได้ทั่วไปในอุปกรณ์ฝังตัวและอุปกรณ์อุตสาหกรรม แต่มันก็ไม่ได้มีอยู่ทั่วไปในภาษาโปรแกรมทั่วไป
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...
SQL: นอกจากนี้: msdn.microsoft.com/en-us/library/dd233249.aspxโดยทั่วไปฉันจะค้นหา "เมื่อ" โดยใช้การค้นหารหัสของ Google