5

以下の例を参照してください。2番目の方法を使用するのが最善だと思いますが、最初の方法も機能します。どの方法が最適で、他の方法を使用した場合の結果は何ですか?

class Test 
  def start 
    p "started"
  end
  test = Test.new 
  test.start 
end 

class Test2
  def start 
    p "started"
  end
end
test2 = Test2.new 
test2.start 
4

4 に答える 4

4

間違いなく、2 番目のバリアントの方がはるかに理にかなっていると思います。最初のものはエラーを引き起こしませんが、オブジェクトのインスタンス化は完全に時代遅れで無意味です。外部変数は、クラスのスコープ内では表示されません。

var = "string"

class A
  var = A.new
end

puts var #=> string

クロージャーはありません。外側varはクラス内とは異なります。これは、作成後にオブジェクトが「失われ」、アクセスできなくなり、最終的に GC の対象になることを意味します。

最初の例が「機能する」と言うとき、このコンテキストで機能するということは、クラス スコープでオブジェクトを作成した直後に、新しく作成されたオブジェクトのメソッドを呼び出すことができることを意味します。ただし、後で使用するためにそのオブジェクトを参照として保持することはできません (クラス (インスタンス) 変数に割り当てずに)。

後で使用するための参照が必要なく、そのような「ワンショット」操作を本当に実行したい場合は、オブジェクトをインスタンス化せずに呼び出すことができるクラス メソッドを使用するかinitialize、.インスタンス化のたびに実行する必要がある場合。

于 2012-05-25T11:43:27.963 に答える
3

ロード時にそれ自体のオブジェクトを作成するクラスを定義することはお勧めできません。オブジェクトはそれ自体でのみ使用でき、親のスコープでは使用できません (もちろん、 を介してアクセスすることもできますObjectSpace::each_object)。

于 2012-05-25T11:13:19.960 に答える
3

あなたはこれをいくつもの方法で行うことができます。それはあなた次第です。ここに楽しいものがあります...

class Test 
  def start 
    p "started"
  end
  new 
end.start

もっと深刻なことに、最初の例はすべてを 1 つのクラスにカプセル化しています。スクリプトの場合は問題ありません。すべてを独自の名前空間に配置し、ほとんどの場合、不可解なメイン オブジェクト コンテキストを回避します。必要に応じて、ネストされたクラスを定義できます。

ただし、2 番目のアプローチはより一般的です。

于 2012-05-25T11:01:54.677 に答える
2

Ruby クラスのベスト プラクティス

  • クラス定義では一貫した構造を使用してください。
  • クラス内に複数行のクラスを入れ子にしないでください。このようなネストされたクラスを、含まれているクラスと同じ名前のフォルダー内の独自のファイルにそれぞれ含めるようにしてください。
  • クラスメソッドのみを持つクラスよりもモジュールを優先します。クラスは、クラスからインスタンスを作成することが理にかなっている場合にのみ使用してください。
  • モジュールのインスタンス メソッドをクラス メソッドに変換する場合は、extend self よりも module_function を使用することをお勧めします。
  • クラス階層を設計するときは、リスコフ置換原則に準拠していることを確認してください。
  • SOLIDできるだけクラスを作るようにしてください。
  • to_sドメイン オブジェクトを表すクラスには、常に適切なメソッドを提供してください。
  • 関数の attr ファミリーを使用して、自明なアクセサーまたはミューテーターを定義します。
  • の使用は避けてくださいattr。代わりにattr_readerandを使用してください。attr_accessor
  • Struct.new自明なアクセサー、コンストラクター、および比較演算子を定義する の使用を検討してください。
  • によって初期化されたインスタンスを拡張しないでくださいStruct.new。それを拡張すると、不要なクラス レベルが導入され、ファイルが複数回必要な場合は奇妙なエラーが発生する可能性もあります。
  • 特定のクラスのインスタンスを作成するための追加の賢明な方法を提供するために、ファクトリ メソッドを追加することを検討してください。
  • 継承よりもダックタイピングを優先します。
  • (@@)継承における「厄介な」動作のため、クラス変数の使用は避けてください。
  • 使用目的に応じて、適切な可視性レベルをメソッド (private、protected) に割り当てます。すべてを公開したままにしないでください (これがデフォルトです)。結局、今は Python ではなく、Ruby でコーディングしています。
  • publicprotected、およびprivateメソッドを、それらが適用されるメソッド定義と同じくらいインデントします。その下のすべてのメソッドに適用されることを強調するために、可視性修飾子の上に 1 行、下に 1 行の空白行を残します。
  • クラスメソッドを定義するには def self.method を使用します。これにより、クラス名が繰り返されないため、コードのリファクタリングが容易になります。

これは、Ruby のベスト プラクティスに関する最良のドキュメントです: https://github.com/bbatsov/ruby-style-guide

于 2015-12-10T13:17:37.930 に答える