# 서울숲_D_Day08 리뷰레포트
### 참석자
- 김준표, 유현희, 이영훈, 최성찬
## 1. 코드 동작 이해
### 옵저버 패턴 구현 설명
```javascript
//옵저버 클래스
class Observable {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
deleteObserver(observer) {
const index = this.observers.indexOf(observer);
this.observers.splice(index, 1);
}
notifyToObservers(state) {
this.observers.forEach(observer => {
observer.update(state);
});
}
}
module.exports = Observable;
```
```javascript
//TodoModel에서 Observable 상속
TodoModel.prototype = Object.create(Observable.prototype);
//prototpye 연결로 인해 변경된 constructor를 자신의 constructor로 연결
TodoModel.prototype.constructor = TodoModel;
```
```javascript
//data fetch가 발생할때마다 Observer 구독자에게 알림을 보내줌
TodoModel.prototype.fetch = function() {
this.notifyToObservers(this.todoList);
return this.todoList;
};
```
## 2. 코드 동작 개선
- id를 받을 때 id를 string type으로 받는데 todolist의 id는 숫자로 되어있어서 에러가 발생
```javascript
function isString(param) {
return typeof param === "string";
}
```
- JSON.stringfy => number object array string boolean으로 구분한뒤 전체를 String으로 반환 [Document](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
```javascript
console.log(JSON.stringify({ x: 5, y: 6 }));
// expected output: "{"x":5,"y":6}"
console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)]));
// expected output: "[3,"false",false]"
console.log(JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] }));
// expected output: "{"x":[10,null,null,null]}"
console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
// expected output: ""2006-01-02T15:04:05.000Z""
```
## 3. 스스로 확인할 사항
- 주어진 요구사항을 꼼꼼하게 체크하고, OOP와 모듈단위로 나눈방식의 개발방법의 장점이 무엇인지 고민한다.
- 객체지향 프로그래밍은 프로그램을 변경을 용이하게 해준다.
- 모듈단위로 나누어 개발을 할 경우 유닛테스트에 용이하다.
- 프로그램을 이해하기가 쉬워져 유지보수가 용이하다.
- 더 개선할 부분은 없는지, 더 좋은 방식의 패턴이 없을지 고민해본다.
- TodoModel이 notify할 때, 현재 데이터만 넘겨준다. (콘솔에 출력되는 내용 X, todolist 데이터 O)
- MVC패턴을 사용한다.
### MVC 패턴
- **Model**: data를 조작하는 메서드를 갖는 모듈
- **Controller**: Model의 메서드를 이용해 사용자의 요청에 맞는 data를 추출하여 View에 전달
- **View**: Controller에게 받은 data를 이용하여 적절한 UI를 사용자에게 전달
### Singleton 패턴
- 클래스의 인스턴스를 오직 하나만 유지
- JavaScript에서는 Object Literal이 싱글톤에 해당됨(즉, 유일한 객체가 생성됨)
> 예시) let obj = { }
### Observer 패턴
- 관찰자(여러명 가능)와 발행자 사이의 데이터를 동기화하는 패턴
- 각 모듈의 의존성을 관리하기 위해서 사용되기도 함
- **특징**
> 1. 모든 관찰자는 발행자가 누구인지 알고 있다. 동시에 발행자도 모든 관찰자를 기억한다.
> 2. 발행자는 새로운 데이터를 발행하고, 관찰자에게 변경에 대해 공지한다.
> 3. 공지를 받은 관찰자는 발행자에게 변경된 데이터를 받아온다.
## 4. 다같이 확인할 사항
#### 1. undo/redo 기능을 제공하고 싶다. 특정 사람의 코드를 골라서, 이 기능을 추가하기 위한 전략을 세워보자.
- 명령어가 수행될 때마다 immutable한 방식으로 데이터를 수정한다.
#### 2. html파일생성이 아닌 markdown포맷을 생성하는 view클래스를 만든다고 가정한다. Obsever패턴을 어떻게 적용할 수 있을까? Observer패턴의 장점은 무엇일까?
- **옵저버 패턴 장점**: Model의 데이터가 변경될때마다, Subscriber(구독자)가 특별한 행동없이 변경된 데이터를 확인할 수 있다.