コードを整理するための重要な方法のひとつが、名前空間の利用です。
クラスとモジュールは名前空間を提供します。
2つのメソッドの名前が衝突することがありますが、それぞれを別の名前空間に置けば解決できます。
名前空間は入れ子にできるので、大きなコードベースを構造化するのに役立ちます。
名前空間へのアクセスには、スコープ解決演算子::を使います。
次の例では、2つの異なるfooメソッドを使っています。
それぞれの名前空間を前に付けることで、両者を一緒に使えます。
class MyNamespace
def self.foo
44
end
class MyInnerNamespace
def self.baz
90
end
end
end
class MyOtherNamespace
def self.foo
-2
end
end
p MyNamespace::foo + MyOtherNamespace::foo * MyNamespace::MyInnerNamespace::baz # => -136
名前空間は、実行中のコードがどの位置にあるかによって解釈されることに注意してください。
ルート名前空間(つまり、定義されたすべての名前空間の外側)にあるものを参照するには、先頭に::を付けます。
たとえば、次のようになります。
class Example
def self.example
5
end
end
class MyNamespace
class Example
def self.example
10
end
end
def self.call_example
p Example::example # => 10
p ::Example::example # => 5
end
end
ここは、風変わりな遺言の依頼を専門に扱う一流の法律事務所です。
この演習では、謎に包まれた金庫を開けることになります。遺言執行者として、3つの家系が長く守ってきた秘密のコードを組み合わせ、口座番号とそれに対応するコードを手に入れましょう。
どの家系も単独では金庫を開けられないようにするため、金庫は、それぞれの家系の知識に、遺言から知ることになる秘密の修飾子を組み合わせたときにだけ開くようになっています。
家系が金庫を開けるのを手助けするための、3つのタスクがあります。
EstateExecutorという名前の名前空間を定義します。以降のタスクのコードは、EstateExecutor名前空間の本体の中に定義します。
class SomeName
# The space between the class/module name
# and the `end` keyword
# is called body of the namespace.
end
いよいよ本番です。秘密の口座番号を明かすための秘密の修飾キーを持っているのは、ここでは1人だけです。
Integerの秘密の修飾子を引数に取り、組み立てられた口座番号をIntegerとして返す、assemble_account_number(secret_modifier)メソッドを定義します。
正しい番号を求めるには、3つの家系それぞれのbank_number_partを合計します。
遺言の指示では、まず青い断片をすべて足し、次に赤い断片をすべて足すよう求められています。できあがるコードは、この2つの合計を掛け合わせることで得られます。
3つの家系の断片を組み合わせて1つのIntegerの結果とし、できあがるコードを返すassemble_codeメソッドを定義します。このメソッドは引数を取らず、家系の該当する名前空間にある情報だけを使います。