-
Notifications
You must be signed in to change notification settings - Fork 2
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
중복없는 dice 구현 #34
중복없는 dice 구현 #34
Conversation
@@ -4,6 +4,7 @@ class DiceBot(val random: Random) { | |||
require(random != null, "the 'random' value cannot be null.") | |||
|
|||
private lazy val regex = """(?i)\s*roll\s+(\d+)d(\d+)\s*""".r | |||
private lazy val regex_for_non_dup = """(?i)\s*roll\s+(\d+)n(\d+)\s*""".r |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
필드 naming convention이 어떻게 되나요? scala에서는 snake notation 이 일반적인가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아 스칼라에서는 camelCase를 쓰죠? 수정해야겠습니다 :)
제목 [WIP] 머릿말은 제거하셔도 되지 않을까요? |
@@ -22,6 +23,8 @@ class DiceBot(val random: Random) { | |||
"the 'input' value cannot be null.") | |||
case regex(count, max) => | |||
Some(makeOrderString(count.toInt, max.toInt)) | |||
case regex_for_non_dup(count, max) => |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 이슈을 내가 구현 한다면 아래 두 가지 방법 중 어떤 것을 택할까에 대해서 고민을 많이 했습니다.
- @masunghoon 님이 작성하신 것과 같이
case
문을 추가하는 방법 NonDuplicatedDiceBot
과 같은 새로운 클래스를 만드는 방법
두 가지 방법은 아래와 같은 장단점이 있어서 선택이 쉽지가 않네요.
- 장점: 구현이 쉽다, 단점: OCP를 위배함으로 코드가 수정되면 복잡도가 증가
- 장점: OCP 를 유지, 단점: 코드조각이 많아져 전체를 한눈에 보기 어렵다
말로하니 이해가 안되네요 -_-;;; 제 생각을 담은 [WIP] PR 작성해보겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OCP가 무슨 Principle이었죠? ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
라고 쓰고 보니 Open-Closed Principle이군요 ㅎㅎ 자문자답
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Open-Closed Principle 입니다. 이걸 여기에서 고민하는게 오버인가 라는 생각도 드네요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제 생각을 잘 대변하는 글이 있어 링크 남깁니다. 읽으시라고 강요하는 거 아니닌깐 부담가지지 마세요. 기록의 목적입니다. :)
http://joelabrahamsson.com/a-simple-example-of-the-openclosed-principle/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어차피 학습 목적의 프로젝트이므로 저같이 잘 모르는 사람에게는 이렇게 던져주시는 이슈가 도움이 많이 됩니다. 도움이 된다면 쉬운 길 돌아가는것도 문제 안 된다고 생각해요~
현재 의견을 교환하기 위한 글을 쓰거나 찾아보도록 하겠습니다. :) |
@masunghoon 저도 @myeesan님 말씀에 동의합니다. 제가 괜히 일을 복잡게 만든 것 같습니다. 현재 의도하시는 방향으로 구현하시는 것이 좋다는 생각입니다. |
# Conflicts: # src/main/scala/com/github/funprog/funbot/DiceBot.scala (resolved)
몇 가지 테스트케이스 추가 후 WIP 떼도록 하겠습니다~ |
- 실제 동작을 확인해보는 테스트가 변경된 코드에 맞지 않아서 삭제 - 가능한 모든 출력을 미리 열거한 후 process 함수의 리턴과 일치하는 값이 해당 결과에 있는지 확인하는 케이스 추가
("roLL 2D3", List("1, 1", "1, 2", "1, 3", "2, 1", "2, 2", "2, 3", "3, 1", "3, 2", "3, 3")), | ||
("roll 2n2", List("1, 2", "2, 1")), | ||
("RoLl 1n2", List("1", "2")), | ||
("roLL 2N3", List("1, 2", "1, 3", "2, 1", "2, 3", "3, 1", "3, 2")) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
roll 2nd
에 대한 대소문자 구분 없는 테스트는 위에서 진행되었습니다. 제 생각에는 불필요해 보입니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
의도는 대소문자 구분 테스트가 아니었고, 삭제한 테스트에 대한 대체 테스트를 만들어 보려 했습니다. (위 테스 트를 C&P해서 만들다보니... ;;) 각 테스트에 대한 description을 좀 더 명확히 적어보겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@masunghoon 그렇군요.
테스트를 보니, 랜덤한 결과값에 대한 결과값 후보들을 모두 나열하고, process
결과 값이 후보군에 들어 있는지 확인 하는 방식으로 테스트 하는 것 같습니다.
위 테스트에서는 result
라는 변수명이 적절하지 않아보입니다. cadidates
같은 단어를 선택하시거나, Random의 seed 값을 지정해서 테스트 하는 것은 어떨까요?
질문 및 의견 몇 가지 남겼습니다. @masunghoon 님 의견을 듣기 위해 -1 로 표시해두었습니다. |
} | ||
} | ||
|
||
def parseInput(input: String): (Boolean, Int, String, String) = input match { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
접근자를 지정하지 않으면 public으로 동작하지 않나요? private
멤버로 표시하는 것은 어떨까요? 아래 메소드들에 대해서도 이 의견을 동일하게 적용할 수 있다고 생각합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네, process 제외한 메소드는 모두 private 으로 지정하는게 낫겠네요. 동의합니다.
@masunghoon 위 제 의견을 다시 읽어 보니 좀 강한 어조가 느껴지는군요. 불필요한 인삿말 (eg. thanks) 군더더기를 제거하고 제 생각을 담백한게 적은 것 뿐입니다. 모든 문장 끝에 ^^에 있다고 보시면 됩니다 ㅎ |
저는 작동에 결함이 없는 만큼 merge 하는게 좋다고 생각됩니다.
|
case _ => (1 to 6).toList.map(_.toString) | ||
} | ||
|
||
@annotation.tailrec |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
Great work! @masunghoon Hope you sleep well tonight. I am oooooofff! |
@jwChung 어조는 전혀 문제되지 않습니다! 저기 사이사이에 ^^있으면 더 이상할 듯... ㅎㅎ |
저도 같은 생각입니다. 그러나 위에서 제가 드린 의견이 반영되든 아니든 종결된 뒤에 -1 이모지를 제거하겠습니다.
네 다른 이슈를 통해서 처리되는 것도 방법이겠습니다. 다만 이런 사항에 대해 동의가 있어야 되고 가능하다면 이슈까지 만들어 놓고 병합되는 것이 바람직하다고 생각합니다. |
- `2e4b7f6` Remove unnecessary guard clauses
#6 중복없는 dice구현을 위한 작업입니다.
눈팅만 하다 영원히 참여 못할 것 같아,
WIP
라벨 시작도 끊어 볼 겸 일단 한 줄이라도 작성 해봤습니다. (이렇게 하면 되나요;;)추가 구현되는대로 커밋 예정입니다.