Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเรียนรู้เครื่องจักรของรัฐใน Ruby:คู่มือปฏิบัติ

เครื่องสถานะสามารถเก็บสถานะที่เป็นไปได้ทั้งหมดของ บางสิ่งบางอย่าง และการเปลี่ยนที่อนุญาตระหว่างสถานะเหล่านี้ ตัวอย่างเช่น เครื่องสถานะสำหรับประตูจะมีเพียงสองสถานะ (01 และ 19 ) และมีเพียงการเปลี่ยนสองครั้งเท่านั้น (26 และ 31 ).

ในทางกลับกัน เครื่องสถานะที่ซับซ้อนสามารถมีสถานะที่แตกต่างกันได้หลายสถานะโดยมีการเปลี่ยนแปลงหลายร้อยครั้งระหว่างสถานะเหล่านั้น ในความเป็นจริง หากคุณมองไปรอบ ๆ คุณจะสังเกตเห็นเครื่องสถานะที่มีจำกัดอยู่รอบตัวคุณ — เมื่อคุณซื้อจากเว็บไซต์ รับแพ็คมันฝรั่งทอดจากตู้จำหน่ายสินค้าอัตโนมัติ หรือแม้แต่เพียงแค่ถอนเงินจากตู้ ATM

ในโพสต์นี้ เราจะดูวิธีตั้งค่าเครื่องสถานะใน Ruby และใช้เครื่องสถานะเจม

เครื่องจักรของรัฐอยู่ระหว่างการพัฒนา

เมื่อใดที่เราจะต้องมีเครื่องจักรของรัฐในการพัฒนา? คำตอบง่ายๆ คือเมื่อใดก็ตามที่คุณต้องการสร้างโมเดลกฎหลายกฎสำหรับการเปลี่ยนสถานะหรือแสดงผลข้างเคียงในการเปลี่ยนบางอย่าง สิ่งสำคัญที่นี่คือการระบุส่วนของแอปพลิเคชันของคุณที่จะได้รับประโยชน์จากเครื่องสถานะ ตัวอย่างที่ดีที่เหมาะกับฉันเสมอคือ 45 ในบริบทของแอปพลิเคชันอีคอมเมิร์ซ

สำหรับแอปพลิเคชันง่ายๆ ที่ขายสินค้าออนไลน์ 58 สามารถอยู่ในสถานะใดสถานะหนึ่งได้:

  • 61
  • 77
  • 80
  • 98
  • 108
  • 113

คุณสามารถดูการเปลี่ยนผ่านที่อนุญาตได้ในไดอะแกรมต่อไปนี้

การเรียนรู้เครื่องจักรของรัฐใน Ruby:คู่มือปฏิบัติ

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

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

เครื่องสถานะเครื่องแรกของเราใน Ruby

มาลองใช้ 121 ของเรากัน กับรูบี้

 

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

สิ่งที่ยอดเยี่ยมเกี่ยวกับการใช้งานข้างต้นคือทุกอย่างชัดเจน:นักพัฒนาใหม่สามารถเข้าใจขอบเขตทั้งหมดของ state machine ได้อย่างรวดเร็ว

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

 

แม้ว่าการใช้งานแบบไร้เดียงสาจะใช้งานได้ดี แต่ก็มีรายละเอียดมากเกินไป โดยเฉพาะอย่างยิ่งเมื่อเรามีการเปลี่ยนแปลงและเงื่อนไขมากมาย

การตรวจสอบ Ruby Toolbox อย่างรวดเร็วจะแสดงอัญมณีหลายรายการสำหรับเครื่องสถานะ131 และ 149 เป็นประเภทที่ได้รับความนิยมมากที่สุด และทั้งสองรายการมาพร้อมกับอะแดปเตอร์ ActiveRecord หากคุณต้องการใช้กับ Rails ทั้งสองรายการได้รับการทดสอบอย่างละเอียดและพร้อมสำหรับการผลิต ดังนั้น โปรดตรวจสอบว่าคุณจำเป็นต้องติดตั้งเครื่องสถานะหรือไม่

การใช้ State Machines Gem ใน Ruby

สำหรับโพสต์นี้ ผมจะอธิบายวิธีที่เราสามารถสร้างโมเดลเครื่องสถานะสำหรับ 153 ของเรา โดยใช้ 162 อัญมณี

 

คลาสข้างต้นจะกำหนดเครื่องสถานะอย่างง่ายของเราและการเปลี่ยนแปลงที่เป็นไปได้ทั้งหมด นอกจากนี้ ยังเปิดเผยวิธีการอรรถประโยชน์มากมายในคำสั่งซื้อโดยอัตโนมัติ:

 

ดำเนินการผลข้างเคียงด้วย State Machines Gem ใน Ruby

ตามปกติสำหรับระบบในโลกแห่งความเป็นจริง การเปลี่ยนแปลงหลายอย่างในเครื่องสถานะจะมาพร้อมกับผลข้างเคียง 177 gem ทำให้ง่ายต่อการกำหนดและดำเนินการ เรามาเพิ่มผลข้างเคียงสองประการ:

  1. ในการเปลี่ยนเป็น 181 ทั้งหมด สร้างการส่งมอบหากคำสั่งซื้อคือ 196 .
  2. บน 207 ทั้งหมด กิจกรรม ส่งอีเมลไปยังผู้ใช้เพื่อแจ้งให้ทราบถึงกิจกรรม
 

เราสามารถดำเนินการเปลี่ยนได้ตามปกติตามลำดับ:

 

ฉันขอแนะนำให้ตรวจสอบหน้า Github สำหรับ 216 อัญมณีเพื่อเรียนรู้เกี่ยวกับตัวเลือกที่เป็นไปได้ทั้งหมดที่อัญมณีเสนอ

ใช้ State Machines Gem กับ ActiveRecord ใน Ruby on Rails

ตามที่กล่าวไว้ก่อนหน้านี้ ทั้ง 228 และ 239 รองรับ ActiveRecord เมื่อคุณใช้ 242 gem ด้วย ActiveRecord ไม่มีอะไรเปลี่ยนแปลงมากนักเมื่อใช้งาน คุณสามารถใช้สิ่งที่เราได้พูดคุยไปแล้วในส่วนก่อนหน้าของโพสต์นี้ต่อไปได้

นี่คือคุณสมบัติเพิ่มเติมบางส่วนที่คุณได้รับ:

  1. ผลข้างเคียงเกิดขึ้นภายในธุรกรรม ซึ่งหมายความว่าหากคุณดำเนินการกับฐานข้อมูลบางอย่างภายใน transition hooks และธุรกรรมล้มเหลว การเปลี่ยนแปลงสถานะจะไม่เกิดขึ้น ดู 256 หากคุณต้องการปิดการใช้งานพฤติกรรมนี้
  2. เช่นเดียวกับการเรียกกลับ ActiveRecord อื่นๆ ทั้งหมด หากคุณต้องการอัปเดตแอตทริบิวต์ของโมเดลปัจจุบันจากการเปลี่ยนแปลง คุณต้องดำเนินการนี้ภายใน 266 โทรกลับ หากต้องการอัปเดตแอตทริบิวต์ภายใน 278 คุณต้องบันทึกโมเดลอีกครั้ง ลองดูตัวอย่างต่อไปนี้:
 
  1. อัญมณีจะจัดเตรียมขอบเขตโดยอัตโนมัติเพื่อกรองโมเดลตามสถานะ ตัวอย่างเช่น คุณสามารถ 280 เพื่อค้นหาคำสั่งที่กำลังดำเนินการทั้งหมดหรือ 299 เพื่อค้นหาคำสั่งซื้อทั้งหมดที่ไม่อยู่ระหว่างดำเนินการ
  2. หากมีการพยายามเปลี่ยนสถานะโดยไม่มีการเปลี่ยนที่ตรงกัน (เช่น จาก 305 ถึง 318 ) บันทึกจะไม่สามารถบันทึกได้ และข้อผิดพลาดจะถูกเพิ่มลงในข้อผิดพลาดในการตรวจสอบ หากต้องการทำให้ข้อความแสดงข้อผิดพลาดที่สร้างขึ้นเป็นสากล เพียงเพิ่มคีย์บางคีย์เพื่อจัดเตรียมการแปลสำหรับสถานะและเหตุการณ์ภายในไฟล์กำหนดค่า (เช่น 321 ):
 

หมายเหตุด้านข้าง :ลองอ่านโพสต์นี้เพื่อแก้ไขปัญหาประสิทธิภาพการทำงานของ ActiveRecord

สรุป:สร้างเครื่องสถานะใน Ruby

ในโพสต์นี้ เราได้สำรวจว่าทำไมเราถึงใช้เครื่องสถานะในการพัฒนา ก่อนที่จะสร้างเครื่องสถานะแบบธรรมดา สุดท้าย เราพิจารณาการใช้สเตทแมชชีนเจมใน Ruby และ Ruby on Rails

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

ไว้คราวหน้า ฉันขอให้คุณโชคดีในการสร้างเครื่องจักรของรัฐ!

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! การเรียนรู้เครื่องจักรของรัฐใน Ruby:คู่มือปฏิบัติ

พุลกิต โกยาล

Pulkit ผู้เขียนรับเชิญของเราเป็นวิศวกรและที่ปรึกษาอาวุโสด้านฟูลสแต็ค ในเวลาว่าง เขาเขียนเกี่ยวกับประสบการณ์ของเขาในบล็อก

บทความทั้งหมดโดย Pulkit Goyal