web-dev-qa-db-ja.com

Rubyでプライベートメソッドを配置する場所

ブログ、チュートリアル、書籍のほとんどには、クラス/モジュールの下部にプライベートメソッドがあります。これがベストプラクティスですか?

必要に応じてプライベートメソッドを使用すると便利です。例えば:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

このように、上下にスクロールし続けるのではなく、コードが読みやすくなり、非常にいらいらします。

このアプローチにはひどく間違っていることがありますか?下部にプライベートメソッドがあるのは、ベストプラクティスだけではありませんか?

93
ZX12R

私の観点でのベストプラクティスは、順番に進み、観点を非公開にせずにメソッドを宣言することです。

最後に、追加するだけでメソッドをプライベートにすることができます:private :xmethod

例:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

これはあなたの質問を正当化しますか?

127
kiddorails

Ruby 2.1。以来、メソッド定義の前にprivateを追加するオプションもあります。

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

定義を見れば、メソッドがプライベートであるかどうかは、ファイルのどこで定義されていてもすぐにわかります。 (オートコンプリートしない場合)もう少し入力する必要があり、すべてのdefsがうまく整列されるわけではありません。

53
Dennis

他の人がすでに指摘しているように、慣習はプライベートメソッドを1つのプライベートクラスの下に置くことです。ただし、多くのプログラマーは、このために二重インデント(2ではなく4つのスペース)メソッドを使用していることをおそらく知っているはずです。その理由は、多くの場合、テキストエディタに「プライベート」が表示されず、それらがパブリックであると想定するためです。以下の図を参照してください。

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

このメソッドにより、上下にスクロールする必要がなくなり、他のプログラマーがコードを快適に使用できるようになります。

51
Noah Clark

パブリックメソッドはオブジェクトのインターフェイスの一種であり、最も目立つ場所、つまりファイルの先頭に配置するのが論理的だと思います。

15
Flexoid

各メソッドの上にpublicprivateを置く必要はありません。通常、プライベートメソッドはすべてクラスの一番下に配置します。また、メソッドはデフォルトでパブリックなので、publicを明示的に言う必要はありません。例えば:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end
12
Kyle Decot

私はJava backgroundから来ており、メソッドのタイプを見るためにスクロールしなければならないのが嫌いです。 #private各suckメソッドの前に宣言してからprivate :...

6
akostadinov

それは私が思うに好みの問題ですが、私はむしろそのように言ったメソッドの後の行で各メソッドをプライベートにむしろ明示的に名前を付けます:

 class Example
   def cthulhu
   end

   def rlyeh
   end

   def foo
   end
   private :foo

   def bar
   end
   private :bar

   def baz
   end
   private :baz     
 end
4
crogers

各メソッドにパブリックまたはプライベートを指定する必要はありません。すべてのプライベートメソッドを下部に配置すると、ファイルごとに「プライベート」のインスタンスを1つ持つことができます。好みの問題だと思います。

4
David

1つのスタイルは、メソッドをグループ化して、privateprotectedをクラスごとに1回だけ使用することです。別のスタイルは、メソッド定義の直後に可視性を指定することです:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

Ruby 2.1.0 defはメソッド名をシンボルとして返すため、より合理化されたスタイルが可能です。

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(注意:private_class_methodクラスメソッドの場合-そうでなければ、NameError: undefined methodprivateはインスタンスメソッドを想定しているため。元の例のようにマクロとして使用する場合でも、インスタンスメソッドの可視性にのみ影響します。

このインライン表示スタイルは、メソッドを必要に応じて整理できるため、最も気に入っています。間違った場所に新しいメソッドを追加し、誤ってプライベートにするリスクを減らします。

クラスメソッドの構文については、代わりにこの方法で処理できます。

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end
4
devpuppy

デニスには完璧な答えがありました。つまり、Ruby> = 2.1を使用する場合、defの前にprivate(またはprotected、public)を付けるだけです。

しかし、次のようにprivateをブロックとして使用することも可能になったと思います。

private begin
   def foo
   end
   def bar
   end
end

def Zip
end
1
edx

通常、メソッドは次のように注文します。

  1. コンストラクタ
  2. その他のパブリックメソッド、アルファベット順
  3. private、1回だけ書き込まれます
  4. プライベートメソッド、アルファベット順

エディターで「定義に移動」機能を使用して、スクロールをあまり行わないようにします。いずれにしても、スクロールが問題になるほどクラスが大きい場合は、おそらくいくつかのクラスに分割する必要があります。

0