2010-09-17 32 views
9

Tôi sử dụng rescue cho mọi thứ, không chỉ cho các trường hợp ngoại lệ "cứu". Ý tôi là, tôi chỉ thích cách nó kiểm tra xác minh của tôi và kiểm tra lại dữ liệu.Tôi có lạm dụng "cứu hộ" để kiểm tra không?

Ví dụ: giả sử tôi có mô hình Item những gì có thể có hoặc không có User. Sau đó, khi tôi muốn để có được tên của chủ sở hữu của mặt hàng đó tôi viết:

item.user.name rescue "" 

thay vì một cái gì đó giống như

item.user.nil? ? "" : item.user.name 

Nó làm cho những suy nghĩ tương tự, vì nil.name kích hoạt một ngoại lệ mà tôi cứu với "" , nhưng tôi không chắc chắn đây là thực hành tốt. Nó làm cho những gì tôi muốn, và nó làm cho nó với ít mã, nhưng ... Tôi không biết, tất cả những gì rescue từ đây và ở đó làm cho tôi cảm thấy không an toàn.

Thực tiễn không tốt hoặc lạm dụng hợp lệ từ khóa rescue có hợp lệ không?

+1

Avdi Grimm lập luận rằng 'try' là một mã nguồn http://devblog.avdi.org/2011/06/28/do-or-do-not-there-is-no-try/ và http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/, do đó, nó không chỉ là cách bạn đang làm nó là xấu, nhưng đó những gì bạn đang cố gắng làm là xấu. –

+1

@AndrewGrimm bất kỳ mối quan hệ nào? – ybakos

+1

@ybakos Tôi không biết, nhưng chúng tôi không phải là [anh em] (http://en.wikipedia.org/wiki/Brothers_Grimm). –

Trả lời

7

Tôi nghĩ bạn đang lạm dụng cứu trợ một chút, mặc dù trong Rails, có một phương pháp cụ thể cho những vấn đề này: try. Documentation

Trong trường hợp của bạn, item.user.try(:name) có thể là một cách tiếp cận đẹp hơn.

+1

Thực ra, bởi vì anh ta nói một 'mục' có thể hoặc không có 'người dùng', tôi tin anh ta cần' item.try (: user) .try (: name) ':] –

+1

Tôi không tin như vậy . Nếu anh ta không có vật phẩm, thì có, bạn đã đúng. Nhưng, nếu mục đó có thể hoặc không có người dùng, đó là toàn bộ điểm sử dụng 'try', để nắm bắt những tình huống mà' item.user' trả về nil thay vì 'User'. – theIV

1

Giống như hầu hết các ngôn ngữ khác, việc tự kiểm tra sẽ chạy nhanh hơn việc sử dụng cứu hộ.

3

Tôi cho rằng đây không thực sự là một thói quen tốt để tham gia. Tôi đã không bao giờ thực sự sử dụng tính năng này trong Ruby vì nó cảm thấy như tôi chỉ đang ẩn các trường hợp lỗi. Cũng cần lưu ý rằng bạn đang cứu bất kỳ và tất cả ngoại lệ mà không chỉ định bất kỳ loại lỗi dự kiến ​​nào. Nó luôn luôn trông giống như một cái gì đó mà sẽ làm cho gỡ lỗi xuống đường khó hơn nó cần phải được, mặc dù, như tôi đã nói, tôi đã không bao giờ bận tâm để sử dụng nó bản thân mình.

1

Thay thế cho việc lạm dụng rescue của bạn, hãy xem đá quý andand. Nó tương tự như try một bài khác được đề xuất, nhưng đẹp hơn. andand cho phép bạn nói:

item.user.andand.name 

Khái niệm sẽ nil nếu item.usernil.

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