簡潔な答え
短いスクリプトを書いているようですね。その場合、 のような変更可能なグローバル変数を使用できない理由はありません$tmp_dir
。ただし、変更する必要がない場合は、@sawa のようなグローバル定数のソリューションを使用する必要がありますTMP_DIR
。その場合.freeze
、偶発的な変更を避けるために文字列を呼び出す必要があります。
より長い答え
スクリプトが長くなったり複雑になったりした場合は、クラスにリファクタリングする必要があります。このTMP_DIR
場合、ソリューションは引き続き機能します。ただし、値を変更する必要がある場合は、ConfigObject
これらの変数をグループ化するクラスを作成できます。
例:
ConfigObject = Struct.new(:tmp_dir, :file_limit)
# it's a good idea to create this before everything else
$config = ConfigObject.new('/tmp/dir', 10)
class Foo
def do_something
$config.file_limit # use this somehow
$config.file_limit = 5 # change
end
end
同様の手法では、クラス変数を使用して同じことを実現します。
class ConfigObject
class << self
attr_accessor :tmp_dir, :file_limit
end
@tmp_dir = '/tmp/dir'
@file_limit = 10
end
class Foo
def do_something
ConfigObject.file_limit # use this somehow
ConfigObject.file_limit = 5 # change
end
end
ConfigObject
他のクラスで使用される「サービス」と考えてください。アプリが複雑になり、複数の相互作用するサービスが必要になる場合は、サービスへの参照を保持する一種のサービス レジストリを設定する必要がある場合があります (詳細については、Google の「依存性注入」を参照してください)。
Config
注:既に組み込みクラスであるため、クラスに名前を付けないでください。