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

แก้ไขข้อบกพร่อง Ruby และ Rails อย่างรวดเร็วด้วยเทคนิคที่ได้รับการพิสูจน์แล้ว

จุดบกพร่องในซอฟต์แวร์สามารถก่อกวน เข้าใจยาก น่ารังเกียจ และรุกรานได้ แท้จริงแล้ว นักพัฒนามักต้องการความเหนียวแน่นของ Edison เพื่อค้นหาและแก้ไขปัญหา

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

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

Rails มีเครื่องมือที่ยอดเยี่ยมในการตรวจดูแอปพลิเคชันที่ทำงานอยู่ รวมถึง Logger ที่กำหนดค่าได้เพื่อบันทึกการวินิจฉัยของตัวมันเองและทุก ๆ ที่คุณต้องการเพิ่ม Rails ยังจัดทำบันทึกการสืบค้นแบบละเอียดเพื่อระบุที่มาของการสืบค้นฐานข้อมูลและบันทึกการเข้าคิวแบบละเอียดเพื่อชี้แจงตำแหน่งงานพื้นหลังที่ถูกจัดคิว บันทึกสองรายการหลังเปิดใช้งานตามค่าเริ่มต้นใน 06 สภาพแวดล้อม;คุณสามารถเปิดใช้งานทั้งในสภาพแวดล้อมอื่นได้ด้วยสองคำสั่ง

 

ตัวเลือกบันทึกที่ไม่ค่อยมีคนรู้จักมีให้ใช้งานเนื่องจาก Rails 7 จะใส่คำอธิบายประกอบแต่ละแบบสอบถาม SQL พร้อมความคิดเห็น หากคุณเพิ่มสิ่งต่อไปนี้ใน 13 หรือไฟล์สภาพแวดล้อมใดๆ:

 

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

 

คุณอาจไม่ต้องการเปิดใช้งานคุณลักษณะเหล่านี้ทั้งหมดในการผลิต การสร้างบันทึกอาจมีค่าใช้จ่ายสูงในแง่ของหน่วยความจำและเวลา (ทรัพยากรที่มีจำกัดสำหรับแอปพลิเคชันภายใต้ภาระงาน)

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

ตัวอย่างเช่น คุณสามารถกำหนดชุดตัวแปรเพื่อควบคุมการบันทึกและการใช้คำฟุ่มเฟือยได้

เพื่อความสะดวก ให้สร้างคลาสขนาดเล็กเพื่อค้นหาการตั้งค่าการกำหนดค่า

 

ตอนนี้ใช้ตัวแปรและโค้ดเพื่อตั้งค่าคุณลักษณะการบันทึกใน 23 :

 

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

 

ปรับแต่ง Puma เพื่อการพัฒนา

จากส่วนก่อนหน้านี้ เรามาดูวิธีใช้ตัวแปรสภาพแวดล้อมเพื่อปรับแต่งการกำหนดค่า Puma ของคุณสำหรับการดีบักในสภาพแวดล้อมการพัฒนา

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

แก้ไข 32 เพื่อสะท้อนถึงรหัสต่อไปนี้

 

ตอนนี้คุณสามารถกำหนดค่าตัวแปรสภาพแวดล้อมทั้งสามเพื่อควบคุม Puma ในแต่ละสภาพแวดล้อมได้ ในการพัฒนา ให้ตั้งค่าเพื่อปรับให้เหมาะสมสำหรับการดีบักเชิงโต้ตอบ

 

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

 

บังเอิญที่การกำหนดค่าเริ่มต้นของ Puma ใน Rails รุ่นล่าสุดนั้นคล้ายกับที่แสดงไว้ที่นี่ (ขอบคุณ Nate Matykiewicz สำหรับคำแนะนำ)

เรียกใช้งานพื้นหลังแบบอินไลน์

แอปพลิเคชัน Rails ที่มีความซับซ้อนใดๆ มักจะใช้ประโยชน์จากงานเบื้องหลังเพื่อรันงานที่ต้องใช้การประมวลผลสูงและ (ค่อนข้าง) ที่ต้องใช้เวลานาน งานเบื้องหลังทำงานแบบอะซิงโครนัส ตัดการเชื่อมต่อจากวงจรคำขอ/ตอบกลับ ตัวเลือกที่เหมาะสมที่สุดสำหรับการประมวลผลแบบ "นอกขอบเขต" ได้แก่ การสร้างรายงาน การส่งอีเมล และการโต้ตอบกับ API ของบริษัทอื่น แต่ลักษณะของงานแบบอะซิงโครนัสยังทำให้การดีบักยุ่งยากอีกด้วย

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

มาดูตัวอย่างการใช้ Delayed Job ซึ่งเป็นแบ็กเอนด์การเข้าคิวยอดนิยมและจัดการง่ายสำหรับ Active Job งานล่าช้าให้การตั้งค่าเพื่อเปิดใช้งานการจัดคิว ตามค่าเริ่มต้น การตั้งค่าคือ 55 และงานก็เข้าคิวตามปกติ อย่างไรก็ตาม หากตั้งค่าเป็น 69 , งานจะดำเนินการทันที

เพิ่มรหัสต่อไปนี้ลงในแอปพลิเคชันของคุณใน 73 :

 

ถ้า 88 ถูกตั้งค่าเป็นค่าใดๆ การเข้าคิวจะถูกปิดใช้งาน หากตัวแปรสภาพแวดล้อมว่างเปล่าหรือไม่ได้กำหนดไว้ การเข้าคิวจะถูกเปิดใช้งาน

จากนั้น ในเชลล์ บนบรรทัดคำสั่ง หรือในไฟล์ dot ให้ตั้งค่า99 ตามความจำเป็น

 
 
 

ตั้งค่าตัวแปรสภาพแวดล้อมเป็นศูนย์หรือลบตัวแปรสภาพแวดล้อมเพื่อเรียกคืนการจัดคิว

 

ไม่มีกฎเกณฑ์ในการตั้งชื่อตัวแปรสภาพแวดล้อม เลือกชื่อที่มีความหมายต่อคุณ รูปแบบที่เป็นประโยชน์อย่างหนึ่งในการจัดหมวดหมู่ตัวแปรคือการเพิ่มชื่อแพ็กเกจเป็นคำนำหน้า เช่น 108 และ 110 . อดีตบ่งบอกถึงตัวแปรที่ส่งผลต่อ Puma; ส่วนหลังหมายถึงตัวแปรที่ใช้โดยงานล่าช้า

เพียร์เข้าสู่การโทรผ่านเครือข่าย

เช่นเดียวกับงานเบื้องหลัง แอปพลิเคชัน Rails ยังสามารถใช้ applicationprogramming interfaces (API) ได้อีกด้วย API ให้การเข้าถึงบริการภายนอก เช่น ฐานข้อมูล GraphQL ธุรกรรมอีคอมเมิร์ซ และแหล่งข้อมูลสาธารณะ

นี่เป็นอีกตัวอย่างหนึ่งในการส่งคำขอและการตอบกลับ HTTP แบบมีเงื่อนไขจาก 121 ห้องสมุด หากตัวแปรสภาพแวดล้อม 134 ถูกตั้งค่าเป็นค่าที่ไม่เว้นว่าง คำขอขาออกและการตอบกลับขาเข้าจะพิมพ์เป็น 148 .

 

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

 

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

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

  • 160 และ172 สร้างการตรวจสอบโครงสร้างข้อมูล Ruby ที่สมบูรณ์และอ่านง่าย รวมถึงโมเดล Active Record คุณสามารถใช้โค้ด gemin หรือจากคอนโซลก็ได้

    นี่คือตัวอย่างของแบบจำลองที่ปล่อยออกมาโดย 181 ในคอนโซล:

     

    แทนที่จะเป็น 197 ให้ใช้ 200 เพื่อแสดงผลลัพธ์ที่ได้รับการปรับปรุง สุดยอดการพิมพ์ listattributes ตามลำดับตัวอักษร หนึ่งแอตทริบิวต์ต่อบรรทัด รวมถึงคุณสมบัติอื่นๆ

  • 213 แทนที่หน้าข้อผิดพลาด Rails มาตรฐานด้วย stack backtrace ที่ปรับปรุง รายการพารามิเตอร์ และคอนโซลแบบโต้ตอบ ซึ่งคุณสามารถตรวจสอบเฟรมสแต็กและตัวแปรในฉากของข้อยกเว้น คุณยังสามารถผูกลิงก์ซอร์สโค้ดเข้ากับโปรแกรมแก้ไขรายการโปรดของคุณได้ นี่คือโค้ดที่จะผูก 227 เป็นรหัส Visual Studio:

     

    เรียกใช้ 231 ในเชลล์ของคุณแล้วรีสตาร์ทเซิร์ฟเวอร์ Rails ตอนนี้ลิงก์ไปยังไฟล์ที่เปิดโดยอัตโนมัติใน Visual Studio

  • เก็บ 240 ไว้ และ 258 gems (หรือทางเลือกอื่น) ทั้งในกลุ่มการทดสอบและการพัฒนาใน Gemfile . ทั้งสองอย่างมีคุณค่าอย่างยิ่งหากคุณต้องการสร้างข้อมูลอย่างรวดเร็วในคอนโซล

     

แนวคิดอีกอย่างหนึ่ง:หากคุณใช้ AppSignal เป็นเครื่องมือตรวจสอบแอปพลิเคชัน AppSignal จะมีคุณลักษณะในการตีความบันทึกของคุณและระบุแหล่งที่มาของข้อผิดพลาด โปรดดูรายละเอียดเพิ่มเติมในการดีบักใน Ruby ด้วย AppSignal

การดีบักเป็นทักษะ

การแก้ไขโค้ดเป็นงานศิลปะ และเช่นเดียวกับความพยายามสร้างสรรค์ใดๆ ยิ่งคุณฝึกฝนมากเท่าไร คุณก็ยิ่งเก่งขึ้นเท่านั้น

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

ออกไปแฮ็ค!

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

มาร์ติน สไตรเชอร์

Martin ผู้เขียนรับเชิญของเราเป็นนักพัฒนา Ruby มืออาชีพ เขาได้รับปริญญาขั้นสูงสาขาวิทยาการคอมพิวเตอร์จากมหาวิทยาลัย Purdue ดำรงตำแหน่งบรรณาธิการบริหารของนิตยสาร Linux (สหรัฐอเมริกา) เป็นเวลาห้าปี และเป็นผู้เขียนผู้ก่อตั้งคอลัมน์ "Speaking in Unix" ที่ตีพิมพ์ในพอร์ทัล DeveloperWorks ของ IBM ในอดีต เมื่อไม่ได้เขียนโค้ดหรือเขียนเกี่ยวกับโค้ด เขาจะสะสมงานศิลปะและต่อสู้กับสุนัขตัวเล็กจำนวนมาก

บทความทั้งหมดโดย Martin Streicher