2주차 미션이 끝이났다!😀
미션이 끝나고 어김없이 돌아온 회.고.타.임!😤
이번 미션은 자동차 경주이다.
미션을 시작하기전 1주차 공통 피드백을 정말 꼼꼼히 읽었다.
정말 다양한 피드백이 있었다.
피드백 내용들이 하나하나 나를 저격하는 듯한 내용이어서 정말 많이 뜨끔했다..😫
그 중 이번 주차 미션을 하면서 항상 상기시켜야겠다고 느낀 항목들!
• 축약하지 않는다 : 의도를 드러낼 수 있으면 이름이 길어져도 괜찮다.
• 이름을 통하여 의도를 드러낸다.
• 커밋 메세지를 의미있게 작성한다.
• 의미 없는 주석을 달지 않는다.
물론 이외에도 정말 많은 피드백 사항들이 있었다.
들어가기 앞서 1주차 회고록도 보고 오세용~~~
[우아한테크코스 6기] 프리코스 1주차 회고
우아한테크코스 프리코스가 10/19일 목요일부터 시작되었다. 이번 미션은 숫자 야구게임이었다.⚾️ 숫자 야구 게임은 고등학교 시절 수업시간에 옆 친구랑 정말 많이 했기에 룰 자체는 금방 이
anjji.tistory.com
그 전에! 2주차 재구현에 대한 회고도 읽고오세요!!😀
[재구현] 2주차 - 숫자야구 (근데 MVC를 곁들인)
우아한테크코스 프리코스가 3주차가 시작되었다. 시작하기전 2주차 미션을 한번더 리빌딩하여 코드리뷰된 사항과 내가 분석한 코드리뷰에서 배울점들을 적용시켜 재구현 해보았다. https://github.
anjji.tistory.com
기능 목록 작성하기
피드백 메일에 포함된 강의 영상이 있었다.
그 중 기능 목록을 최대한 따라하려고 노력했다.
기능 목록을 작성하고 클래스명#함수명 작성을 따라했다.
물론 처음부터 한 것은 아니었고 마지막 기능 구현이 전부 다 끝나고 작성했다.
나는 모든 기능을 구현하고 리팩토링을 하였더니 함수가 정말 많이 이동했다.
그 중 getWinner()
라는 함수가 있었는데 이 함수는 Application.kt
에서 RacingGame.class
로 이동했다가 Cars
클래스로 이동하였다.
초기 설계의 탄탄함의 중요성의 위대함을 배웠따…!
다음 주차엔 이번 주차보다 더 나은 설계를 하겠다고 다짐 또 다짐했다.🤨
이번 주차에서 추가된 기능 요구사항
이번 주차에서는 위와 같은 추가된 요구 사항이 존재했다.
저번 주차에서 정말 내가봐도 함수의 길이가 장난 아니게 길었으며 메인 로직에서는 들여쓰기 수준이 3이었기에 이번 주차에서는 정말 최대한 함수를 쪼개기로 마음 먹었다.
함수가 한 가지 일만 하도록 최대한 작게 만들어라 라는 말이 클린코드와도 연관이 있다고 생각하여 우선 클린코드 책을 보며 학습하였다.
Clean Code
anjji.tistory.com
한가지 예를 들어보면
저번 주차에서 메인 로직이다.
private fun gameStart() {
var computerNumber = computer.setComputerNumber()
var isGameEnd = false
while (!isGameEnd) {
val userNumber = user.inputUserNumber()
val hint = computer.countStrikeAndBall(computerNumber, userNumber)
isGameEnd = computer.checkGameEnd(hint.first)
printHint(hint)
if (isGameEnd) {
printGameEndMessage()
val restartGame = user.decideGame()
if (restartGame) {
isGameEnd = false
computerNumber = computer.setComputerNumber()
}
}
}
}
정말 많은 들여쓰기와 많은 기능들이 하나의 gameStart()
라는 함수에 존재한다.
내가 봐도 가독성이 정말 좋지 않았다.
이번에는 이점을 최대한 고치기 위하여 최대한 나누었다.
private fun gameStart() {
println("실행결과")
repeat(gameCount) {
runOneCycle()
}
}
private fun runOneCycle() {
cars.list.forEach { car ->
val isMovable = checkMovable(getRandomNumber())
car.moveOneStep(isMovable)
printCarDistance(car)
}
println()
}
이게 맞는 방법인지는 모르겠지만 그래도 저번 주차보단 가독성이 좋아진 것 같아 만족스럽다!
이번 주차에서 아쉬웠던 점
1. 이번 주차 시작 전 무조건 MVC를 적용하자 마음먹었다.
하지만 끝내 적용하지 못하였다.
함수 분리하기도 벅찼으며 클래스 분리조차 제대로 못하는데 지금 다른 사람들이 사용한다는
이유만으로 무작정 사용하는게 맞을까 싶었기에 적용하지 못하였다.
2. 테스트 케이스 작성을 제대로 하지 못한점.
이번 주차에서는 기능 목록을 테스트케이스를 작성하여 확인하라는 요구사항이 있었다.
하지만 테스트케이스를 작성해 본적이 없기에 감조차 잡히지 않았다.
모든 함수를 테스트하지 못하였기에 많은 아쉬움이 있었다.
내가 테스트하고 싶은 함수가 있었음에도 private 함수였기에 못한 부분도 있었다.
그리고 기능 구현을 하면서 어느 순간에는 테스트를 위한 인자생성 및 리턴값 설정을 하게 되었다.
후에 전부 뜯어고치긴 하였지만 아직 많이 부족했기에 더 공부해야겠다…
그런 의미에서 TDD가 정말 중요한가보다…
또한 테스트 케이스를 작성함에 있어서 하나의 ApplicationTest.kt
에 모든 테스트를 작성한 부분이 아쉬웠다.
테스트 코드 또한 리팩토링 하고 싶었지만 시간이 부족해서 할 수가 없었다.
다음 주차에서는 개선해야겠다.
또 클래스 분리에서 아쉬운점이 많았다.
class CarManager {
fun separateCarNames(carNames: String): List<String> = carNames.split(",")
fun makeCarModelList(carNames: List<String>): List<Car> {
var modelList = mutableListOf<Car>()
carNames.forEach {
modelList.add(Car(it))
}
return modelList.toList()
}
}
내가 작성한 CarManager.class
이다.
사실 클래스 이름과 다르게 무엇을 하는 클래스인지 바로 와닿지않는다.
이 부분은 실제로 고치려고 노력도 해봤는데 쉽지가 않았다.
이 클래스를 만든 이유는 RacingGame.class
에 너무 많은 함수가 있었기에 별도의 클래스로 분리하고 싶었다.
하지만 도저히 방법이 생각나지 않아 최종적으로는 이렇게 구현할 수 밖에 없었다.
그렇기에 더욱 더 디자인 패턴이란 것이 존재하는 것이 아닐까 싶었다.
다음 주차는 정말 정말 최대한 MVC 패턴을 적용해 봐야겠다!
이번 주차를 마치며 느낀점
이번 주차를 하면서 정말 많은 블로거님들의 게시글을 보며 공부도하고, 클린코드 책도 구매하여 공부하였다
.
검증 부분을 관리하기 위하여 Validator
라는 클래스도 생성하여 관리도 하였고 불변값 관리를 위한 Constants
클래스 생성도 고민하였다.
어느 순간 코드의 가독성과 클린코드 원칙을 생각하며 코딩하는 내 모습을 보니 정말 성장중인가보다.
단지 굴러가는 애플리케이션을 만들기 위한 지난 내 노력과 상반되게 이제는 정말 기본을 충실히기 위해 노력하고 있고 내 뼈대부터 고치고 있는 것 같다.
정말 많이 성장 중인 것을 느끼고 있기에 정말 뿌듯한 시간인것같다.
2주차 미션 주소!
https://github.com/woowacourse-precourse/kotlin-racingcar-6/pull/26
[자동차 경주] 임형준 미션 제출합니다. by lh99j · Pull Request #26 · woowacourse-precourse/kotlin-racingcar-6
github.com
참고한 블로그
🧪 TDD 방법론 (테스트 주도 개발) - 알기 쉽게 정리
TDD(Test Driven Development) 란? TDD란 Test Driven Development의 약자로 '테스트 주도 개발'이라고 한다. 반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는
inpa.tistory.com
💠 객체 지향 설계의 5가지 원칙 - S.O.L.I.D
객체 지향 설계의 5원칙 S.O.L.I.D 모든 코드에서 LSP를 지키기에는 어려움. 리스코프 치환 원칙에 따르면 자식 클래스의 인스턴스가 부모 클래스의 인스턴스를 대신하더라도 의도에 맞게 작동되어
inpa.tistory.com
https://dev-coco.tistory.com/182
클린 코드(Clean Code) 요약 및 정리
개발 하며 내가 작성하고 있는 코드가 과연 좋은 코드인가 문득 고민하게 되었고, 좋은 코드란 무엇인가에 대한 궁금증으로 '클린 코드' 서적을 접하게 되어 읽으면서 중요한 내용들을 정리하고
dev-coco.tistory.com
Test - Junit이란?
Junit 이란 Junit 이란?Junit이란 Java의 단위 테스팅(Unit Testing) 도구이다. 단 하나의 jar 파일로 되어 있다. Testing 결과를 단순히 문서로 남기는 것이 아니라 Test Class를 그대로 남김으로써 추 후 개발자
galid1.tistory.com
JUnit이란? JUnit5 (Assertion, 어노테이션)
JUnit은 JAVA 프로그래밍 언어용 유닛 테스트 프레임워크이다. JUnit은 테스트 주도 개발을 위한 유닛 테스트 프레임워크이다. 테스트 결과를 텍스트로 남기는 것이 아니라 Test Class로 남기므로, 개
dev-jj.tistory.com
다음 주차도 화이팅!😝
'회고 > 우아한테크코스 프리코스' 카테고리의 다른 글
[우아한테크코스 6기] 프리코스 4주차 회고 (0) | 2023.11.15 |
---|---|
[우아한테크코스 6기] 프리코스 3주차 회고 (0) | 2023.11.08 |
[우아한테크코스 6기] 프리코스 1주차 회고 (0) | 2023.10.25 |
우아한테크코스 API 분석 (1) | 2023.10.22 |
우아한테크코스 6기 지원! (1) | 2023.10.16 |