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

웹 백엔드 유틸리티 라이브러리를 인수한다. - 8월 30일 #89

Closed
woowahan-pjs opened this issue Aug 9, 2021 · 8 comments
Assignees

Comments

@woowahan-pjs
Copy link
Contributor

woowahan-pjs commented Aug 9, 2021

관련 이슈: #87 #88

@woowahan-pjs
Copy link
Contributor Author

woowahan-pjs commented Sep 3, 2021

Scanners 내부에 Scanner#next() 대신 Scanner#nextLine()을 사용했는지 궁금합니다. Scanners.nextLine()을 사용하니 터지네요.
https://github.com/woowahan-pjs/java-vendingmachine/blob/a5a94e62d4ee1ff0a98a3b5e51db341c507b4e6a/src/main/java/vendingmachine/view/Console.java#L17-L21

@Joyykim
Copy link

Joyykim commented Sep 3, 2021

Scanner#nextLine()의 문제점 파악했습니다.

관련 지식

nextLine(), next() 차이점

  1. Scanner#nextLine()은 버퍼에서 다음 개행문자까지의 모든 문자열을 가져옵니다. 개행문자는 남지않습니다.
  2. 반면 Scanner#next(), Scanner#nextInt()는 공백(개행문자 포함) 전까지의 문자열,정수만 가져옵니다. 공백이나 개행문자는 버퍼에 남습니다.

문제 상황

# Input
100
콜라
  1. Scanners#nextInt() 사용시 100이 반환됩니다. 버퍼에는 아직 개행문자 하나가 남아있습니다.
  2. Scanners#nextLine() 사용시 버퍼에 남아있는 개행문자 전까지의 문자열을 가져오는데 이때 "콜라"가 아닌 빈 문자열이("") 반환됩니다.

해결 방안

현재는 nextLine(), nextInt()만 제공하고 있는데 next()까지 추가로 제공하려합니다.

@woowahan-pjs
Copy link
Contributor Author

@Joyykim
해킹하고자 하는 내용에 따라 3가지 메서드를 제공하는 것이 좋은지, 1가지 메서드만 제공하는 것이 좋은지 고민해 보셨으면 합니다.
System#setIn(InputStream)를 해킹하면 전자가 더 편리하고, Scanners를 해킹하면 후자가 더 편리할 거예요.

@woowahan-pjs
Copy link
Contributor Author

woowahan-pjs commented Sep 4, 2021

Randoms의 메서드 이름을 구체적으로 지정하는 것이 더 나을 수 있겠다는 생각이 들어요. 이건 프론트엔드와 함께 이야기해 보죠.
#55 (comment)

@2SOOY
Copy link

2SOOY commented Sep 6, 2021

@woowahan-pjs

메서드 명과 관련하여 프론트 측에 변경 사항이 있어서 코멘트 남기겠습니당 :)
js는 언어 차원에서 오버로딩을 지원하지 않아 pick관련 메서드 명을 변경하였습니다.

Random 클래스의 메서드 지원 목록은 다음과 같습니다 !

  1. Random.pickOneInRange(start, end)

    • start <= n <= end를 만족하는 1개n을 반환
    • 예시
      Random.pickOneInRange(1, 10); // 1
      Random.pickOneInRange(1, 10); // 10
      Random.pickOneInRange(1, 10); // 4
      Random.pickOneInRange(1, 10); // 5
  2. Random.pickOneInArray(array)

    • 입력된 배열의 요소 중 무작위로 1개요소를 반환
    • 예시
      Random.pickOneInArray([1, 3, 10]); // 1
      Random.pickOneInArray([1, 3, 10]); // 10
      Random.pickOneInArray([1, 3, 10]); // 3
  3. Random.pickSeveralInRange(start, end, count)

    • start <= n <= end를 만족하는 중복되지 않는 count개의 n을 배열 형태로 반환
    • 예시
      Random.pickSeveralInRange(1, 10, 2); // [1, 2]
      Random.pickSeveralInRange(1, 10, 5); // [1, 10, 7, 8, 5]
  4. Random.shuffle(array)

    • 입력된 배열 요소의 순서를 무작위로 섞은 후 반환
    • 예시
      Random.shuffle([1, 2, 3, 4, 5]); // [2, 4, 1, 3, 5]

@unluckyjung
Copy link

unluckyjung commented Sep 6, 2021

클래스 변경사항

Randoms 유지
- Random은 클래스 이름이 겹치는 문제가 발생하므로 기각

Scanners -> Console로 변경
- nextLine을 readLine 으로 수정하면서 생길 Scanner와의 혼란을 방지하고자 클래스명 변경

메소드 변경사항

// Randoms.class

// 전 
pick(final int startInclusive, final int endInclusive) 
// 후
pickNumberInRange(final int startInclusive, final int endInclusive) 


---

// 전
pick(final List<Integer> numbers) 
// 후
pickNumberInList(final List<Integer> numbers) 


---

// 전
notDuplicatedPicks(final int startInclusive, final int endInclusive, final int count)
// 후
pickUniqueNumbersInRange (final int startInclusive, final int endInclusive, final int count)

// Console.class (기존 Scanners.class)

// 전
String nextLine()
// 후
String readLine()

nextInt(), next() 제거
- readLine()으로부터 파싱해서 사용하도록 유도.

@Joyykim
Copy link

Joyykim commented Sep 9, 2021

백엔드 라이브러리 - wooteco-utils 피드백 반영했습니다!

@Joyykim
Copy link

Joyykim commented Sep 10, 2021

블랙잭 미션에 도입 시 고려할 이슈들

딜러가 무작위로 카드를 draw하는 기능을 라이브러리로 제공할 때 shuffle()만으로 충분할거라 생각했으나 문제점이 발견되었습니다.
채점 코드를 작성하기 위해선 딜러가 뽑을 카드의 순서를 채점코드에서 모킹해야합니다.

문제점

  • RandomspickNumberInRange(), pickNumberInList()로도 구현이 가능하기 때문에 Mocking을 위해선 사용할 메서드를 강제할 필요가 있음.
  • 만약 shuffle()을 사용하도록 강제한다고 했을 때 무작위로 생성된 덱에서 앞/뒤(첫번째 원소/마지막 원소) 중 어디로 카드를 뽑을지 알 수 없기 때문에 모킹이 힘들다.
    • 앞뒤 중 어디로 뽑을지도 강제하는건 좋지 않다고 생각한다. (조이 의견)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants