2012-04-06 2 views
0

これは良い方法ですか?定数によってアクセスされるオブジェクトの格納。処理のために他のクラスによってアクセスされるオブジェクトを格納する方法はたくさんあります。代わりにコレクションを指すハッシュオブジェクトを格納するための手段として定数を使用することは、最近@ * @ class_variables以外にも始めたことです。もしあれがあれば、プロ/詐欺師は何になるだろうか? OOPにはまったく新しいものではありませんが、何が悪い習慣になるかはわかります。これは良い方法ですか?定数によってアクセスされるオブジェクトの格納...

#!/usr/bin/env ruby 
    OUTSIDE_STATE = true 

    NAMES = {:objects => []} 

    module CheckSelf 
    module ClassMethods 
     def self.inherited(child) 
     ::NAMES[:objects] << child 
     end 

     def select_and_make_calls 
     _selected = NAMES[:objects].select {|child| 
      child.purpose() 
      }.each {|child| 
      # _child = child.new(child) 
      child.new(child).call_out 
     } 
     end  
    end 

    module InstanceMethods 
     def call_out 
     puts "FIRING OFF THE CALLS #{self.class}" 
     end 
    end 

    def self.included(receiver) 
     receiver.extend   ClassMethods 
     receiver.send :include, InstanceMethods 
    end 
    end 

    class Parent 

    def initialize(name) 
     @name = name 
    end 

    include CheckSelf 

    # The inherited class must be defined in the * 
    # Body of the class. 
    def self.inherited(child) 
     NAMES[:objects] << child 
    end 

    end 

    class ObjectOne < Parent 

    def self.purpose 
     OUTSIDE_STATE 
    end 
    end 

    class ObjectTwo < Parent 
    def self.purpose 
     true 
    end 

    end 

    Parent.select_and_make_calls 
+0

#object_idとObjectSpaceクラスを使用して、Rubyがすでに何をしているかを見てみるとよいでしょう。http://corelib.rubyonrails.org/classes/ObjectSpace.html#M001614 – joelparkerhenderson

答えて

1

変更するデータを格納するために定数を使用することをお勧めします。定数を使用すると、データが変更されないことをインタプリタに通知するだけでなく、他のプログラマーにコードを読み取るように指示します。時間の経過とともにデータを格納する場所が必要な場合は、代わりに@@class_variable@instance_variableまたは$globalを使用してください。

これは、ルビーの大会のようなOOP規約ではありません。

+0

さらに、この時点で、上記の 'NAMES 'のような非プリミティブ型のような変更可能な型の定数は、インタプリタと他のプログラマの両方にとって、それらが定義されるとフリーズするのに便利です。 'FOO = [:bar、:baz] .freeze'。 –

関連する問題