4

私はC#のバックグラウンドを持っていますが、暇なときにRubyを学んでいます。

与えられたクラスでは、それらのメソッドprivateを、public(デフォルト)または。にすることができますprotected。私はそれらの使用法を理解していますが、ユーザーがアクセスを簡単にオーバーライドできる動的言語であるにもかかわらず、Rubyコードがそのような修飾子を使用するのは一般的ですか?

のようなものをSend使用すると、ユーザーはプライベートメソッドにアクセスできますが、Rubyとアクセス修飾子に関するベストプラクティスは何でしょうか。言い換えれば、私は私のクラスでそれらを利用するべきですか?

4

3 に答える 3

8

クラスを指定すると、それらのメソッドをプライベート、パブリック(デフォルト)、または保護することができます。私はそれらの使用法を理解していますが、ユーザーが簡単にアクセスをオーバーライドできる動的言語であるにもかかわらず、Rubyコードがそのような修飾子を使用するのは一般的ですか?

それは意図を伝え、公開しているインターフェースを最小限に抑えるため、まだ比較的一般的です。遵守すべきいくつかの規則:

  • public特に明記しない限り、すべてのメソッドはパブリックであり、メソッドは通常、アクセス変更によってグループ化されるため、単に省略してください。

  • ユーザーはアクセスをオーバーライドできますが、それはユーザーがオーバーライドする必要があるという意味ではありませんほぼ同じように、C#開発者がプライベートメソッドにアクセスできるようにクラスにILスタブを挿入するなどのクレイジーなことをしているのを見ることはありません)。したがって、区別することは依然として有用です。

  • 保護されたメソッドは、C#の場合よりもややまれです。これは、Rubyが動作を渡す手段として継承を実際に推奨していないためです。Module一般的な動作は、多くの場合、 sにリファクタリングしてからinclude/extend、必要に応じて-edすることができます。

  • プライベートメソッドはC#とほぼ同じくらい一般的です。Rubyは、非常に特殊なことを行う多くの小さなメソッドを好むことがよくあります。これらのメソッドを一緒に作成して、何か便利なものを取得します。ただし、これらのメソッドはパブリックインターフェイスの一部ではなく、整理された状態に保ちたいため、公開しません。

  • プライベートメソッドはインターフェイスの一部とは見なされないため、免責で自由に変更できるはずです。それらを非公開にすることで、これらのメソッドとその実装または定義がいつでも変更される可能性があることに他の人に気付かせることができます。

于 2010-06-26T13:36:43.783 に答える
4

私はいつもそれがインターフェースを公開することだと思っていました。あなたはあなたのユーザーがあなたの実装に圧倒されることを望まないので、あなたはそのようなものをプライベートにします。彼らに優しいです。たとえば、配列を扱うとき、あなたは本当にあなたの方法で別の71のメソッドが欲しいですか(あなたはほとんど間違いなく気にしませんか?)


RUBY_VERSION                    # => "1.8.7"
Array.new.public_methods.size   # => 149
Array.new.private_methods.size  # => 71

プライベートメソッドのもう1つの重要な意味は、「変更される可能性がある」ということです。インターフェイスにコミットするときは、それをサポートする必要があります。彼らが新しいバージョンをダウンロードするたびにみんなのコードを壊して行くことはできません。プライベートなものは不安定であると理解されています。それらは公開されていないため、自由に変更できることを意味します。ユーザーがプライベートメソッドに依存するコードを作成した場合、それはあなたのせいではありません(ユーザーがそれをやっていないと仮定すると、あなたは彼らにくだらないインターフェースを与えました)。ですから、将来それをより良くするための余地を自分自身に与えるためにそれをプライベートにすることができます。

于 2010-06-26T14:06:28.860 に答える
2

コードリーダーに明確な意図を伝え、必要な保護を提供するため、コードで引き続き使用します。別の開発者がメソッドをオーバーライドするか、#sendを介して直接呼び出す場合は、正当な理由があるか、少なくともそのようにする必要がある理由を理解している可能性があります。

コードでPrivate/Protectedを使用すると、メソッドをオーバーライドする将来の開発者にとってより明確になり、誰もオーバーライドしない場合でも適切に機能します。

于 2010-06-26T13:24:17.443 に答える