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

코드리뷰용 리팩토링 코드 #249

Open
wants to merge 47 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
df7ab75
Test:Import Github with androidStudio
park-yina Oct 19, 2023
1241267
correction:README.md 체크 박스 수정
park-yina Oct 19, 2023
d839942
correction:README.md 체크 박스 수정
park-yina Oct 19, 2023
7c10aba
correction:README.md 체크 박스 수정
park-yina Oct 19, 2023
df9a389
Update README.md
park-yina Oct 19, 2023
acf97f6
Plus:구현해야 할 함수 사항 추가
park-yina Oct 19, 2023
b6087dc
Correction:줄바꿈 수정
park-yina Oct 19, 2023
a2630ab
PlUS:잘못된 사항 입력시 에러 발생
park-yina Oct 19, 2023
7f76c1e
Plus:유저의 번호 입력받기
park-yina Oct 19, 2023
18e1d4e
error:낫띵이 0볼 0스트라이크로 처리되는 에러 발생
park-yina Oct 21, 2023
e85a40c
Test:코드의 원활한 작동 확인
park-yina Oct 21, 2023
a7847cb
plus:README.md
park-yina Oct 21, 2023
5e52767
plus:3스트라이크 출력 추가
park-yina Oct 21, 2023
a8cd87d
Update README.md
park-yina Oct 21, 2023
3f3f37c
Update README.md
park-yina Oct 21, 2023
c5c4fe5
리팩토링:이너 클래스로 기능별 분리하기
park-yina Oct 21, 2023
f93d451
Docs:Update README.md
park-yina Oct 22, 2023
0702f53
Docs:README.md
park-yina Oct 22, 2023
2879ea3
DOCS:README.md
park-yina Oct 22, 2023
1cb533e
리팩토링:가독성 높이기 위해 함수 1개 삭제
park-yina Oct 22, 2023
c5c0ee8
test:0이 입력될 경우+문자열의 길이가 맞지 않는 경우 테스트 케이스 추가
park-yina Oct 22, 2023
13dd31e
DOCS:README.md
park-yina Oct 22, 2023
e3eba09
리팩토링:seekAnswer을 출력과 계산 부분으로 나누어줌
park-yina Oct 23, 2023
f9c531b
단순수정: import 수정
park-yina Oct 23, 2023
051ef4b
단순수정: rebase과정에서 실수로 지운 부분 추가
park-yina Oct 23, 2023
3b8b4a2
Update ApplicationTest.kt
park-yina Oct 24, 2023
c1e6fbc
Update Application.kt
park-yina Oct 24, 2023
a2f2804
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
eb5063e
Update Application.kt
park-yina Oct 24, 2023
9ea76cb
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
e89ac61
Update Application.kt
park-yina Oct 24, 2023
bec0c80
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
ae8c8ee
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
6332769
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
0dffb0d
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
0bab0a8
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
b3565ef
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
8b42e17
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
4aee9c7
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
f502d1c
에러 원인 파악: 예기치 못한 오류로 테스트 종료
park-yina Oct 24, 2023
f2e8970
테스트케이스 성공
park-yina Oct 25, 2023
105cd14
0입력시 에러 발생 추가
park-yina Oct 25, 2023
d09e374
사용하지 않는 import삭제
park-yina Oct 25, 2023
fd681f2
refactory:새로운 패키지 모델 작성
park-yina Nov 2, 2023
84d025e
refactory:패키지 내의 함수 완성 및 main구현중
park-yina Nov 2, 2023
e8d6b41
리팩토링:Enum과 companion object로 관리
park-yina Nov 15, 2023
6b3a18e
리팩토링:에러 메시지를 ENUM으로 관리
park-yina Nov 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions local.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Oct 19 15:14:11 KST 2023
sdk.dir=C\:\\Users\\User\\AppData\\Local\\Android\\Sdk
79 changes: 79 additions & 0 deletions src/main/kotlin/Docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# ✏️ 구현시 필요할 부분 정리

- [X] 잘못된 값 입력시 어플리케이션 종료 시키기
- [X] 시작문구 등 출력사항 정리

# ✏️ 구현시 사용 할 함수 기본 계획

- [x] 잘못된 값 입력시 어플리케이션 종료 시키기
<br>
◼through나 try키워드 사용해서 예외를 판단하고 처리하기?
<br>
◼평소처럼 if를 사용해서 입력에 대한 부분을 테스트 하는 것과는 어떤 차이가 날까

<br>

- [x] 입출력 관리
컴퓨터 입력을 받기 위한 함수:반환값 Int로 해서 다른 함수 추가 시에도(ex.게이머 함수) 쉽게 꺼낼 수 있게 하는 것이 좋을듯
<br>
직접 코드를 작성해보니 어떤 자료형인가 보다 컴퓨터 입력과 사용자 입력의 자료형을 동일하게 해주는 것이 쉬운 비교에 도움이 됐다. 처음에는 한쪽은 String 한쪽은 Int로 했더니 항상 toString을 사용해야해서 번거로웠다.
<br>
게이머 함수의 경우 배열을 사용해서 각각 인덱스에 따른 비교도 가능하게끔(단순히 일치/불일치가 아니라 위치도 중요)해야

- [x] 게임관련
낫띵은 컴퓨터와 유저 두개 다 돌고 하나도 겹치는 게 없을 때만 나오면 됨
<br>
볼/스트라이크 여부는 같은 인덱스에 있는지도 확인을 해야->이터레이터가 있는 맵같은 것을 사용하는 게 더 좋을까?
<br>
이터레이터없이 인덱스가 끝까지 도달했나 아닌가로 판별하는 방식으로 체크.

# ✏️ 수정사항 정리
- [ ] 오류 관련
<br>
사이즈가 3이 아닐 때 오류 출력->1또는 2입력 시 문제가 생길 수도
문제 해결: 1 또는 2가 단독으로 입력 시 에러 검사하는 함수를 호출하지 않고 게임의 종료인지 시작인지를 체크한 뒤 각자에게 맞는 함수를 실행
<br>
- indices와 length()의 차이
<code>
for (index in inputNumber.indices) {
userNumber.add(inputNumber[index])
}
</code>
이 부분을 length로 처음 썼을 때는 잘 작동하지 않음
<br>
원인:전체 문자열의 길이가 아닌 각 문자열의 길이를 알아야하기 때문
<br>
length:전체 문자열 길이를 반환/indices:각자 문자열의 길이 반환
<br>
- 🌟테스트 케이스를 잘 읽자
<br>
Console.readLine()을 사용해야하는데 일반 readLine()을 사용하여 초반에 계속 에러가 떴음
<br>
-왜 자꾸 체크박스가 적용되지 않나 했더니 br을 사용한 줄바꿈 직후 체크박스를 사용한 것이 원인이었음.

- [ ] 가독성 관련
<br>
볼/스트라이크 판단 여부
<br>
맨 처음 짠 코드는 스택의 peek()를 활용하여 값이 같은지 아닌지 판단하는 방식이었음->코드가 지나치게 길어지고 간결화가 힘듦. 또한 pop을 써서 매번 컴퓨터와 비교하는 과정이 번거로웠음
<br>
-> 두번째로는 인덱스가 끝까지 도달했는가로 판단했는데 이경우에도 현재의 코드보다는 if를 한번 더 써야했음.
<br> gpt의 지적으로 for문과 indices를 사용하여 index까지 모두 일치하면 strike아니면 ball인 것으로 수정
<code>
for (index in userNumber.indices) {
if (userNumber[index] == newComputerNumber[index]) {
strikeCount++
} else if (newComputerNumber.contains(userNumber[index])) {
ballCount++
}
}
</code>


# ✏️ 새로 배운 사항 및 리팩토링 시 고려해볼 사안

-코틀린의 readline은 string()으로 받는 형태인듯-> 처음 사용하는 list도 string으로 통일해주는 것이 가독성이 좋을까
<br>
-앞으로는 깃 커밋 메시지 컨벤션도 잘 지키자->다른 사람들과 소통 시 '나'의 방식대로만 작성하면 소통에 문제 생길 수도
[git 커밋 메시지 컨벤션](https://velog.io/@dkdlel102/Git-%EC%BB%A4%EB%B0%8B-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%BB%A8%EB%B2%A4%EC%85%98)

7 changes: 7 additions & 0 deletions src/main/kotlin/baseball/Answer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package baseball

enum class Answer(val message:String) {
NOTHING("낫싱"),
ANSWER("%d볼 %d스트라이크"),
THREE_STRIKE("3스트라이크"),
}
6 changes: 4 additions & 2 deletions src/main/kotlin/baseball/Application.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package baseball

import baseballView.Input

fun main() {
TODO("프로그램 구현")
}
BaseballController().playing()
}
44 changes: 44 additions & 0 deletions src/main/kotlin/baseball/BaseballController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package baseball

import baseballView.Input
import baseballViewModel.Computer

class BaseballController {
companion object {
var WANT_PLAYING = true
var COMPUTER = ""
var SCORE = Pair(0, 0)
}

private fun printlnMent() {
println(Input.PlayMent.PLAY_START_MENT)
}

fun seekAnswer(user: String): Pair<Int, Int> {
var score = Pair(0, 0)
for (index in user.indices) {
if (COMPUTER[index] == user[index]) {
score = Pair(score.first + 1, score.second)
} else if (COMPUTER.contains(user[index])) {
score = Pair(score.first, score.second + 1)
}
}
return score
}
fun playing() {
printlnMent()
while (WANT_PLAYING) {
COMPUTER = Computer().createComputer()
var user: String
while (true) {
user = Input().readInputNumber()
SCORE = seekAnswer(user)
Input().printlnScore(SCORE)
if (COMPUTER == user)
break
}
WANT_PLAYING = Input().resetGame()
}
}
}

58 changes: 58 additions & 0 deletions src/main/kotlin/baseballView/Input.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package baseballView

import baseball.Answer
import baseballViewModel.ErrorMessage
import baseballViewModel.ValidInput
import camp.nextstep.edu.missionutils.Console

class Input {
object PlayMent {
const val PLAY_START_MENT = "숫자 야구 게임을 시작합니다."
const val PLEASE_INPUT = "숫자를 입력해주세요: "
const val END_GAME="3개의 숫자를 모두 맞히셨습니다! 게임 종료"
const val RESET_GAME="게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."
}
object NumberLimit{
const val ZERO=0
const val THREE_STRIKE=3
}
private var userNumber = mutableListOf<Char>()
private val validInput = ValidInput()

fun readInputNumber(): String {
println(PlayMent.PLEASE_INPUT)
val inputNumber = Console.readLine()
validInput.validUserNumber(inputNumber, userNumber)
return userNumber.joinToString("")
}

fun printlnScore(score: Pair<Int, Int>) {
if (score.first == NumberLimit.ZERO && score.second == NumberLimit.ZERO) {
println(Answer.NOTHING.message)
} else if (score.first == NumberLimit.THREE_STRIKE) {
println(Answer.THREE_STRIKE.message)
endGame()
} else {
println(Answer.ANSWER.message.format(score.second, score.first))
}
}

private fun endGame() {
println(PlayMent.END_GAME)
println(PlayMent.RESET_GAME)
}

fun resetGame(): Boolean {
val inputNumber = Console.readLine().toInt()
if (inputNumber == 1) {
return true
}
if(inputNumber==2)
return false
if (inputNumber!=1||inputNumber!=2) {
throw IllegalArgumentException(ErrorMessage.ONE_OR_TWO.message)
return false
}
return false
}
}
15 changes: 15 additions & 0 deletions src/main/kotlin/baseballViewModel/Computer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package baseballViewModel

import baseballViewModel.ValidInput.Companion.size_limit
import camp.nextstep.edu.missionutils.Randoms

class Computer{
fun createComputer():String {
val uniqueNumbers = mutableSetOf<Int>()
while (uniqueNumbers.size < size_limit) {
val randomNumber = Randoms.pickNumberInRange(1, 9)
uniqueNumbers.add(randomNumber)
}
return uniqueNumbers.joinToString("")
}
}
11 changes: 11 additions & 0 deletions src/main/kotlin/baseballViewModel/ErrorMessage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package baseballViewModel

enum class ErrorMessage(val message:String){
INPUT_SIZE_ERROR("[Error]숫자는 3개 모두 입력하셔야합니다."),
MISS_RANGE("[Error]숫자는 1부터 9까지로 구성되어있습니다."),
DUPLICATE_NUMBER("[Error]중복된 숫자가 존재합니다."),
ONLY_NUMBERS("[Error]숫자만 입력 가능합니다."),
ONE_OR_TWO("[Error]1 또는 2를 입력하세요."),


}
35 changes: 35 additions & 0 deletions src/main/kotlin/baseballViewModel/ValidInput.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package baseballViewModel


class ValidInput {
companion object{
val size_limit=3
}
private fun sizeCheck(inputNumber: String) {
if (inputNumber.length != size_limit)
throw IllegalArgumentException(ErrorMessage.INPUT_SIZE_ERROR.message)
}

private fun containZero(inputNumber: String) {
if (inputNumber.contains("0"))
throw IllegalArgumentException(ErrorMessage.MISS_RANGE.message)
}

private fun duplicateNumber(inputNumber: String) {
if (inputNumber.toSet().size != inputNumber.length)
throw IllegalArgumentException(ErrorMessage.DUPLICATE_NUMBER.message)
}

private fun notInt(inputNumber: String) {
if (inputNumber.toIntOrNull() == null)
throw IllegalArgumentException(ErrorMessage.ONLY_NUMBERS.message)
}

fun validUserNumber(inputNumber: String, userNumber: MutableList<Char>) {
sizeCheck(inputNumber)
containZero(inputNumber)
duplicateNumber(inputNumber)
notInt(inputNumber)
userNumber.addAll(inputNumber.toList())
}
}
3 changes: 2 additions & 1 deletion src/test/kotlin/baseball/ApplicationTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeT
import camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest
import camp.nextstep.edu.missionutils.test.NsTest
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows

Expand All @@ -26,7 +28,6 @@ class ApplicationTest : NsTest() {
assertThrows<IllegalArgumentException> { runException("1234") }
}
}

override fun runMain() {
main()
}
Expand Down