เครื่องสถานะสามารถเก็บสถานะที่เป็นไปได้ทั้งหมดของ บางสิ่งบางอย่าง และการเปลี่ยนที่อนุญาตระหว่างสถานะเหล่านี้ ตัวอย่างเช่น เครื่องสถานะสำหรับประตูจะมีเพียงสองสถานะ (01 และ 19 ) และมีเพียงการเปลี่ยนสองครั้งเท่านั้น (26 และ 31รหัส> ).
ในทางกลับกัน เครื่องสถานะที่ซับซ้อนสามารถมีสถานะที่แตกต่างกันได้หลายสถานะโดยมีการเปลี่ยนแปลงหลายร้อยครั้งระหว่างสถานะเหล่านั้น ในความเป็นจริง หากคุณมองไปรอบ ๆ คุณจะสังเกตเห็นเครื่องสถานะที่มีจำกัดอยู่รอบตัวคุณ — เมื่อคุณซื้อจากเว็บไซต์ รับแพ็คมันฝรั่งทอดจากตู้จำหน่ายสินค้าอัตโนมัติ หรือแม้แต่เพียงแค่ถอนเงินจากตู้ ATM
ในโพสต์นี้ เราจะดูวิธีตั้งค่าเครื่องสถานะใน Ruby และใช้เครื่องสถานะเจม
เครื่องจักรของรัฐอยู่ระหว่างการพัฒนา
เมื่อใดที่เราจะต้องมีเครื่องจักรของรัฐในการพัฒนา? คำตอบง่ายๆ คือเมื่อใดก็ตามที่คุณต้องการสร้างโมเดลกฎหลายกฎสำหรับการเปลี่ยนสถานะหรือแสดงผลข้างเคียงในการเปลี่ยนบางอย่าง สิ่งสำคัญที่นี่คือการระบุส่วนของแอปพลิเคชันของคุณที่จะได้รับประโยชน์จากเครื่องสถานะ ตัวอย่างที่ดีที่เหมาะกับฉันเสมอคือ 45 ในบริบทของแอปพลิเคชันอีคอมเมิร์ซ
สำหรับแอปพลิเคชันง่ายๆ ที่ขายสินค้าออนไลน์ 58 สามารถอยู่ในสถานะใดสถานะหนึ่งได้:
61รหัส>77รหัส>80รหัส>98รหัส>108รหัส>113รหัส>
คุณสามารถดูการเปลี่ยนผ่านที่อนุญาตได้ในไดอะแกรมต่อไปนี้

การแสดงคำสั่งซื้อในรูปแบบของเครื่องสถานะทำให้เราเข้าใจขั้นตอนทั้งหมดได้อย่างชัดเจนตั้งแต่การสั่งผลิตภัณฑ์ไปจนถึงการจัดส่ง และสำหรับเรานักพัฒนา มันช่วยให้กำหนดขั้นตอนได้ชัดเจนในสิ่งที่ทำได้และไม่สามารถทำได้ ณ จุดใดจุดหนึ่งในโฟลว์นั้น
ดังที่กล่าวไปแล้ว มันเป็นเรื่องง่ายที่จะกระโดดลงหลุมกระต่ายโดยหยิบสิ่งนี้ขึ้นมาสำหรับปัญหาที่กว้างมาก และสุดท้ายก็จบลงด้วยรัฐหลายร้อยรัฐที่ยากต่อการให้เหตุผลและปฏิบัติตาม ดังนั้นควรมีแนวคิดระดับบนสุดและแผนภูมิสถานะสำหรับเครื่องสถานะที่คุณเสนอก่อนที่จะนำไปใช้งาน
เครื่องสถานะเครื่องแรกของเราใน Ruby
มาลองใช้ 121 ของเรากัน กับรูบี้
นั่นเป็นการนำไปปฏิบัติที่ง่ายเพียงพอ สำหรับแต่ละการเปลี่ยนแปลงที่เป็นไปได้ในเครื่องสถานะ เราจะกำหนดวิธีการใหม่ที่จะตรวจสอบสติและดำเนินการเปลี่ยนแปลง
สิ่งที่ยอดเยี่ยมเกี่ยวกับการใช้งานข้างต้นคือทุกอย่างชัดเจน:นักพัฒนาใหม่สามารถเข้าใจขอบเขตทั้งหมดของ state machine ได้อย่างรวดเร็ว
มาดูกันว่าเราจะเพิ่มผลข้างเคียงให้กับการเปลี่ยนได้อย่างไร เราจะจัดส่งคำสั่งซื้อที่บรรจุและจัดส่งได้โดยอัตโนมัติ:
แม้ว่าการใช้งานแบบไร้เดียงสาจะใช้งานได้ดี แต่ก็มีรายละเอียดมากเกินไป โดยเฉพาะอย่างยิ่งเมื่อเรามีการเปลี่ยนแปลงและเงื่อนไขมากมาย
การตรวจสอบ Ruby Toolbox อย่างรวดเร็วจะแสดงอัญมณีหลายรายการสำหรับเครื่องสถานะ131 และ 149 เป็นประเภทที่ได้รับความนิยมมากที่สุด และทั้งสองรายการมาพร้อมกับอะแดปเตอร์ ActiveRecord หากคุณต้องการใช้กับ Rails ทั้งสองรายการได้รับการทดสอบอย่างละเอียดและพร้อมสำหรับการผลิต ดังนั้น โปรดตรวจสอบว่าคุณจำเป็นต้องติดตั้งเครื่องสถานะหรือไม่
การใช้ State Machines Gem ใน Ruby
สำหรับโพสต์นี้ ผมจะอธิบายวิธีที่เราสามารถสร้างโมเดลเครื่องสถานะสำหรับ 153 ของเรา โดยใช้ 162 อัญมณี
คลาสข้างต้นจะกำหนดเครื่องสถานะอย่างง่ายของเราและการเปลี่ยนแปลงที่เป็นไปได้ทั้งหมด นอกจากนี้ ยังเปิดเผยวิธีการอรรถประโยชน์มากมายในคำสั่งซื้อโดยอัตโนมัติ:
ดำเนินการผลข้างเคียงด้วย State Machines Gem ใน Ruby
ตามปกติสำหรับระบบในโลกแห่งความเป็นจริง การเปลี่ยนแปลงหลายอย่างในเครื่องสถานะจะมาพร้อมกับผลข้างเคียง 177 gem ทำให้ง่ายต่อการกำหนดและดำเนินการ เรามาเพิ่มผลข้างเคียงสองประการ:
- ในการเปลี่ยนเป็น
181ทั้งหมด สร้างการส่งมอบหากคำสั่งซื้อคือ196. - บน
207ทั้งหมด กิจกรรม ส่งอีเมลไปยังผู้ใช้เพื่อแจ้งให้ทราบถึงกิจกรรม
เราสามารถดำเนินการเปลี่ยนได้ตามปกติตามลำดับ:
ฉันขอแนะนำให้ตรวจสอบหน้า Github สำหรับ 216 อัญมณีเพื่อเรียนรู้เกี่ยวกับตัวเลือกที่เป็นไปได้ทั้งหมดที่อัญมณีเสนอ
ใช้ State Machines Gem กับ ActiveRecord ใน Ruby on Rails
ตามที่กล่าวไว้ก่อนหน้านี้ ทั้ง 228 และ 239 รองรับ ActiveRecord เมื่อคุณใช้ 242 gem ด้วย ActiveRecord ไม่มีอะไรเปลี่ยนแปลงมากนักเมื่อใช้งาน คุณสามารถใช้สิ่งที่เราได้พูดคุยไปแล้วในส่วนก่อนหน้าของโพสต์นี้ต่อไปได้
นี่คือคุณสมบัติเพิ่มเติมบางส่วนที่คุณได้รับ:
- ผลข้างเคียงเกิดขึ้นภายในธุรกรรม ซึ่งหมายความว่าหากคุณดำเนินการกับฐานข้อมูลบางอย่างภายใน transition hooks และธุรกรรมล้มเหลว การเปลี่ยนแปลงสถานะจะไม่เกิดขึ้น ดู
256หากคุณต้องการปิดการใช้งานพฤติกรรมนี้ - เช่นเดียวกับการเรียกกลับ ActiveRecord อื่นๆ ทั้งหมด หากคุณต้องการอัปเดตแอตทริบิวต์ของโมเดลปัจจุบันจากการเปลี่ยนแปลง คุณต้องดำเนินการนี้ภายใน
266โทรกลับ หากต้องการอัปเดตแอตทริบิวต์ภายใน278คุณต้องบันทึกโมเดลอีกครั้ง ลองดูตัวอย่างต่อไปนี้:
- อัญมณีจะจัดเตรียมขอบเขตโดยอัตโนมัติเพื่อกรองโมเดลตามสถานะ ตัวอย่างเช่น คุณสามารถ
280เพื่อค้นหาคำสั่งที่กำลังดำเนินการทั้งหมดหรือ299เพื่อค้นหาคำสั่งซื้อทั้งหมดที่ไม่อยู่ระหว่างดำเนินการ - หากมีการพยายามเปลี่ยนสถานะโดยไม่มีการเปลี่ยนที่ตรงกัน (เช่น จาก
305ถึง318) บันทึกจะไม่สามารถบันทึกได้ และข้อผิดพลาดจะถูกเพิ่มลงในข้อผิดพลาดในการตรวจสอบ หากต้องการทำให้ข้อความแสดงข้อผิดพลาดที่สร้างขึ้นเป็นสากล เพียงเพิ่มคีย์บางคีย์เพื่อจัดเตรียมการแปลสำหรับสถานะและเหตุการณ์ภายในไฟล์กำหนดค่า (เช่น321):
หมายเหตุด้านข้าง :ลองอ่านโพสต์นี้เพื่อแก้ไขปัญหาประสิทธิภาพการทำงานของ ActiveRecord
สรุป:สร้างเครื่องสถานะใน Ruby
ในโพสต์นี้ เราได้สำรวจว่าทำไมเราถึงใช้เครื่องสถานะในการพัฒนา ก่อนที่จะสร้างเครื่องสถานะแบบธรรมดา สุดท้าย เราพิจารณาการใช้สเตทแมชชีนเจมใน Ruby และ Ruby on Rails
ตอนนี้คุณมีความเข้าใจพื้นฐานเกี่ยวกับเครื่องของรัฐแล้ว ฉันแน่ใจว่าคุณจะรับรู้สถานการณ์ต่างๆ รอบตัวคุณที่ใช้เครื่องของรัฐอยู่แล้วหรือจะได้รับประโยชน์อย่างมากจากเครื่องนี้
ไว้คราวหน้า ฉันขอให้คุณโชคดีในการสร้างเครื่องจักรของรัฐ!
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>
พุลกิต โกยาล
Pulkit ผู้เขียนรับเชิญของเราเป็นวิศวกรและที่ปรึกษาอาวุโสด้านฟูลสแต็ค ในเวลาว่าง เขาเขียนเกี่ยวกับประสบการณ์ของเขาในบล็อก
บทความทั้งหมดโดย Pulkit Goyal