2008-11-12 30 views
7

Trong các mô hình của tôi, có rất nhiều thuộc tính và phương thức thực hiện một số phép tính dựa trên các thuộc tính của cá thể mô hình. Tôi đã có các phương thức trả về nil nếu các thuộc tính mà các phép tính phụ thuộc vào là không. Kết quả của quyết định thiết kế này, tôi đang thực hiện rất nhiều kiểm tra nil trước khi hiển thị các giá trị này trong quan điểm của tôi.Tôi có nên tránh không kiểm tra trong chế độ xem Rails không?

Tôi nghĩ về việc có các phương thức này trả về không thay vì nil khi chúng không có đủ thông tin, nhưng tôi đã chọn nil vì zero là kết quả tính toán hợp lệ và nil ngụ ý rằng không có đủ thông tin.

Tôi có nên trả về 0 thay vì không? Có bất kỳ mô hình nào khác mà tôi có thể sử dụng để tránh thực hiện một loạt các kiểm tra nil trong quan điểm của tôi không?

Trả lời

8

Tôi có xu hướng nghĩ rằng bạn đang làm mọi việc đúng nếu vấn đề của bạn đang chọn có hiển thị hay không hiển thị, kết quả tính toán. Nếu nó sẽ không có ý nghĩa để hiển thị bất kỳ giá trị, sau đó nil là hoàn toàn hợp lý.

Nếu, tuy nhiên, logic nghiệp vụ của bạn dẫn đến việc bạn bị rơi vào trạng thái có nhiều chế độ xem thường bị trống, thì có thể bạn nên refactor sao cho chương trình của bạn bị mất abstractions bị rò rỉ.

Hãy xem xét, ví dụ: ứng dụng bắt đầu bằng cách theo dõi công thức nấu ăn cho Food. Sau đó, theo yêu cầu morph, chúng ta có khái niệm về bánh nướng cần hiển thị thông tin khác với bánh mì kẹp thịt. Thay vì có một phương pháp calculate_deliciousness_of_pie_or_nil_for_burger, và sau đó kiểm tra cho nil trong xem, tôi muốn phá vỡ đó vào một cái nhìn pie cho bánh nướng và một cái nhìn burger cho bánh mì kẹp thịt. Điều này có thể (có lẽ sẽ) yêu cầu xem xét lại trừu tượng đối tượng của tôi.

2

Câu hỏi này SO có thể cung cấp cho bạn một số cái nhìn sâu sắc về con số không hoặc không có mẫu: "Tôi đang làm rất nhiều kiểm tra bằng không trước khi hiển thị các giá trị trong quan điểm của tôi"

Best Ruby idiom for “nil or zero”

3

Tôi nghĩ việc trả lại số không là một ý tưởng hay. Một thay thế mà đôi khi tôi sử dụng là trả về một băm. Ví dụ, nếu một phương pháp thành công, tôi có thể trở lại:

{:result => 1234} 

và nếu phương pháp "thất bại", tôi có thể trở lại:

{:error => 'Insufficient attributes to calculate result.'} 

này làm cho nó tầm thường để xác định kết quả mà không cần đoán.

Với điều đó đã nói, hãy đảm bảo rằng bạn tạo các phương thức trợ giúp để gọi các phương thức này và kiểm tra kết quả của chúng. Chế độ xem nên chứa rất ít logic. Vì vậy, chứ không phải làm điều này để kiểm soát hay không kết quả được hiển thị:

<% if result = some_method -%> 
    Your result is <%=h result -%>.<br /> 
<% end -%> 

Bạn nên làm điều này:

<% display_some_method %> 

và #display_ phương pháp some_ nằm trong app/giúp đỡ/whatever_helper.rb.

+1

Bạn nên sử dụng == trong ví dụ trên. – maurycy

1

Tôi tấn công vấn đề này bằng hai cách tiếp cận.

Tôi cố gắng di chuyển nhiều yêu cầu kiểm tra hơn vào mô hình.Ví dụ, phương pháp Apartment#address_visible?(current_user) làm cho nó sạch hơn nhiều.

Vì Rails 2.3 cũng có phương thức #try chỉ gọi phương thức nếu nó đã được xác định. Nó có thể dễ dàng được đưa vào dự án của bạn bằng cách sử dụng chris 'example. Đây là trường hợp đơn giản nhất.

+0

nếu bạn không ở trên 2.3, cũng có và http://github.com/raganwald/andand –

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