-
Notifications
You must be signed in to change notification settings - Fork 20
Open
Labels
discussiondiscussion for topicdiscussion for topicdocumentationImprovements or additions to documentationImprovements or additions to documentationquestionFurther information is requestedFurther information is requested
Description
Chapter 2. 옵저버 패턴에서 옵저버들이 데이터를 받아볼 수 있는 방식 두 가지에 대한 설명 중,
‘subject의 상태는 계속 바뀌는 것을 가정하기 때문에 해당 상태에 대한 getter 사용은 notify() 내부에서만 하는 것이 권장되며,
이러한 측면에서 볼 때 pull 방식이 아닌, data를 subject에서 push 하는 방식이 나을 수도 있다’고 작성하신 부분에서
제 의견을 공유하고, 정우님의 의견도 더 자세하게 들어보고 싶어서 이슈를 작성하게 되었습니다 🥰
notify()는 주제의 상태가 변경될 때마다 호출되는 것이므로, 두 방식은 다음과 같은 과정으로 진행한다고 이해했습니다.
만약 주제가 필드로 int status = 1라는 상태를 가지고 있고
notify()가 호출된다면 옵저버는 주제의 status을 곧바로 출력하는 상황을 가정해보면,
[ push 방식 ]
- status = 2로 변경되어 주제에서 notify()가 호출되어 status = 2가 옵저버에게 보내짐 (현재 status의 값은 2)
- 옵저버가 status를 받아보기 전에 status = 3으로 변경되는 경우,
다시 한번 notify()가 호출되어 status = 3가 옵저버에게 보내짐 (현재 status의 값은 3) - 따라서 옵저버는 status = 2를 출력, 그 다음으로 status = 3도 출력
[ pull 방식 ]
- status = 2로 변경되어 주제에서 notify()가 호출됨 (현재 status의 값은 2)
- 옵저버가 status를 받아보기 전에 status = 3으로 변경되는 경우, 다시 한번 notify()가 호출됨 (현재 status의 값은 3)
- 옵저버는 getter를 통해서 주제의 status 값을 받아오기 때문에 status = 3을 두 번 출력
따라서 ‘주제의 상태는 계속 바뀌는 것을 가정하기 때문에’ 주제의 갱신된 값을 올바르게 가져오기 위해서는 push 방식보단 pull 방식이 더 나을 것 같다는 생각을 하였습니다.
여기에 대해서는 어떤 의견을 갖고 계시는지 궁금하며, 이와 비슷한 멀티스레드 환경에서도 똑같을지 궁금합니다!
Metadata
Metadata
Assignees
Labels
discussiondiscussion for topicdiscussion for topicdocumentationImprovements or additions to documentationImprovements or additions to documentationquestionFurther information is requestedFurther information is requested