트랙
/
Elixir
Elixir
/
연습 문제
/
공동체 정원
공동체 정원

공동체 정원

학습 연습 문제

소개

Agent

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 구조체는 이미 제공되어 있어요.

1. 텃밭 열기

CommunityGarden.start/1 함수를 구현해요. 이 함수는 _에이전트 프로세스_로 전달할 선택적인 키워드 목록 옵션을 받아요. 텃밭의 초기 상태는 빈 구획 모음을 나타내도록 초기화되어야 해요. 텃밭의 pid와 함께 :ok 튜플을 반환해요.

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

2. 등록 목록 조회하기

CommunityGarden.list_registrations/1 함수를 구현해요. 이 함수는 공동 텃밭의 pid를 받아요. 저장된 구획 중 등록된 구획의 목록을 반환해요.

CommunityGarden.list_registrations(pid)
# => []

아직 구획을 등록하는 기능을 추가하지 않았으니, 이 목록은 비어 있어야 해요

3. 구획을 사람에게 등록하기

CommunityGarden.register/2 함수를 구현해요. 이 함수는 공동 텃밭의 pid와 구획을 등록할 이름을 받아요. 성공하면 구획의 id와 등록한 사람이 담긴 Plot 구조체를 반환해요.

id는 순차적으로 증가하며 고유해야 해요. 에이전트의 상태에 id 카운터를 두면 돼요.

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를 반환해요. 구획을 해제해도 id는 재사용하지 않고, 고유 식별자로만 사용해요.

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개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.