Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEAT: todolist 클래스 구현 #88

Merged
merged 28 commits into from
Nov 28, 2022
Merged

Conversation

n-ryu
Copy link
Collaborator

@n-ryu n-ryu commented Nov 25, 2022

개요

  • Todo 클래스 및 TodoList 클래스를 구현했습니다.

세부 내용

  • Todo 클래스
    • 생성자
      • inputTodo interface를 만들어서 필수로 받아야하는 field를 정의했습니다.
      • 각 field 값이 null | undefined일 경우의 default value를 가지도록 했습니다.
    • 정렬 기능을 위한 compare 함수
      • 정렬의 주체는 TodoList이고 정렬당하는 주체는 Todo이므로 Todo 클래스 내의 static 메서드로 만들었습니다.
    • 상태 변경 메서드
      • TodoList에서 Active Todo의 상태 변경을 하기 위한 메서드를 만들었습니다.
      • 체이닝을 위해 this를 반환합니다.
    • clone 메서드
      • TodoList 에서 컴포넌트에 제공하는 interface들은 새로운 TodoList를 반환하는데 이때 Todo들도 복사해주기 위한 메서드입니다.
    • toComparableTodo 메서드
      • 대단위 테스트 때 Date 객체 비교를 위한 객체 변환 메서드 입니다.
  • TodoList 클래스
    • 프로퍼티는 Todo[]만을 가지고 있고 Active Todo에 변경사항이 있을 경우 이를 deep copy 후 새로운 TodoList 인스턴스를 반환합니다.
    • 생성자
      • 입력을 InputTodo[]를 받아(최소 조건의 field 이상을 가지고 있는 Todo 객체) Todo[]를 저장한다.
    • postponeTemporally, postponeDeadline, postponeForToday, lowerImportance, setDone
      • 메인 페이지에 제공하는 메서드입니다.
      • Active Todo 의 상태를 변경하고 새로운 TodoList의 인스턴스를 반환합니다.
    • getActiveTodo 메서드
      • copy된 RTL을 정렬하고 Active Todo를 반환합니다.
  • 테스트
    • 기존에 테스트를 위해 형변환 관련 타입, 함수들을 Todo, TodoList로 변경했습니다.

공유

클래스를 사용할지 object를 사용할지

  • 클래스
    • 순수하게
      • 투두리스트에서 매번 다시 삽입
      • 장점
        • 네임스페이스를 쓸 수 있다.
      • 단점
        • todoList에서 todo를 array로 관리하면 update 할 때마다 array를 통째로 자르고 넣고 해야하기 때문에 hash Map으로 관리해야한다.
          • array → 탐색 : O(N), 업데이트: O(N), 조회(리스트 전체 조회, Active Todo) : O(1), 정렬 : O(NlogN) - 업데이트 때마다 정렬
          • Hash Map → 탐색: O(1), 업데이트: O(1), 조회: O(nlogn), 정렬: O(NlogN) - 조회시마다 정렬
          • b-tree → 탐색: O(logN), 업데이트: O(logN), 조회: O(1) - active O(logN) - 전체 리스트, 정렬: O(logN) - 조회시마다 정렬
        • hash Map으로 관리하자니 sort가 안되니까 binary tree 라이브러리를 이용해야 할지도
        • DB에서 sort를 어떻게 할지 알 수 없어서 sort에 비용이 컴포넌트단에서 아껴놓는게 의미가 있을까
    • 안 순수하게
      • 장점
        • 아주 조금이라도 자원을 더 아낄 수 있다

        • 순수하게 할 때 투두의 업데이트를 투두리스트에서 고려해야한다

          function update(i, todo) {
          	const target = todoList.find(i);
            const newTodo = {...target, ...todo};
            (삽입하는 코드)
          }
          
          function update(i, todo) {
          	const target = todoList.find(i).update(todo)
          }
          • todo 를 관리하는 함수 + todoList 를 관리하는 함수를 합성
      • 단점
  • object
    • 장점
      • todoList를 순수하게 유지하는 경우 object를 deepcopy해서 쓰기 때문에 업데이트하는데 죄책감이 들지 않는다.
    • 단점
      • todoList로 todo를 관리하게 되므로 가독성과 생산성이 떨어진다.

relevant issue number

@n-ryu n-ryu linked an issue Nov 25, 2022 that may be closed by this pull request
13 tasks
@codecov-commenter
Copy link

codecov-commenter commented Nov 25, 2022

Codecov Report

Base: 93.18% // Head: 69.81% // Decreases project coverage by -23.36% ⚠️

Coverage data is based on head (59983a8) compared to base (8006d20).
Patch coverage: 52.14% of modified lines in pull request are covered.

Additional details and impacted files
@@             Coverage Diff             @@
##             main      #88       +/-   ##
===========================================
- Coverage   93.18%   69.81%   -23.37%     
===========================================
  Files           3        3               
  Lines         132      222       +90     
  Branches       28       39       +11     
===========================================
+ Hits          123      155       +32     
- Misses          9       64       +55     
- Partials        0        3        +3     
Flag Coverage Δ
unittests 69.81% <52.14%> (-23.37%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
client/src/core/todo/todoList.ts 37.38% <37.38%> (ø)
client/src/core/todo/test/generator.ts 100.00% <100.00%> (+1.38%) ⬆️
client/src/core/todo/test/validator.ts 100.00% <100.00%> (+17.77%) ⬆️

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@n-ryu n-ryu closed this Nov 25, 2022
@n-ryu n-ryu reopened this Nov 25, 2022
@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 25, 2022
@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 25, 2022
@daeseong9388 daeseong9388 force-pushed the 83-feat-todolist-클래스-구현 branch from bb7bafb to 845d66f Compare November 25, 2022 02:25
@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 25, 2022
@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 25, 2022
@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 25, 2022
@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 25, 2022
@daeseong9388 daeseong9388 changed the title FEAT: feat todolist 클래스 구현 FEAT: todolist 클래스 구현 Nov 25, 2022
@github-actions
Copy link

🚀 TEST RESULT SUMMARY Tests failed

❌ client/reports/jest-junit.xml

119 tests were completed in 6s with 71 passed, 48 failed and 0 skipped.

Test suite Passed Failed Skipped Time
src/core/todo/test/sort.test.ts 45✅ 5s
src/core/todo/test/update.test.ts 2✅ 48❌ 813ms
src/core/todo/test/validator.test.ts 24✅ 552ms

✅ src/core/todo/test/sort.test.ts

기본 정렬 테스트 › sort/0
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/1
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/2
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/3
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/4
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/5
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/6
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/7
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/8
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
기본 정렬 테스트 › sort/9
  ✅ 다른 조건이 모두 동일하다면, Imminent Todo가 Active된다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선한다.
  ✅ Imminence 정렬이 Importance 정렬보다 우선하며, Importance 정렬이 EDF 정렬보다 우선한다.
정렬 대단위 테스트 › answer: sort/1, problem:0
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/1, problem:1
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/1, problem:2
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/1, problem:3
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/1, problem:4
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/2, problem:0
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/2, problem:1
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/2, problem:2
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/2, problem:3
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/2, problem:4
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/3, problem:0
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/3, problem:1
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/3, problem:2
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/3, problem:3
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.
정렬 대단위 테스트 › answer: sort/3, problem:4
  ✅ Ready Todo List의 기본적인 정렬을 할 수 있다.

❌ src/core/todo/test/update.test.ts

업데이트 테스트 › update/0
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/1
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/2
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/3
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/4
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/5
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/6
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/7
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/8
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 테스트 › update/9
  ❌ RTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
  ❌ WTL 조건 확인
	Error: expect(received).toBe(expected) // Object.is equality
업데이트 대단위 테스트 › answer: update/easy/1, problem:0
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/1, problem:1
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/1, problem:2
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/1, problem:3
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/1, problem:4
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/2, problem:0
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/2, problem:1
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/2, problem:2
  ✅ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
업데이트 대단위 테스트 › answer: update/easy/2, problem:3
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/2, problem:4
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/3, problem:0
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/3, problem:1
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/3, problem:2
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/3, problem:3
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/easy/3, problem:4
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/1, problem:0
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/1, problem:1
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/1, problem:2
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/1, problem:3
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/1, problem:4
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/2, problem:0
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/2, problem:1
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/2, problem:2
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/2, problem:3
  ✅ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
업데이트 대단위 테스트 › answer: update/difficult/2, problem:4
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/3, problem:0
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/3, problem:1
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/3, problem:2
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/3, problem:3
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality
업데이트 대단위 테스트 › answer: update/difficult/3, problem:4
  ❌ Todo List의 선후관계 및 날짜 비교를 통해 Todo들의 상태를 업데이트 할 수 있다.
	Error: expect(received).toEqual(expected) // deep equality

✅ src/core/todo/test/validator.test.ts

검증 알고리즘 테스트 › Imminence 정렬
  ✅ sort/1
  ✅ sort/2
  ✅ sort/3
검증 알고리즘 테스트 › Importance 정렬
  ✅ sort/1
  ✅ sort/2
  ✅ sort/3
검증 알고리즘 테스트 › Deadline 정렬
  ✅ sort/1
  ✅ sort/2
  ✅ sort/3
검증 알고리즘 테스트 › Last Postponed 정렬 
  ✅ sort/1
  ✅ sort/2
  ✅ sort/3
업데이트 검증 알고리즘 테스트 › RTL 조건 확인
  ✅ update/easy/1
  ✅ update/easy/2
  ✅ update/easy/3
  ✅ update/difficult/1
  ✅ update/difficult/2
  ✅ update/difficult/3
업데이트 검증 알고리즘 테스트 › WTL 조건 확인
  ✅ update/easy/1
  ✅ update/easy/2
  ✅ update/easy/3
  ✅ update/difficult/1
  ✅ update/difficult/2
  ✅ update/difficult/3

@boostcampwm-2022 boostcampwm-2022 deleted a comment from github-actions bot Nov 28, 2022
@daeseong9388 daeseong9388 merged commit df4a3e9 into main Nov 28, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

feat: TodoList 클래스 구현
3 participants