17

Đây là một ý tưởng tuyệt vời về mối quan tâm trong đường ray: http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concernsRails ActiveSuppport: Lo ngại và phương pháp Private

Và nó cũng là một ý tưởng tốt để làm cho phương pháp rất nhỏ mà không phải là một phần của một API công cộng. Nếu không sử dụng mối quan tâm, những người trở thành phương pháp riêng tư trong một lớp ruby.

Việc tạo các phương thức riêng tư bên trong Rails ActiveSupport :: Mô-đun quan tâm có hợp lý không? Nếu vậy, không làm việc riêng tư cho cả hai phương pháp dụ thường xuyên và phương pháp lớp trong định nghĩa quan tâm?

Trả lời

16

Có ý nghĩa khi tạo phương thức riêng tư bên trong mô-đun Rails ActiveSupport::Concern không?

Xem xét các mối quan tâm đó là các mô-đun thông minh sẽ được đưa vào các lớp khác - đúng vậy. Nó chỉ là một mã di động, hành vi có thể trích xuất và tôi muốn xem xét nó như là một phần của bộ điều khiển (hoặc mô hình của tôi, vv) khi tôi đang viết nó. Vì vậy, về cơ bản bạn chỉ cần khai báo các phương thức private hoặc protected như bình thường.

lẽ the post you linked đã được cập nhật kể từ năm 2013, nhưng DHH thực hiện chính xác rằng trong một trong những ví dụ đó:

module Dropboxed 
    extend ActiveSupport::Concern 

    included do 
    before_create :generate_dropbox_key 
    end 

    def rekey_dropbox 
    generate_dropbox_key 
    save! 
    end 

    private # <- Let's list some privates 

    def generate_dropbox_key 
    self.dropbox_key = SignalId::Token.unique(24) do |key| 
     self.class.find_by_dropbox_key(key) 
    end 
    end 
end 

Đối với private phương pháp lớp học, tôi đồng ý với @Hugo và không bao giờ sử dụng chúng bản thân mình, nhưng dưới đây là cách bạn có thể đạt được điều này:

module Dropboxed 
    extend ActiveSupport::Concern 

    included do 
    private_class_method :method_name 
    end 

    module ClassMethods 
    def method_name 
    end 
    end 
end 
+0

Điều này sẽ không làm cho phương thức bị ẩn, bạn vẫn cần sử dụng từ khóa "riêng tư" cho việc này. –

+0

Có vẻ như khi được gọi từ một phương thức quan tâm, 'self.class.method_name' không thể truy cập được vì riêng tư. – ybart

2

Nó chỉ là ý kiến ​​của tôi nhưng ngay bây giờ tôi đang gãi đầu về phương pháp lớp học tư nhân, những gì họ tốt cho? Dù sao, nếu bạn thực sự cần họ tham khảo bài đăng này: How to create a private class method?

Có ý nghĩa khi có phương pháp cá nhân riêng tư trong mô-đun quan tâm và sẽ hoạt động tốt. Các phương thức lớp riêng cũng sẽ hoạt động tốt nhưng theo sau bài viết đã nêu ở trên.

+0

nó đơn giản: bạn cần phải phá vỡ bạn phương pháp lớp thành những phần nhỏ hơn, và không muốn để lộ những khối trong giao diện lớp. Về cơ bản, cùng một lý do bạn sẽ sử dụng các phương thức riêng trong bất kỳ trường hợp nào khác. – meta

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