2016-07-16 11 views
-1

誰かが私的な方法で「保護された」方法ではできないことを達成する具体的な例を教えてもらえますか?言い換えれば、私はなぜ言語設計者がRubyに「プライベート」メソッドを入れるのかを知りたいと思っています。Rubyで私的なメソッドが必要なのはなぜでしょうか

+0

あなたは、保護されているか公開されている以上の機能を有効にしていないのは間違いありません。実際には、彼らは機能を取り去ってしまいます。具体的には、定義されているクラス/モジュールの外で実行する方法を少し難しくします。他のメソッドで内部的に使用されるヘルパーメソッドを考えてみましょう。ライブラリを使用している人は、おそらくこのヘルパーメソッドを直接呼び出すことはありません。それは非公開としてマークされているので、ソースコードを閲覧している誰かがこの機能を認識します。機能を追加するのではなく、開発者の生活を容易にするという点で型チェックのようなものです。 –

+0

私が見つけたプライベートメソッドの使い方は、「グローバル」メソッド(どのクラスの外でも定義されたメソッド)を定義する際の使い方です。これらのメソッドはObjectのプライベートメソッドになり、受信者なしで呼び出すことができます。 。しかし、これは言語設計上の問題よりも構文上の砂糖の機能のほうが多いです。 –

+0

私は本当に理解していません。グローバルメソッドを定義している場合、つまりグローバルスコープで 'def foo'を定義している場合。その公的または私的な場合、それはどのような違いがありますか?どちらの場合でも 'foo'を呼び出すことができます。プライベートな、または保護されたメソッドがメソッドを呼び出すのを完全に防ぐことは決してないことにも言及する価値があります - ちょうど 'send'が時々使われることを要求します。 –

答えて

1

これは実際に開発チームとコードの使用方法によって異なります。 Rubyでは、これらのタグは多くの場合ハードやファーストルール以上の提案ですが、必要に応じてprivateprotectedのメソッドをバイパスする方法がありますが、コードを使用している人がそれらを呼び出すことが望ましくない場合があります。

privateは、何かをサブクラス化しようとする人にとって、人生を非常に困難にする可能性があるため、控えめに使用する必要があります。通常はprotectedで十分であり、であるべき方法への外部コードの操作に役立ちます。

privateが必要な場合があります。つまり、サブクラスが親クラスの仕組みをあまり知りません。これは、あなたがサブクラス化することを奨励する図書館ではより一般的ですが、ユーザーが使用しようとしていない内部機能の一部を取り除きたい場合もあります。これにより、他の人のコードを壊すことなく、後でこれらのメソッドをリファクタリングすることができます。

オブジェクト指向設計の原則の1つは、メソッドの露出量を制御することです。あまりにも多くの露出がある場合は、あなたが壊れた変更を行う準備ができていない限り、今や将来も同じように動作させることを約束しています。暴露量が少なすぎると、クラスが役に立たないとは限りません。そのバランスを見つけることは常に難しいです。

だからprivateprotectedがあります。これは、C++、Java、PHP、Pythonなど多くの人がこれを持っている理由とほぼ同じです。メソッドをどこでどのように使用するかを制御することを主張します。

+0

' private'はサブクラス化が難しい例を挙げられますか? –

+0

@JörgWMittagあなたのメソッドについて過度に保護していて、サブクラスが有用な何かを行うためにこれらの 'private'メソッドの1つにアクセスする必要がある場合は、それが問題です。それは非常に状況が厳しいですが、あなたが必要とすることがガラスの後ろに閉じ込められているので、いつ起こるのかを知るでしょう。 – tadman

+0

スーパークラスが、メソッドをサブクラスにアクセスするのを防ぐために、それを 'private'にすることはできません。 'private'がサブクラスのスーパークラスのメソッドへのアクセスを妨げる例を挙げることができますか? –

関連する問題