Viblo Learning
+3

RuboCop - An awesome Ruby code style checker

rubo-logo-horizontal.png Khi làm việc trong một dự án về Ruby, nếu bạn là người review code của những thành viên khác trong team, hẳn sẽ mất khá nhiều thời gian để tìm và phát hiện ra những lỗi liên quan đến coding convention của dự án đó nhỉ. Những lúc đó, chắc hẳn bạn đã rất cần đến một công cụ hỗ trợ việc kiểm tra tự động những lỗi convention mắc phải phải không? (cuoideu). Vậy thì bạn đã tìm được câu trả lời ở bài viết này rồi đó, đó chính là RuboCop.

Rubocop

Rubocop là một công cụ để phân tích và so sánh code Ruby với một số quy tắc đã được định nghĩa sẵn (Các quy tắc của RuboCop thường được gọi là "cops").

Rubocop được xây dựng để phục vụ cho các Ruby developer (dance3). Các quy tắc trong RuboCop có thể được enable hoặc disable tùy ý. Ta cũng có thể tùy chỉnh các quy tắc trong RuboCop để có thể thực thi những chuẩn riêng ứng với từng dự án Ruby.

Sử dụng RuboCop sẽ giúp chúng ta tạo ra những dòng code Ruby tốt hơn:

  • Đánh giá được code của bạn với các số liệu như độ dài của dòng, kích thước hàm.
  • Giúp cho các thành viên trong cùng một dự án tạo ra được cấu trúc code tương tự nhau.
  • Thiết lập được sự thống nhất trong source code.

Cài đặt

Để cài đặt, bạn có thể gõ lệnh sau từ terminal:

$ gem install rubocop

hoặc thêm gem sau vào Gemfile, sau đó chạy lệnh Bundle:

gem 'rubocop', require: false

Cách sử dụng

Chạy lệnh rubocop không có đối số sẽ kiểm tra tất cả các file Ruby trong thư mục hiện tại.

$ rubocop

Hoặc bạn có thể kiểm tra một danh sách các file và các thư mục như sau:

$ rubocop app spec lib/something.rb

Ví dụ, tôi có một đoạn code Ruby sau:

# test.rb
def badName
  if something
    test
    end
end

Sau khi chạy lệnh rubocop test.rb, kết quả kiểm tra code sẽ được như sau:

Inspecting 1 file
W

Offenses:

test.rb:1:5: C: Use snake_case for method names.
def badName
    ^^^^^^^
test.rb:2:3: C: Use a guard clause instead of wrapping the code inside a conditional expression.
  if something
  ^^
test.rb:2:3: C: Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
  if something
  ^^
test.rb:4:5: W: end at 4, 4 is not aligned with if at 2, 2
    end
    ^^^

1 file inspected, 4 offenses detected

Phân tích lỗi convention:

  • Tên method phải dưới dạng snake_case, ví dụ good_name
  • Sử dụng guard clause thay thế cho conditional expression:
    def badName
      return unless something
      test
    end
  • Hoặc, nên viết câu điều kiện như sau khi chỉ có 1 dòng đơn:
   def badName
      test if something
   end
  • end ở dòng 4 không cùng lề với if ở dòng 2

Symbols

Các symbol sau xuất hiện trong Output ở trên dùng để chỉ những kết quả đánh giá như sau:

Symbol Mô tả
. File không có bất cứ vấn đề nào
C File có một vấn đề liên quan đến convention
E File có chứa một error
F File có chứa một fatal error
W File có chứa một warning

Ví dụ đơn giản ở trên đã cho thấy, chúng ta đã có thể dễ dàng và nhanh chóng phát hiện ra lỗi convention mà chúng ta đã sơ ý mắc phải với RuboCop đúng ko nào (cuoideu).

Để biết thêm về những options của lệnh rubocop, bạn có thể gõ:

$ rubocop -h

Hầu hết tất cả các cops trong RuboCop đều dựa trên Ruby Style Guide. Nhiều cops có cấu hình tùy chọn, cho phép chúng hỗ trợ các coding convention phổ biến khác nhau. Để thay đổi giá trị mặc định của các cops, ta có thể tùy chỉnh ở trong .rubocop.yml. Sử dụng .rubocop.yml, ta có thể override các giá trị mặc định của các cop thành enable hoặc disable.

Cú pháp

Một file .rubocop.yml có cấu trúc như sau:

NAME_OF_RULE:
  Description: 'a description of a rule'
  Enabled : (true or false)
  KEY: VALUE

trong đó:

  • NAME_OF_RULE là tên của một cop
  • Enabled dùng để kích hoạt (true) hoặc vô hiệu quá (false) một cop mặc định.
  • KEY: VALUE dùng để thêm thông tin chi tiết về một cop nào đó. Ví dụ Max: 100 để thiết lập độ dài của một dòng với 100 ký tự.

Một ví dụ về .rubocop.yml được sử dụng trong dự án tôi đang làm như sau:

# Maximum line length
LineLength:
  Max: 100

Encoding:
  Enabled: false

TrailingComma:
  Enabled: false

# Maximum method length
MethodLength:
  Max: 20

Các cài đặt đó đã disable 2 cop mà đúng ra nó là enable trong RuboCop ở chế độ mặc định, đó là: Encoding, TrailingComma và nó đã thay đổi giá trị LineLengthMethodLength lần lượt thành 100 ký tự và 20 ký tự.

Để biết rõ hơn về các cops khác, bạn có thể tham khảo thêm tại đây Cops (yeah).

Trên đây, tôi đã trình bày sơ qua về tính năng cũng như cách sử dụng của một công cụ hỗ trợ kiểm tra coding convention tự động rất hiệu quả, hi vọng nó đã giúp ích được cho bạn đọc (yeah).

Tài liệu tham khảo

  1. Ruby Style Guide
  2. Rubocop gem

All Rights Reserved