یکی از روشهای مهم برای سازماندهی کد، استفاده از «فضای نام» است.
کلاسها و ماژولها فضای نام فراهم میکنند.
ممکن است اسم دو متد با هم تداخل پیدا کند که با قرار دادن آنها در فضای نامهای متفاوت برطرف میشود.
فضای نامها میتوانند تودرتو باشند، که میتواند در ساختاردهی به کدبیسهای بزرگ کمک کند.
دسترسی به فضای نامها با عملگر تفکیک دامنه، ::، انجام میشود.
مثال زیر استفاده از دو متد متفاوت 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
شما در یک دفتر وکالت معتبر کار میکنید که در رسیدگی به درخواستهای وصیتنامهی منحصربهفرد تخصص دارد.
در این تمرین، میخواهید یک گاوصندوق مرموز را باز کنید. شما مجری وصیت هستید و رمزهای مخفی و دیرینهی سه خانواده را کنار هم میگذارید تا یک شماره حساب و رمز متناظر آن را به دست آورید.
برای اینکه هیچ خانوادهای نتواند بهتنهایی گاوصندوق را باز کند، این گاوصندوق تنها با ترکیب دانش آن خانوادهها با یک تعدیلکنندهی مخفی که شما از وصیتنامه میدانید باز میشود.
شما سه کار دارید که همهشان به کمک به خانوادهها برای باز کردن گاوصندوق مربوط میشوند.
یک فضای نام به اسم EstateExecutor تعریف کنید.
کدی که در کارهای بعدی مینویسید باید در بدنهی فضای نام EstateExecutor تعریف شود.
class SomeName
# The space between the class/module name
# and the `end` keyword
# is called body of the namespace.
end
این لحظهی بزرگ شماست. تنها شما کلید تعدیلکنندهی مخفی را دارید تا شماره حساب مخفی را آشکار کنید.
متدی به اسم assemble_account_number(secret_modifier) تعریف کنید که تعدیلکنندهی مخفی از نوع Integer را به عنوان آرگومان میگیرد و شماره حساب سرهمشدهی Integer را برمیگرداند.
برای به دست آوردن شمارهی درست، باید bank_number_part هر یک از این سه خانواده را با هم جمع کنید.
دستورالعملهای وصیتنامه از شما میخواهند که همهی قطعههای آبی و سپس همهی قطعههای قرمز را جمع کنید. رمز حاصل از ضرب این دو مجموع در هم به دست میآید.
متدی به اسم assemble_code تعریف کنید که رمز حاصل را با ترکیب قطعههای سه خانواده در یک نتیجهی واحد Integer برمیگرداند.
این متد هیچ آرگومانی ندارد و تنها بر اطلاعات موجود در فضای نامهای مربوط به هر خانواده تکیه میکند.