ماژول 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 هم از قبل برایتان آماده شده است.
تابع CommunityGarden.start/1 را پیادهسازی کنید. این تابع باید یک فهرست کلیدواژهی اختیاری از گزینهها دریافت کند تا به فرایند agent فرستاده شود. حالت اولیهی باغ باید طوری مقداردهی شود که نمایندهی مجموعهای خالی از قطعهها باشد. این تابع باید یک تاپل :ok همراه با pid باغ برگرداند.
{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}
تابع CommunityGarden.list_registrations/1 را پیادهسازی کنید. این تابع باید pid باغ محله را دریافت کند. باید فهرستی از قطعههای ذخیرهشده که ثبت شدهاند برگرداند.
CommunityGarden.list_registrations(pid)
# => []
در این مرحله هنوز امکان ثبت قطعه را اضافه نکردهایم، پس این فهرست باید خالی باشد
تابع 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"}]
تابع CommunityGarden.release/2 را پیادهسازی کنید. این تابع باید pid و id قطعه را که باید آزاد شود دریافت کند. در صورت موفقیت باید :ok برگرداند. وقتی قطعهای آزاد میشود، شناسهاش دوباره استفاده نمیشود و فقط به عنوان یک شناسهی یکتا به کار میرود.
CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []
تابع 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"}