우리가 자주 보던 코드와 유사합니다. 이제 따라가 보죠.
Profile 클래스(05행)는 어떤 사람이 회사 혹은 구직자에게 물어볼 수 있는 적절한 질문에 대한 답변을 담고 있습니다. 예를 들어 회사는 구직자에게 “근무지를 이동해도 괜찮습니까?”라고 물어볼 수 있습니다. 구직자에 대한 Profile은 그 질문에 대한 true 값을 갖는 Answer 객체를 포함할 수 있습니다. 여러분은 add() 메서드(18행)를 호출하여 Answer 객체를 Profile에 추가합니다. Question 객체는 질문 내용과 답변이 가능한 범위를 포함합니다(예/아니요 질문의 경우 true 혹은 false 값). Answer 객체는 대응하는 Question 객체를 참조하고 그 대답에 대한 적절한 값을 포함합니다(29행).
Criteria 인스턴스(22행)는 단지 다수의 Criterion 객체를 담는 컨테이너입니다. Criterion 객체(27행에서 처음 참조)는 고용주가 구직자를 찾거나 그 반대를 의미합니다. 그것은 Answer 객체와 그 질문이 얼마나 중요한지 의미하는 Weight 객체를 캡슐화합니다.
matches() 메서드는 Criteria 객체(22행)를 인자로 받아 각 Criterion(27행)에 대해 반복문을 실행하여 해당 기준이 프로파일에 있는 답변과 맞는지 결정합니다(30행). 기준이 절대적(absolute must)이지만 정답과 맞지 않는다면 matches() 메서드는 false를 반환합니다(34행과 42행). 그리고 프로파일에 맞는 기준이 없다면 matches() 메서드는 false를 반환합니다(26행과 40행, 44행). 그 외 모든 경우에는 true를 반환합니다.
또 matches() 메서드는 부작용1을 포함합니다. 어떤 기준이 프로파일의 정답과 일치하면 프로파일에 대한 점수가 기준의 가중치만큼 증가합니다(37행).
지금까지는 논리적으로 보입니다. 하지만 matches() 메서드는 꽤 복잡하고 이것이 우리가 원하는 대로 동작하는지 알고 싶습니다. 이제 그에 대한 테스트 코드를 작성해 봅시다.