2010-08-05 26 views
5

Tôi tự hỏi liệu có nên xác thực rằng các đối số được truyền cho một phương thức là của một lớp nhất định hay không.Xác thực đối số trong Ruby?

ví dụ:

def type(hash = {}, array = []) 
    # validate before 
    raise "first argument needs to be a hash" unless hash.class == Hash 
    raise "second argument needs to be an array" unless array.class == Array 

    # actual code 
end 

Có thông minh để làm việc này hay chỉ là cồng kềnh và lãng phí thời gian để xác thực tất cả các đối số đã chuyển?

Có trường hợp nào bạn muốn có thêm sự an toàn và hoàn cảnh này khi bạn không bận tâm không?

Chia sẻ trải nghiệm của bạn!

Trả lời

9

Tôi sẽ không đề xuất phương pháp cụ thể này, vì bạn không thể chứa các lớp cung cấp ngữ nghĩa băm hoặc mảng nhưng không phải là lớp đó. Nếu bạn cần loại xác thực này, bạn nên sử dụng respond_to? với tên phương thức. Mảng thực hiện phương thức: [], cho những gì nó có giá trị.

OpenStruct có ngữ nghĩa băm và ngữ nghĩa của phương thức thuộc tính của trình truy cập thuộc tính, nhưng sẽ không trả về true cho điều kiện hash.class==Hash. Nó sẽ hoạt động giống như một băm trong thực tế, mặc dù.

Để đặt nó trong phối cảnh, ngay cả trong một ngôn ngữ không năng động, bạn sẽ không muốn làm theo cách này; bạn muốn xác minh rằng một đối tượng triển khai IDictionary<T>. Ruby sẽ tự ý thích điều đó, khi cần thiết, bạn xác minh rằng phương thức tồn tại, bởi vì nếu nó có, nhà phát triển có thể định hướng đối tượng của họ để hành động giống nhau. Bạn có thể cung cấp thêm sự tỉnh táo với các bài kiểm tra đơn vị xung quanh mã máy khách để thay thế cho việc buộc mọi thứ trở nên không động.

4

Tôi nghĩ rằng điều đó là không cần thiết. Tôi đã từng đọc trên blog một cái gì đó như "Nếu bạn cần phải bảo vệ mã của bạn từ những người ngu ngốc, ruby ​​không phải là ngôn ngữ cho bạn."

+1

điều đó đúng. tại sao xác thực lập trình của bạn =) –

1

Nếu bạn muốn các hợp đồng mã biên dịch/thực thi theo thời gian, thì Ruby không dành cho bạn. Nếu bạn muốn có một ngôn ngữ dễ đọc và dễ dàng kiểm tra, thì Ruby là.

5

Thường không cần phải xác thực rằng đối số là của một lớp nhất định. Trong Ruby, bạn được khuyến khích sử dụng Duck Typing.

1

Tôi nhận thấy rằng việc xác thực rằng các thông số đầu vào đáp ứng điều kiện tiên quyết của bạn là một thực tiễn rất có giá trị. Người ngu ngốc mà nó cứu bạn là bạn. Điều này đặc biệt đúng đối với Ruby vì nó không có kiểm tra thời gian biên dịch. Nếu có một số đặc điểm của đầu vào của phương thức mà bạn biết là đúng, nó làm cho các sen để kiểm tra chúng tại thời gian chạy và tăng lỗi với các thông báo lỗi có ý nghĩa. Nếu không, mã chỉ bắt đầu sản xuất rác ra cho rác trong và bạn có được một câu trả lời sai hoặc một ngoại lệ xuống dòng.

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