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

중복없는 dice 구현 #34

Merged
merged 11 commits into from
Jul 20, 2016
Merged

중복없는 dice 구현 #34

merged 11 commits into from
Jul 20, 2016

Conversation

curry-ing
Copy link
Contributor

@curry-ing curry-ing commented Jul 12, 2016

#6 중복없는 dice구현을 위한 작업입니다.

눈팅만 하다 영원히 참여 못할 것 같아,
WIP라벨 시작도 끊어 볼 겸 일단 한 줄이라도 작성 해봤습니다. (이렇게 하면 되나요;;)

추가 구현되는대로 커밋 예정입니다.

@curry-ing curry-ing added the WIP label Jul 12, 2016
@@ -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
Copy link
Member

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 이 일반적인가요?

Copy link
Contributor Author

@curry-ing curry-ing Jul 12, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 스칼라에서는 camelCase를 쓰죠? 수정해야겠습니다 :)

@jwChung
Copy link
Member

jwChung commented Jul 12, 2016

제목 [WIP] 머릿말은 제거하셔도 되지 않을까요?

@curry-ing curry-ing changed the title [WIP] 중복없는 dice 구현 중복없는 dice 구현 Jul 12, 2016
@@ -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) =>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 이슈을 내가 구현 한다면 아래 두 가지 방법 중 어떤 것을 택할까에 대해서 고민을 많이 했습니다.

  1. @masunghoon 님이 작성하신 것과 같이 case 문을 추가하는 방법
  2. NonDuplicatedDiceBot 과 같은 새로운 클래스를 만드는 방법

두 가지 방법은 아래와 같은 장단점이 있어서 선택이 쉽지가 않네요.

  1. 장점: 구현이 쉽다, 단점: OCP를 위배함으로 코드가 수정되면 복잡도가 증가
  2. 장점: OCP 를 유지, 단점: 코드조각이 많아져 전체를 한눈에 보기 어렵다

말로하니 이해가 안되네요 -_-;;; 제 생각을 담은 [WIP] PR 작성해보겠습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OCP가 무슨 Principle이었죠? ㅎㅎ

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

라고 쓰고 보니 Open-Closed Principle이군요 ㅎㅎ 자문자답

Copy link
Member

@jwChung jwChung Jul 12, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open-Closed Principle 입니다. 이걸 여기에서 고민하는게 오버인가 라는 생각도 드네요.

Copy link
Member

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/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어차피 학습 목적의 프로젝트이므로 저같이 잘 모르는 사람에게는 이렇게 던져주시는 이슈가 도움이 많이 됩니다. 도움이 된다면 쉬운 길 돌아가는것도 문제 안 된다고 생각해요~

@myeesan
Copy link
Contributor

myeesan commented Jul 14, 2016

현재 nd 이상의 커맨드가 확정 되지 않은 상태이고, n의 필요성은 명확한 상태입니다. 두 요구사항을 구현 한 상태에서 코드를 이해하기는 case문을 활용하는 것이 맞다고 생각됩니다.

의견을 교환하기 위한 글을 쓰거나 찾아보도록 하겠습니다. :)

@jwChung
Copy link
Member

jwChung commented Jul 14, 2016

@masunghoon 저도 @myeesan님 말씀에 동의합니다. 제가 괜히 일을 복잡게 만든 것 같습니다. 현재 의도하시는 방향으로 구현하시는 것이 좋다는 생각입니다.

# Conflicts:
#	src/main/scala/com/github/funprog/funbot/DiceBot.scala (resolved)
@curry-ing
Copy link
Contributor Author

몇 가지 테스트케이스 추가 후 WIP 떼도록 하겠습니다~

 - 실제 동작을 확인해보는 테스트가 변경된 코드에 맞지 않아서 삭제
 - 가능한 모든 출력을 미리 열거한 후 process 함수의 리턴과 일치하는 값이 해당 결과에 있는지 확인하는 케이스 추가
@curry-ing curry-ing removed the WIP label Jul 17, 2016
("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"))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

roll 2nd 에 대한 대소문자 구분 없는 테스트는 위에서 진행되었습니다. 제 생각에는 불필요해 보입니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의도는 대소문자 구분 테스트가 아니었고, 삭제한 테스트에 대한 대체 테스트를 만들어 보려 했습니다. (위 테스 트를 C&P해서 만들다보니... ;;) 각 테스트에 대한 description을 좀 더 명확히 적어보겠습니다.

Copy link
Contributor

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 값을 지정해서 테스트 하는 것은 어떨까요?

@jwChung
Copy link
Member

jwChung commented Jul 17, 2016

질문 및 의견 몇 가지 남겼습니다. @masunghoon 님 의견을 듣기 위해 -1 로 표시해두었습니다.

}
}

def parseInput(input: String): (Boolean, Int, String, String) = input match {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

접근자를 지정하지 않으면 public으로 동작하지 않나요? private 멤버로 표시하는 것은 어떨까요? 아래 메소드들에 대해서도 이 의견을 동일하게 적용할 수 있다고 생각합니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네, process 제외한 메소드는 모두 private 으로 지정하는게 낫겠네요. 동의합니다.

@jwChung
Copy link
Member

jwChung commented Jul 17, 2016

@masunghoon 위 제 의견을 다시 읽어 보니 좀 강한 어조가 느껴지는군요. 불필요한 인삿말 (eg. thanks) 군더더기를 제거하고 제 생각을 담백한게 적은 것 뿐입니다. 모든 문장 끝에 ^^에 있다고 보시면 됩니다 ㅎ

@myeesan
Copy link
Contributor

myeesan commented Jul 17, 2016

저는 작동에 결함이 없는 만큼 merge 하는게 좋다고 생각됩니다.

  1. 현재 이 브랜치에 의존성을 가진 이슈들이 몇 개 있습니다.
  2. @jwChung 님께서 제기해 주신 의문은 충분히 가치 있다고 생각합니다. 그래서, 현재 쓰레드에서 계속 진행 되는 것 보다, merge 후에 새로운 이슈를 생성해서 논의를 이어나간 다면 좀 더 집중 할 수 있지 않을까 합니다.

case _ => (1 to 6).toList.map(_.toString)
}

@annotation.tailrec
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@hkjlee109
Copy link
Member

Great work! @masunghoon Hope you sleep well tonight. I am oooooofff!

@curry-ing
Copy link
Contributor Author

@jwChung 어조는 전혀 문제되지 않습니다! 저기 사이사이에 ^^있으면 더 이상할 듯... ㅎㅎ

@curry-ing curry-ing closed this Jul 17, 2016
@curry-ing curry-ing reopened this Jul 17, 2016
@jwChung
Copy link
Member

jwChung commented Jul 19, 2016

@myeesan

저는 작동에 결함이 없는 만큼 merge 하는게 좋다고 생각됩니다.

저도 같은 생각입니다. 그러나 위에서 제가 드린 의견이 반영되든 아니든 종결된 뒤에 -1 이모지를 제거하겠습니다.

  1. 현재 이 브랜치에 의존성을 가진 이슈들이 몇 개 있습니다.
  2. @jwChung 님께서 제기해 주신 의문은 충분히 가치 있다고 생각합니다. 그래서, 현재 쓰레드에서 계속 진행 되는 것 보다, merge 후에 새로운 이슈를 생성해서 논의를 이어나간 다면 좀 더 집중 할 수 있지 않을까 합니다.

네 다른 이슈를 통해서 처리되는 것도 방법이겠습니다. 다만 이런 사항에 대해 동의가 있어야 되고 가능하다면 이슈까지 만들어 놓고 병합되는 것이 바람직하다고 생각합니다.

@jwChung jwChung merged commit 522527a into master Jul 20, 2016
@jwChung jwChung deleted the non_dup_dice branch July 20, 2016 12:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants