باغ محله

باغ محله

تمرین یادگیری

مقدمه

Agent

ماژول Agent انتزاعی برای راه‌اندازی فرایندها و حلقه‌ی دریافت-ارسال فراهم می‌کند. از این پس، فرایندهایی را که با استفاده از ماژول Agent راه‌اندازی می‌شوند، «فرایندهای عامل» می‌نامیم. ممکن است یک فرایند عامل برای نمایش یک حالت اشتراکی مرکزی انتخاب شود.

برای شروع یک فرایند عامل، Agent تابع start/2 را فراهم می‌کند. تابعی که هنگام start کردن فرایند عامل ارائه می‌دهید، حالت اولیه‌ی فرایند را برمی‌گرداند:

# Start an agent process with an initial value of an empty list
{:ok, agent_pid} = Agent.start(fn -> [] end)

درست مانند Map یا List، Agent توابع زیادی برای کار با فرایندهای عامل فراهم می‌کند.

مرسوم است که تمام قابلیت‌های مرتبط با Agent را در یک ماژول برای دامنه‌ی در حال مدل‌سازی سازماندهی و کپسوله کنند.

دستورالعمل‌ها

انجمن محله‌ی شما از شما خواسته است که یک برنامه‌ی ثبت ساده برای مدیریت ثبت‌نام‌های باغ محله پیاده‌سازی کنید. ساختار Plot هم از قبل برایتان آماده شده است.

1. باغ را باز کنید

تابع CommunityGarden.start/1 را پیاده‌سازی کنید. این تابع باید یک فهرست کلیدواژه‌ی اختیاری از گزینه‌ها دریافت کند تا به فرایند agent فرستاده شود. حالت اولیه‌ی باغ باید طوری مقداردهی شود که نماینده‌ی مجموعه‌ای خالی از قطعه‌ها باشد. این تابع باید یک تاپل :ok همراه با pid باغ برگرداند.

{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}

2. ثبت‌نام‌ها را فهرست کنید

تابع CommunityGarden.list_registrations/1 را پیاده‌سازی کنید. این تابع باید pid باغ محله را دریافت کند. باید فهرستی از قطعه‌های ذخیره‌شده که ثبت شده‌اند برگرداند.

CommunityGarden.list_registrations(pid)
# => []

در این مرحله هنوز امکان ثبت قطعه را اضافه نکرده‌ایم، پس این فهرست باید خالی باشد

3. قطعه‌ها را به اسم یک شخص ثبت کنید

تابع CommunityGarden.register/2 را پیاده‌سازی کنید. این تابع باید pid باغ محله و یک اسم را برای ثبت قطعه دریافت کند. در صورت موفقیت باید ساختار Plot را همراه با شناسه‌ی قطعه و شخصی که قطعه به اسم او ثبت شده است برگرداند.

شناسه‌ها باید افزایشی و یکتا باشند. می‌توانید یک شمارنده‌ی شناسه در حالت فرایند agent نگه دارید.

CommunityGarden.register(pid, "Emma Balan")
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.list_registrations(pid)
# => [%Plot{plot_id: 1, registered_to: "Emma Balan"}]

4. قطعه‌ها را آزاد کنید

تابع CommunityGarden.release/2 را پیاده‌سازی کنید. این تابع باید pid و id قطعه را که باید آزاد شود دریافت کند. در صورت موفقیت باید :ok برگرداند. وقتی قطعه‌ای آزاد می‌شود، شناسه‌اش دوباره استفاده نمی‌شود و فقط به عنوان یک شناسه‌ی یکتا به کار می‌رود.

CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []

5. یک قطعه‌ی ثبت‌شده را بگیرید

تابع CommunityGarden.get_registration/2 را پیاده‌سازی کنید. این تابع باید pid و id قطعه را که باید بررسی شود دریافت کند. اگر قطعه ثبت شده باشد آن را برمی‌گرداند و اگر ثبت نشده باشد :not_found را برمی‌گرداند.

CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید باغ محله را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.