2012-01-04 36 views
10

Chỉ cần tự hỏi, khi nào chúng ta thực sự phải sử dụng private hoặc protected đối với một số phương pháp trong mô hình?Khi nào chúng ta nên xem xét sử dụng riêng tư hoặc được bảo vệ?

Đôi khi tôi không thể không bị làm phiền khi nhóm các phương pháp của mình trong private cũng không protected. Tôi chỉ để nó như vậy thôi. Nhưng tôi biết nó phải là một thực hành tồi, nếu không thì hai nhóm này sẽ không được tạo ra trong lập trình.

Cảm ơn.

Trả lời

15
  • Nếu bạn có kế hoạch để gọi một phương thức bên ngoài, record.method(), sau đó "công cộng"
  • Nếu nó sẽ chỉ được sử dụng nội bộ, self.method(), sau đó "private"
  • Nếu bạn có kế hoạch để sử dụng nó trong nội bộ, nhưng cũng trong con cháu, self.method() # in subclass, sau đó "bảo vệ"
+2

Điều này nghe có vẻ hơi khó hiểu đối với tôi ... điểm ** thứ 3 của bạn **. Một lớp con có thể truy cập các phương thức 'private' của siêu lớp bên trong nó. Phương thức 'protected' cho bạn khả năng truyền vào một đối tượng của cùng một lớp và thực hiện các phương thức được bảo vệ trên đối tượng đó. – slindsey3000

+0

http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby "phương pháp được bảo vệ có thể thực sự được gọi bất cứ lúc nào người nhận cùng lớp với 'tự' ' – clyfe

0

Tôi không biết Ruby là một trường hợp đặc biệt, nhưng tôi cho rằng câu trả lời sẽ được giống như cho các ngôn ngữ khác nữa, vì vậy ở đây là:

Một phương pháp tư nhân chỉ có thể được truy cập bởi các thành viên của cùng một lớp, trong khi một lớp được bảo vệ cũng có sẵn cho các thành viên của các lớp mở rộng lớp cơ sở, nơi phương thức được khai báo.

+0

Yupp, đây là câu hỏi chung về lập trình. Tôi đã đọc những gì 'private' và' protected', nhưng khi nào chúng ta không bỏ qua nó? – Victor

+0

Bạn có nghĩa là trường hợp, nơi mà một phương pháp không được tuyên bố là công khai, riêng tư hoặc được bảo vệ? – fkerber

+0

@Victor Bạn không 'bỏ qua' đóng gói, nhưng nói chung giữ cho mọi thứ 'riêng tư' trừ khi có lý do chính đáng để chúng được 'protected' hoặc' public' –

2

tôi sẽ cung cấp Theo tôi, và có lẽ tôi sẽ nhận được một đá cho nó, nhưng tôi không bận tâm với bảo vệ hoặc tư nhân trong Ruby. Thực tế là, Ruby đối xử với bạn như một người lớn, nếu bạn muốn chạy một phương pháp riêng tư từ bên ngoài lớp học, bạn có thể (có areways). Bạn có thể chạy các phương thức được bảo vệ bên ngoài lớp. Bạn thậm chí có thể gán lại các hằng số ... bạn có thể làm bất cứ điều gì bạn thích, về cơ bản.

Và đó là lý do tôi thích nó, đó là trách nhiệm của bạn. Cảm giác của tôi là, để đánh dấu một cái gì đó như protected hay private bạn đang làm hai điều:

  1. Indicating rằng bạn không nghĩ một người tiêu dùng sẽ cần đến nó.
  2. Thứ hai đoán những gì người khác cần.

và ngoài ra, bạn đang làm cho nó khó khăn hơn để kiểm tra, vì nó có thể là một nỗi đau thực sự thử nghiệm các phương pháp riêng (xem What's the best way to unit test protected & private methods in Ruby? cách xung quanh nó)

Đối với những người hai lý do cuối cùng, tôi don' t bận tâm với họ. Nếu bạn thực sự muốn một số loại rào cản giữa các lớp/phương pháp của bạn và người tiêu dùng (có thể là mã hoặc nhà phát triển) thì có những cách khác hiệu quả hơn (proxy, obfuscation, mã hóa, phương pháp bảo vệ bằng mật khẩu, v.v.). Nếu không, tại sao không cấp cho họ quyền truy cập vào cùng một công cụ bạn đã sử dụng?

+1

+1 Tôi có suy nghĩ tương tự. Lý do duy nhất tại sao ** I ** sử dụng nó: rdoc có tùy chọn '--visibility'. Với công khai, được bảo vệ và riêng tư, tôi có thể tạo các phiên bản tài liệu khác nhau với nhiều chi tiết hơn hoặc ít hơn. – knut

+0

@knut đó là một ý tưởng thú vị, tôi sẽ phải ghi nhớ điều đó. Tôi có xu hướng sử dụng yardoc và nó có thẻ '@ private', nhưng tôi chưa từng thấy nó sử dụng cái gì. Cảm ơn. – iain

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