경험해야할 학습 목표
- 자바8의 스트림, 람다를 사용해 함수형 프로그래밍하는 경험
- In -> Out, Out -> In 방식으로 도메인 객체를 설계하는 경험
- 책임주도설계 기반으로 인터페이스 활용해 프로그래밍하는 연습
경험할 객체지향 생활 체조 원칙
- 규칙 4: 한 줄에 점을 하나만 찍는다.
- Clean Code 가이드의 디미터 법칙을 지키는 것을 의미한다.
- 규칙 6: 모든 엔티티를 작게 유지한다.
- 규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- 규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.
미션3, 사다리타기 후기다.
이번 사다리타기는 예상보다 빨리 진행되었다
step1, 자바8 스트림, 람다, Optional
자바8 에서 제공하기 시작한 막강한 기능들을 사용하는 학습형 단계다.
제공되는 레거시 기반 예제에서 스트림, 람다, Optional 으로 리팩토링한다.
스트림, 람다를 사용한지 한달이 되었다.
스트림과 람다 방식이 익숙해지고 예전 코딩 스타일은 이제 어색해졌다.
Optional 은 스트림,람다 보다 사용하기 시작했지만
백기선님의 자바8 에서 학습하여 금방 익숙해지고 있다.
step2, 사다리(생성)
본격적인 사다리 미션에 돌입했다.
사다리의 프로그래밍 요구사항이다
- 자바 8의 스트림과 람다를 적용해 프로그래밍한다.
- 규칙 6: 모든 엔티티를 작게 유지한다
사다리를 임시로 그려보았다.
|-----| |-----|
| |-----| |
|-----| | |
사다리를 분석해보니 다음과 같은 요소가 파악되었다.
1. 연속적으로 라인을 연결할 수가 없다.
2. 라인을 띄엄띄엄 반드시 그릴 필요가 없다. 라인이 없을 수도 있다.
연속적으로 라인을 그릴 수 없다.
사다리를 그릴 때 이전 라인을 다음 라인에 보내야한다는 뜻으로
이걸 어떻게 해야할까? 온갖 생각을 했다가 결국엔 재귀함수로 구현했다.
그리고 받은 피드백...
추가적인 피드백을 드려보면 재귀로 코드를 구현하는 것은 한번 고민해보실 필요가 있는 부분입니다.
왜냐하면 해당 코드는 현철님 뿐만 아니라 동료가 유지보수해야할 상황이 올 수 있는데
재귀로 코드를 구현한다면 동작 과정을 쉽게 이해하지 못할수도 있다고 생각이 됩니다 :)
재귀함수는 너무 먼 방식이였고😂
재귀함수 대신 외부변수 하나를 사용하는 스트림으로 간단하게 대체가 되었다🙈
step3, 사다리(게임 실행)
이제 사다리 결과를 입력하고 사다리 실행을 하는 과정이다.
이번 단계에서 중복되는 상수들이 많아 각체마다 관리할지, 중복되는 상수를 상수클래스로 놓을지 고민하기도 하고
생성자에 인자를 보낼 때 인스턴스필드보다 많이 보내도 될지 고민도 해보고
다양한 고민을 하게 해준 단계였고, 정답이 안 나와 리뷰어에게 질문을 던지면서 제출을 하게된다.
개선할 사항이 여럿 존재했는데 여기서 언급할 건
Stream.forEach 와 Collection.forEach 를 구분해야한다면서 링크와 함께 장문 코멘트를 달아주셨다.👍👍👍
step4, 사다리 (리팩토링)
이번 단계는 이전 단계에서 피드백 받은걸 리팩토링 하는 간단한 단계이며,
토비님이 제공해주는 코드를 기반으로 리팩토링하는 선택지도 존재한다.
나는 내 코드를 리팩토링하는걸 선택했다. (토비님이 제공해주는 코드는 완주 후 진행하는걸로~👏)
이전 피드백으로 받은 것중 가장 예상치도 못한게 하나 있다.
바로 실행 결과를 저장할 때 Map<String, String> 형식으로 key 는 이름을 넣고, value 는 결과를 넣었는데
Map<Person, Winning> 형식으로 key, value 에 객체를 넣어달라는 것!
value 에 객체를 넣는 방식은 많이 해봐서 익숙하지만
key 에 객체를 넣는건 상상도 못했다! ㄴㅇㄱ!!!
진행하면서 key 에 객체를 넣으면 어떻게 비교를 해야할까 고민도 하고 했지만
해당 객체의 유니크한 값으로 비교하는 형식으로 진행하고 제출을 하면서 key 에 객체를 넣을 경우 어떻게 비교하냐 질문도 남겼다.
그리고 받은 답변 중 일부분
도메인이 key - value를 String - String으로 관리하는 데이터 위주의 구조를 객체로 관리함으로써,
객체가 자료구조나 함수의 집합이 아닌 자신만의 생명주기, 행위, 습관을 지닌 독립적인 개체로 다룰 수 있는 이점이 있습니다.
또한 Map<String, String>은 어떤 데이터를 관리하는지, 그리고 왜 관리하려 하는지 한 눈에 알 수 없지만
Map<Person, Winning>으로 다룬다면 플레이어에 따른 게임 결과값이 매핑되었다는 것을
한눈에 알아볼 수 있는 이점이 있고 해당 자료구조를 관리하고 있는 클래스 네이밍에 맞게 책임도 쉽게 파악할 수 있다고 생각합니다.
👍👍👍👍👍👍
후기
이전에 많은 고난이 있었는지 이번 미션은 하루에 한번씩 4일만에 통과가 되었다👏👏👏👏
금방 통과되어서 솔직히 어정쩡하기도 하다.
빨리 통과된 만큼 설계가 좋았다고 생각하자.
이번 사다리를 진행하면서
외부 변수를 이용하여 스트림을 다양하게 활용할 수 있는걸 알게되었고,
Map<key, value> 를 사용하는 것도 객체지향적으로 접근하는 방법도 배웠다.
그 외에도 여러가지를 배웠다.
이제는 마지막 미션 볼링이 남았다.
가장 난이도가 높다는데 한번 부딪혀보러 가야겠다.
'교육 및 인강 > TDD, Clean Code with Java' 카테고리의 다른 글
TDD, Clean Code with Java - 미션4, 볼링(🎳) 후기 (0) | 2021.04.10 |
---|---|
TDD, Clean Code with Java - 미션2, 로또 후기 (0) | 2021.03.29 |
TDD, Clean Code with Java - 미션1, 자동차 경주 후기 (0) | 2021.03.18 |
TDD, Clean Code with Java 시작하며.. (2) | 2021.03.18 |