توفر وحدة Agent تجريدًا لإنشاء العمليات وحلقة receive-send. من هنا، سنسمي العمليات التي تُبدأ باستخدام وحدة 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، ويجب أن تستقبل قائمة اختيارية من الخيارات على شكل كلمات مفتاحية لتُمرَّر إلى عملية الوكيل. ويجب تهيئة الحالة الأولية للحديقة بحيث تمثّل مجموعة فارغة من قطع الأرض. ويجب أن تُرجع صفًا :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 مع معرّف قطعة الأرض والشخص المسجّلة باسمه.
يجب أن تكون المعرّفات متزايدة وفريدة. يمكنك الاحتفاظ بعدّاد للمعرّفات في حالة الوكيل.
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"}
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.