2012-01-12 11 views
3

end_userがアプリのソースコードにアクセスできない場合は、まだいくつかのメソッドをプライベートにする必要があるのはなぜですか?私たちは、以下の方法をプライベートにする必要がある理由と、私は理解できませんでしたレールと実用的なアジャイルウェブ開発を読んでいるRails:メソッドをプライベートにする主な理由は何ですか?

(でも、説明を読んだ後):

private 
    def current_cart Cart.find(session[:cart_id]) 
    rescue ActiveRecord::RecordNotFound 
    cart = Cart.create 
    session[:cart_id] = cart.id 
    cart 
    end 
end 

それがすることを言いますRailsがアクションとして利用できるようにすることは決して許されませんが、コーダーとして、なぜ私はこれを自分でやるのでしょうか?

+0

これは参考になるかもしれません:http://stackoverflow.com/questions/4495078/protected-and-private-methods-in-rails – someoneinomaha

+0

リンクをありがとう。ヘルパーメソッドは直接アクセスできるので、ヘルパーメソッドを明確にしています(これは危険です)。しかし、そういう場合に私はもっとプライベートをもっと効率的に使う方法の例を期待しています。 –

答えて

6

あなたが言うように、非公開にする外部の理由はありません。しかし、それはまた、あなたやあなたのコードを使用している他の人が誤ってあなたが想定していない方法を使用するのを防ぐのです。

あなたの将来の行動についての健全性チェックとしてそれを見てください。

+0

"自分の将来の行動についての健全性チェック" - きちんと入れてください。 –

+0

私はプライベートを作ることは本当に本質的なものだと考えました。「ねえ、あなたはその方法を非公開にするか、誰かがあなたのアプリをハックしようとしています。しかし、明らかに、それはとにかくそれをするのは簡単ではない。少なくともRails上で。 –

+0

もしもメソッドが公開されていれば、それは絶対にアプリをハックして呼び出しを行うことはできません。あなたの認証/認証方法にも依存しますが、ほとんどのセキュリティと同様に、いくつかのレイヤーを持ち、1つのことに頼らないことがベストです! –

0

エンドユーザーがあなたのコードにアクセスできない可能性がありますが、チーム内の他の誰かが間違いなくアクセスでき、変更する可能性があります。

カプセル化のもう1つの利点は、1つのクラス(「サーバー」)が別のクラス(「クライアント」)と契約して、サービスを提供することができ、メソッドシグニチャーや戻り値の型などの「サーバー」クラス。利益は、必要なものと返されるものの契約が同じである場合にのみ実現されます。したがって、あなたの例では、クラスAによって契約が壊れてしまったため、メリットはありません。

クラスAがint型をfloatに変更するのではなく、クラスAは他のクラスが使用できるようにfloat型の新しい変数を作成する必要があります。クラスBは「壊れていない」、または契約はそれらの間で壊れていない。クラスCは新しいフロート変数を参照することができ、クラスBは引き続き古いint変数を参照することができ、誰もが満足しています。さらに、メソッドは、必要なものに応じて、 "getUsersAddress"や "getUSersPhoneNumber"などの値を取得するために使用されます。

優れたカプセル化の本当の利点は、クラスAが上から下に完全に書き直されることができ、クラスAが何を期待しているかについて契約が尊重されている限りです(メソッド "getUsersAddress"と "getUSersPhoneNumber ")、クラスBとCのすべてが同じように動作します。どのようなものが暴露され、どのように暴露されているかを注意深く考えてください頻繁に変更され、他のクラスを破るものは、公開する前に慎重に検討する必要があります。良いカプセル化とは、頻繁に変更されることが予想されるものを隠し、他のクラスを壊さないようにすることです。

0

はそれが

うーん、これはRailsのConrollerクラスであり、Railsはアクションとしてそれを利用できるようにすることができないことを言いましたか?そして、あなたが作業している本はRails 2.xのために書かれていますか?

Rails 2.xでは、デフォルトではとなります。コントローラー内の任意のパブリックメソッドは、url/name_of_controller/name_of_methodにアクセスする誰かによってトリガーされます。

しかし、コントローラーには、ウェブ上の誰かがトリガーすることを望まない方法がいくつかありますが、それらは「アクション方法」として意図されていません。だから、Rails 2.xでは、それらをprotectedまたはprivateというように公開します。 「アクションメソッド」とは、URLを介して直接トリガーされることを意図したメソッドを意味します。

In Rails 3。xでは、ルーティングは一般的に変更され、明示的にルーティングする特定のメソッドのみがURL経由でトリガーされるようになっています。その保護やプライベートとしてしかし、それはまだコントローラにおける非アクションメソッドをマークするのは意味があります:

  • それはメソッドがアクションメソッドであり、
  • よう
  • でないソースをスキミングからより明らかです誰かがURLがアクションメソッド

またはレールに固有ではない他の回答が言及していること、コード、組織の一般的な理由から、用として意図していないこれらのメソッドをトリガーすることが可能になるような方法でルーティングを変更する場合には用心コントローラクラス。

+0

これはRails 4th for Rails 3.xのPragmatic Agile Web Developmentのものです。 著者は私的または公的な使用方法についてはあまり説得力がありませんでした。だから私はここで質問した。 しかし、それは良い理由があるように見えますが、必須ではありません。「ちょっとプライベートでないと、あなたはアプリが安全ではありません。 –

0

上記のような理由がいくつかあります。ルビのカプセル化に関する興味深いことは、それが違反される可能性があることです。

"send"メソッドとその兄弟 "public_send"を参照してください。

そして、この方法を使用する非常に一般的なメタプログラミング技術には、以下を参照してください。

dynamic finders

2

それは良いプラクティスと良いコードを奨励することを目指しています。

アイデアは、あなたのコードには2つの別々の部分を持っているということです。

(公開)「線の上に」。これは世界の他の国々とのインターフェースです。これは、オブジェクトのインスタンスを使用するときに呼び出されるAPIです。作成されると、これは変更がコードの現在の使用法に影響する可能性のある領域であることがわかります。

は「(プライベート)行の下。これは、詳細なロジックが存在する場所。このコードを変更し、任意のなく自由にパブリックインターフェイスに影響を与えるリファクタリングすることが可能である。

それは書き込みテストを手助けする

  • プライベートメソッドはテストされていても、テストされていなくてもかまいません。
  • パブリックメソッドは、パブリックメソッドであるという事実がそのコードのパブリックインターフェイスとして機能し、それは将来何か他の点から呼び出されるかもしれないので、gそれが広告されたように動作し続けることを確認するための大気テストは不可欠です。

プライベートメソッド(つまり、それらを呼び出す同じクラスのパブリックメソッドのみ)を呼び出すコントロールを強化すると、セキュリティに役立つ場合があります。

パブリックスペースの名前が少ないほど、名前の衝突を減らすのに役立ちます。

関連する問題