2012-01-04 4 views
10

モデルのいくつかのメソッドに実際にprivateまたはprotectedを使用する必要があるのはいつですか?私たちはいつプライベートか保護された使用を検討すべきですか?

時々、私の方法をグループ化するのに悩まされることはありません。privateでもprotectedでもあります。私はそれをそのまま残す。しかし、私はそれが悪い習慣でなければならないことを知っています。さもなければ、これらの2つのグループはプログラミングで作成されません。

ありがとうございました。

答えて

15
  • あなたは、外部メソッドを呼び出す場合、record.method()
  • し、「パブリック」それは、内部でのみself.method()を使用する場合は、
  • し、「プライベート」あなたは内部的にそれを使用する予定の場合は、しかし、また子孫で、self.method() # in subclassは、その後、
+2

これはちょっと私には聞こえません。あなたの**第3ポイント**。サブクラスはスーパークラスの 'private'メソッドに内部的にアクセスできます。 'protected'メソッドは、同じクラスのオブジェクトを渡し、そのオブジェクトに対して保護されたメソッドを実行する機能を提供します。 – slindsey3000

+0

http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby "保護されたメソッドは、受信者が「自己」と同じクラスのときはいつでも呼び出すことができます」 – clyfe

0

私は特殊なケースとしてのRubyを知らないが、私は答えはあまりにも他の言語の場合と同じになると仮定し、そうここにある:

プライベートメソッドのみのメンバーによってアクセスすることができますメソッドが宣言されている基底クラスを拡張しているクラスのメンバに対しては、protectedメソッドも使用できます。

+0

Yupp、これは一般的なプログラミングの質問です。私は '非公開'と '保護された'のことを読んだが、いつそれを無視しなければならないのだろうか? – Victor

+0

メソッドがpublic、private、またはprotectedとして宣言されていない場合を意味しますか? – fkerber

+0

@Victorカプセル化を '無視する'のではありませんが、一般的には、 'protected'または' public'の理由がない限り、 'private'を保持します。 –

2

私は私の意見をあげる「保護」、そして多分私はそれのために蹴りを取得しますが、私はと気にしない保護やRubyでのプライベート。現実には、あなたがクラスの外からプライベートメソッドを実行したい場合、Rubyはあなたを大人のように扱います(そこにはareways)。保護されたメソッドはクラス外で実行できます。あなたは定数を再割り当てすることもできます...基本的に好きなことをすることができます。

これが私が好きな理由です。あなたの責任です。あなたは消費者がそれを必要とは思わないことを示す

  1. :私の気持ちは、次の2つのことをやっている保護またはプライベートとしてそれが何かをマークするために、です。
  2. 他人が必要とするものを2番目に推測します。

と「私はドン、これらの最後の二つの理由から

(それを回避する方法についてWhat's the best way to unit test protected & private methods in Ruby?を参照)、それはプライベートメソッドをテストする本当の痛みをすることができように加えて、あなたは、それが難しいテストするために作っています彼らと一緒にいらしてください。クラス/メソッドとコンシューマ(コードや開発者)との間に何らかの障壁が本当に必要だった場合は、他のより効果的な方法(プロキシ、難読化、暗号化、パスワード保護されたメソッドなど)があります。それ以外の場合は、使用したのと同じツールにアクセスできないのはなぜですか?

+1

+1類似の考え。 **私が**使用する唯一の理由:rdocには '--visibility'オプションがあります。パブリック、プロテクト、プライベートでは、多かれ少なかれ、さまざまなバージョンのドキュメントを生成することができます。 – knut

+0

@knutそれは興味深い考えです。私はそれを念頭に置いておく必要があります。私はyardocを使う傾向があり、 '@ private'タグを持っていますが、それが使えるものは見たことがありません。ありがとう。 – iain

関連する問題