RubyCritic ให้รายงานภาพที่เน้น code smells, โครงสร้างโค้ด, ความง่ายในการทดสอบ และ test coverage ในแอปพลิเคชัน Ruby ของคุณ
มันอยู่ใน active development โดยเครื่องมือวิเคราะห์โค้ดใหม่มักถูกนำเสนอเป็นฟีเจอร์ใหม่ เหมาะสมที่จะติดตาม releases ของ RubyCritic
บทความนี้จะพูดถึงประโยชน์บางอย่างของ RubyCritic, dependencies ของมัน และวิธีอ่าน code reports ของมัน
ลองเริ่มกันเถอะ!
ทำไมต้องเลือก RubyCritic สำหรับแอปพลิเคชัน Ruby on Rails ของคุณ?
คุณควรพิจารณาใช้ RubyCritic หากคุณต้องการที่เดียวในการ review การปรับปรุงโค้ดสำหรับโปรเจกต์ของคุณ การรวม RubyCritic ในกระบวนการพัฒนาจะแน่นอนลดเวลาที่ทีมพัฒนาใช้ทำงานกับ technical debts Technical debts ส่วนใหญ่จะถูก map out ในขณะพัฒนา
ประโยชน์บางอย่างที่ RubyCritic ให้กับโปรเจกต์และกระบวนการพัฒนาของคุณรวมถึง:
- ข้อมูลรวมในที่เดียว
- รายงานภาพ
- การติดตั้งง่าย
- Zero configuration
- อนุญาตการปรับแต่ง
- Extensible — คุณสามารถทำ open-source integration ของตัวเองได้
- Badge generator 🎉
เพื่อเข้าใจว่า RubyCritic ทำงานอย่างไร มาดู internal dependencies ที่มันใช้ในการสร้างรายงาน
Internal Dependencies ใน RubyCritic
เมื่อคุณเพิ่ม RubyCritic ในโปรเจกต์ของคุณ dependencies บางอย่างจะถูกรวมเข้าด้วยกัน
มาเน้น dependencies ที่ทำให้เวทมนตร์เกิดขึ้น: gems Reek, Flay, และ Flog Dependencies เหล่านี้ช่วยให้ RubyCritic แสดงข้อมูลมีค่าเกี่ยวกับโค้ดของคุณ การเข้าใจว่าพวกเขาทำงานอย่างไรก็ทำให้ RubyCritic ใช้ง่ายขึ้น
Reek: ตรวจจับ Code Smells ใน Ruby
Reek เป็น gem สำหรับตรวจจับ code smells ใน Ruby Bad smell ในโค้ดไม่ได้เกี่ยวกับการระบุโค้ดที่ผิด มันเกี่ยวกับการวิเคราะห์ว่าโค้ดอาจเขียนได้ดีกว่านี้
การวิเคราะห์ของ Reek ระบุ ว่า สิ่งใดอาจถูก implement ในอีกวิธีหนึ่ง มันไม่แนะนำ วิธี เนื่องจาก code smells ส่วนใหญ่เกี่ยวข้องกับ business logic และประสบการณ์ของนักพัฒนากับภาษา
ตัวอย่างเช่น คุณอาจ rewrite if statement ได้ง่ายด้วย metaprogramming techniques วิธีแก้ไข แต่อยู่ที่นักพัฒนาตามบริบทของโปรเจกต์ ในกรณีนี้ ไม่มีไลบรารีไหนจะบ่งชี้โซลูชันที่ดีที่สุด
Reek ตรวจจับรายการ smells ที่กว้างขวาง มันตรวจสอบและระบุ smells ที่เป็นไปได้ใน:
- Classes
- Attributes
- Methods
- Parameters
- Modules
- Iterators
- Implementation ของ polymorphism
ด้วยการหา smells คุณสามารถทำขั้นตอนเพื่อทำให้โค้ดของคุณอ่านง่ายและ maintain ได้มากขึ้น
Reek อนุญาต custom configuration เพื่อ:
- Disable detector โดย type
- Exclude directories จากการ scan
- ใช้ filters เพื่อปิด warnings
คุณแม้แต่สามารถกำหนดโค้ดเฉพาะที่จะ suppress ในการ scan ฟีเจอร์ที่มีประโยชน์มากเมื่อโค้ดยังไม่ final หรือ refactored หรือแม้แต่ legacy code
ลองดูตัวอย่าง Reek ทำงานอย่างไร ในโค้ดนี้ exception ถูกกำหนดแค่ e
ง่ายที่จะจินตนาการว่า e หมายถึง exception แต่ถ้าเรามี exceptions อื่นๆ การระบุพวกเขาอย่างถูกต้องคือวิธีดีที่สุดในการรักษาโค้ดที่ดี
Reek จะระบุ e ว่าเป็น UncommunicativeVariableName และแสดง warning
Flay: ตรวจสอบการซ้ำของโค้ด Ruby
Flay ระบุ structural similarities ของโค้ด Ruby รวมถึง:
- ตรวจจับ code duplication ภายในโปรเจกต์
- ตรวจสอบความแตกต่างในระดับโค้ดใดๆ
- สร้าง score เพื่อวัดว่าโค้ดของคุณดีแค่ไหน (ยิ่ง score ต่ำ ยิ่งโค้ดดี)
หาก Flay รายงาน similarity ในโค้ดของคุณ มันเป็นตัวบ่งชี้สูงว่าจำเป็นต้อง refactor อย่าละเลย! โค้ดซ้ำเป็นประตูสู่ bugs หากคุณแก้ที่หนึ่งแตะลืมอีกที่ bugs มากขึ้นจะปรากฏ
เราสามารถตรวจสอบได้ว่า Flay ทำงานอย่างไรโดยรันมันใน source code ของตัวมันเอง:
Flay ระบุ similarities ระหว่างสองนี้:
สังเกตว่า spelling ของโค้ดไม่ได้เหมือนกันทุกประการ แต่ functionality เหมือนกันและสามารถ refactor เพื่อหลีกเลี่ยง duplication นั่นคือเวทมนตร์ของ Flay!
Flog: ตรวจสอบความซับซ้อนของโค้ดใน Ruby
Flog ตรวจสอบว่าโค้ดของคุณยากต่อการทดสอบแค่ไหน มันตั้ง complexity score สำหรับแต่ละบรรทัดโค้ด และรวม score สำหรับแต่ละเมธอดและคลาส
ยิ่ง score สูง ยิ่งโค้ดของคุณต้อง refactor เพราะมันหมายความว่าคุณมี implementation ที่ซับซ้อนมาก
ลองดู Flog ในการทำงาน! การเปลี่ยนแปลงเล็กน้อยสามารถทำให้ score ของคุณเปลี่ยนแปลง
สังเกตว่าในส่วนแรกของโค้ด เรามีการตรวจสอบ or ที่เพิ่ม score ขึ้น 0.4 points
RubyCritic Dependencies อื่นๆ
RubyCritic ยังใช้ runtime dependencies อื่นๆ เช่น:
byebug- นี้ยกระดับการดีบั๊กแอปพลิเคชัน Ruby ช่วยให้คุณรันโปรแกรมทีละบรรทัด เพิ่ม breakpoints และประเมินและติดตามค่าใน runtime หากคุณยังใช้putsสำหรับดีบั๊ก หนึ่งนึงคุณควรรู้จัก features และ commands ของ Byebugrubocop- linter สำหรับโค้ด Ruby ช่วยให้คุณปฏิบัติตาม style guide ที่ชุมชน Ruby ใช้ หรือแม้แต่ apply code style ของตัวเอง มันมีประโยชน์มากในการตั้งมาตรฐานในทีมและหลีกเลี่ยง conflicts เหล่าน่ารำคาญเกี่ยวกับ spaces และ tabsSimpleCov- เครื่องมือตรวจสอบ code coverage ของแอปพลิเคชัน Ruby คุณสามารถ config ให้รันควบคู่กับ tests มันให้ metrics เกี่ยวกับ code coverage เพื่อให้คุณระบุได้ว่าต้องเพิ่มใจที่ไหน และลงทุนเวลาไหนเพื่อสร้าง test cases ที่ดีกว่า
ดำดิ่งสู่รายการ dependencies ของ RubyCritic
การใช้ RubyCritic สำหรับแอป Ruby on Rails ของคุณ
RubyCritic มี documentation ที่ดีช่วยให้คุณเริ่มต้นได้โดยไม่ต้อง config มาก ดังนั้นเราจะโฟกัสที่การใช้ทรัพยากรของมันเพื่อช่วยเราวิเคราะห์รายงาน
RubyCritic ให้ reports 'Code', 'Smells', และ 'Coverage' เราจะดูแต่ละฟีเจอร์ทีละอย่าง
ภาพรวมใน RubyCritic
หน้า 'Overview' แสดง total score สำหรับโปรเจกต์บน donut chart พร้อม ratings (A เป็น rating ดีที่สุด, F แย่ที่สุด) ส่วน 'Summary' แสดงรายละเอียดแต่ละ rating รวมถึงจำนวนไฟล์, churns (การเปลี่ยนแปลง commit), และ smells ที่พบ

ในส่วน 'Churn vs Complexity' ที่นี่ 已经可以识别出复杂度最高的类,这可能应该是第一个关注点。
为了更好地理解这个图表,值得回顾一下 code churn。经常变化的代码可能会发出警报,表明某些事情出了问题——也许是在逻辑或业务领域。无论如何,查看 'Churn vs Complexity' 可以帮助你看到项目中的痛点。
Code Report
'Code' 报告显示每个类的分数,包括 churn, complexity, duplication, 和 smells 的指标。
您可以按任何列对该列表进行排序,以查看排名最高的因素并首先解决最关键的问题。

此外,此列表具有过滤器,允许您按类名快速搜索。
点击类名将打开一个详细页面,包含类代码和指标,例如:
- 代码行
- 数量方法
- 计算出的 churn
- 按方法的复杂度
- 复杂度分数(每个类的总分)
- 发现的重复数量
- 气味数量
发现问题的代码行将被高亮显示(基于 Reek gem 提供的信息)。
如果 Flog 识别出任何问题,您将看到分数。如果 Flay 报告检测到任何重复代码,您也会看到。

Smells Report
'Smells' 页面显示 smell 类型、出现 smell 的确切位置和修复状态。
如前所述,smells 由 Reek 检测,此页面也提供排序和过滤功能。
点击类名将打开包含代码详细信息的页面。您还可以查看按 smell 类型分组的类(这在 'Code' 页面中缺失,后者仅显示 smells 的数量)。

Coverage Report
最后,您可以在 'Coverage' 报告中看到每个类的分类和覆盖率百分比。与 'Code' 和 'Smells' 报告上的列表不同,'Coverage' 中的列表不允许排序和过滤信息。
您只能看到代码覆盖率的百分比 — 没有其他信息。

集成 SimpleCov 报告可以为此页面增加更多价值和用处。但无论如何,如果您需要简单的报告来检查项目的测试覆盖率,'Coverage' 报告可以帮助您。
总结
在这篇文章中,我们简要介绍了 RubyCritic 对您的 Ruby 应用程序的好处,然后深入探讨了其内部依赖:Reek、Flay 和 Flog。然后我们演示了如何阅读和分析 RubyCritic 的报告。
作为下一步,弄清楚如何在您的管道中使用 RubyCritic。
快乐地重构代码!
P.S. 如果您想在 Ruby Magic 文章一发表就阅读,请订阅我们的 Ruby Magic 时事通讯,永远不错过任何一篇文章!

Brena Monteiro
客座作者 Brena 是一位热衷于指导新开发人员的技术负责人,拥有开发和领导高性能团队的经验。她在构建可扩展的 API 和云服务集成方面拥有经验,对进化架构充满热情,并是扩展现实 (XR) 学徒。
Brena Monteiro 的所有文章