2009-12-26 32 views
6

Tôi vừa mới bắt đầu làm việc với Ruby, và phát hiện ra bổ tuyên bố khi RubyMine đề nghị tôi thay đổi mã này:sử dụng đúng cách bổ tuyên bố của Ruby

if !VALID_DIRECTIONS.include?(direction) 
    raise ArgumentError, "Invalid direction" 
end 

này:

raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction) 

Tôi thích như thế nào nó làm cho mã ngắn gọn hơn. Tuy nhiên, tôi có thể thấy nó có khả năng gây hiểu lầm ngay từ cái nhìn đầu tiên và áp đặt một vấn đề dễ đọc, bởi vì nó đặt hiệu ứng trước tình trạng này. Sau đó, một lần nữa, có lẽ đó là chỉ vì tôi rất quen với các ngôn ngữ kiểu C.

Có ai gặp sự cố do sử dụng công cụ sửa đổi câu lệnh hay bạn cảm thấy họ đã cải thiện mã của bạn? Ngoài ra, có ai có nguyên tắc chung về việc sử dụng các công cụ sửa đổi (tức là, hoạt động đặc biệt tốt cho một số hoạt động hay không đối với một số hoạt động khác)?

Trả lời

8

Tôi thấy rằng tôi thường không gặp khó khăn khi đọc các điều kiện theo sau (vì đôi khi chúng được gọi), với điều kiện là các nguyên tắc về khả năng đọc mã khác vẫn được tuân theo. Đặt một ký tự 60 ký tự và một điều kiện 40 ký tự trên cùng một dòng, bạn sẽ kết thúc với một gob ký tự 100 ký tự, chắc chắn sẽ không thể đọc được, hoàn toàn độc lập với vấn đề dấu chấm câu có điều kiện.

Trong mẫu mã cụ thể mà bạn đang hiển thị, rõ ràng là có phải là một điều kiện sau. Ai muốn raise an ArgumentError mà không cần xem xét các đối số trước?

Ngoài ra, các điều kiện theo sau tương tự như mệnh đề bảo vệ trong các ngôn ngữ toán học và chức năng, cũng có xu hướng được viết sau cụm từ chúng đang bảo vệ.

Cuối cùng nhưng không kém, đặt một vài raise Bar if fooreturn nil if quux biểu thức vào đầu các phương pháp, như loại bảo vệ, thực sự được coi tốt phong cách, để đơn giản hóa việc kiểm soát dòng chảy của phương pháp. Một lần nữa: vì chúng xuất hiện ở đầu phương thức, rõ ràng là có có trạng thái là một điều kiện, nếu không return ing từ đầu phương thức sẽ không có ý nghĩa.


PS: Tôi thực sự sẽ sử dụng unless ở đó, để loại bỏ phủ định. Với điều kiện phức tạp hơn, tôi thấy rằng unless đôi khi có thể khó phân tích cú pháp, nhưng trong trường hợp này, nó là nhiều hơn hiển nhiên, ít nhất là IMHO.

0

Đó là vấn đề hoàn toàn chủ quan về phong cách. Sử dụng bất cứ điều gì bạn cảm thấy thoải mái.

4

Ban đầu tôi thấy hơi lạ, nhưng tôi không nghĩ nó gây ra vấn đề dễ đọc. Khi làm việc trong Ruby rất nhiều, nó có ý nghĩa hoàn hảo. Đó là chỉ khi tôi chuyển đổi qua lại với các ngôn ngữ khác mà nó là đáng chú ý. Tuy nhiên, khi bạn đắm mình trong mã Ruby, bạn sẽ tìm thấy nó một cách gọn gàng và gọn gàng khi viết một dòng điều kiện. Ngoài ra, hãy quen với việc sử dụng unless. dòng code của bạn có thể (có thể cần) được viết:

raise ArgumentError, "Invalid direction" unless VALID_DIRECTIONS.include?(direction) 
8

Tuyên Bố-bổ làm ruby ​​cư xử giống như tiếng Anh, đó là tốt đẹp:

  • nếu trời mưa, ở nhà
  • nghỉ nhà nếu trời mưa

Tôi khuyên bạn nên sử dụng biểu mẫu có vẻ tự nhiên và thanh lịch nhất cho bạn. Nếu nghi ngờ, hãy đọc to câu nói trong cả hai hình thức. Cá nhân, tôi có xu hướng chỉ sử dụng các biến tố câu lệnh cho các câu lệnh ngắn như return :nope if input.nil? - cho các câu lệnh dài hoặc phức tạp hơn, nó có thể khiến người đọc mất nhiều thời gian hơn, vì mắt chỉ che một khoảng không gian nhất định và vì vậy ai đó chỉ đọc công cụ sửa đổi trên nháy mắt thứ hai.

Các vấn đề liên quan