Conversation
|
|
||
| version = '1.0.0' | ||
| sourceCompatibility = 1.8 | ||
| sourceCompatibility = 11 |
There was a problem hiding this comment.
๋ฏธ์
๋ค์ ์์ํ ๋ ๋ฆฌ๋ทฐ์์ฒญ์ ์ผ๋์ ๋์ง ์๊ณ ์งํํด์ ์๋ฐ ๋ฒ์ ์ ๋ฐ๊ฟจ์๋๋ฐ์!
ํน์ ๋ฒ์ ๋ค์ด์ด ํ์ํ๋ฉด ๋ด๋ฆฌ๊ณ ๋ค์ ์์ฒญ๋๋ฆฌ๊ฒ ์ต๋๋ค!
| import java.util.List; | ||
| import java.util.Random; | ||
|
|
||
| public class LineBuilder { |
There was a problem hiding this comment.
LineBuilder ํด๋์ค์ ์์น์ ๋ํด ๊ณ ๋ฏผ์ด ๋ง์์ต๋๋ค.
๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋๊ฒ ์ข์์ง Line ํด๋์ค ๋ด๋ถ์ ์์ด์ผ ํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ Factory์ ์ญํ ๋ ์ผ๋ถ ์ํํ๋ค๊ณ ๋๊ปด์ ธ์ ๋ณ๋๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
There was a problem hiding this comment.
ํฉํ ๋ฆฌ๋ฅผ ์จ์ ์ป๊ณ ์ ํ๋ ์ด๋์ด ๋ฌด์์ธ๊ฐ์? ๐ค ๐ญ
There was a problem hiding this comment.
์ ๊ฐ ์๊ฐํ๋ ํฉํ ๋ฆฌ์ ์ฅ์ ์ ์๋ ์ ๋์ธ๋ฐ ํด๋น์ฌํญ์ด ์๋๊ฒ ๊ฐ์์์ ๐ค
๊ฐ์ฒด ์์ฑ์ ์กฐ๊ฑด์ด ์์ ๋: ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ, ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
๊ตฌํ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋: ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฌ๋ฌ ๊ตฌํ ํด๋์ค ์ค ํ๋๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ, ์ถํ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ๊ตฌํ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
There was a problem hiding this comment.
ํด๋น ํด๋์ค๋ฅผ ํตํด ๋ ๊ฐ์ง๋ฅผ ํ ๋ฒ์ ๋ฌ์คํ๋ ค๊ณ ํ์์ต๋๋ค ๐
"๋๋ค ํฌ์ธํธ๋ฅผ ๊ฐ๋", "Line์ ์์ฑ"ํ๋ค
์ด๋ฐ ์ํ์์ ๋์ค์ ์ด๋์ด ์ง์ ๊ฐ๋ฅํ Line์ ๋ง๋ค ์๊ตฌ์ฌํญ์ด ์๊ธฐ์ง ์์๊น? ๋ผ๋ ์๊ฐ์ผ๋ก ์ ๋งค๋ชจํธํ ํด๋์ค๊ฐ ํ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ถ๋ถ์ ์ฑ ์์ ๋ถ๋ฆฌ(RandomGenerator, Builder)ํ์ฌ ์๋ก ๊ตฌ์ฑํ์ผ๋ ํ์ธ ๋ถํ๋๋ฆฝ๋๋ค!
There was a problem hiding this comment.
์๋
ํ์ธ์ ์์ค๋.
7๊ธฐ ๋ฆฌ๋ทฐ์ด๋ก ํ๋ํ๋ ์ด์ฌ์์
๋๋ค.
์ค๋๋ง์ ์ฌ๋์ ๋ค์ด์จ๊ฒ ๊ฐ์๋ฐ ๋ ์ฐ์ฐ์น ์๊ฒ ๋ฆฌ๋ทฐ ์์ฒญ์ ๋ฐ๊ฒฌํ์ฌ
์ค์ง๋์ผ ์ ์์ง๋ง ๊ฐ๋จํ ์๊ฒฌ์ ๋๋ ๋ณด์์ต๋๋ค!
์ ๊ฐ ๋ง์ง๋ง๊น์ง ํจ๊ปํ์ง ๋ชปํ๋๋ผ
์์ค๋์ ์ด์ ์ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๊ฐ์ฌํฉ๋๋ค!
| .collect(Collectors.toList()); | ||
| return new Lines(lines); |
There was a problem hiding this comment.
์ ๊ฐ ์๋ฐ๋ฅผ ์์ด์ง ์ค๋๋์ ๊ฐ๋ฌผ ๊ฐ๋ฌผํ์ง๋ง.... ์๋์ ๊ฐ์ด ํ๋ฒ์ ์ฌ์ฉํ ์ ์์ด์.
| .collect(Collectors.toList()); | |
| return new Lines(lines); | |
| .collect(collectingAndThen(toList(), Lines::new) |
| if (name.length() > 5) { | ||
| throw new IllegalArgumentException("์ด๋ฆ์ 5์ ์ดํ์ฌ์ผ ํฉ๋๋ค."); | ||
| } |
There was a problem hiding this comment.
๋งค์ง ๋๋ฒ๊ฐ ์ฌ์ฉ๋์๋ค์.
ํนํ๋ ์ด๋ฆ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์๋์ ์ผ๋ก ๋ณ๊ฒฝ์ด ์ฝ๊ฒ ๋ฐ์ํ ์ ์๋ ์์์ด๋๊น
์์๋ก ๊ด๋ฆฌํ๋ค๋ฉด ์ฅ์ ์ด ์์ ๊ฒ ๊ฐ์์.
"์ด๋ฆ์ " + MAX_NAME_LENGTH +"์ ์ดํ์ฌ์ผ ํฉ๋๋ค."
์ ์ฒ๋ผ ์์ธ์์๋ ์ฌ์ฉํ๋ค๋ฉด ์ฌ์ด๋ ์ดํํธ๋ ์ค์ผ ์ ์๊ฒ ๋ค์!
| throw new IllegalArgumentException("์ ์ด ์์ต๋๋ค."); | ||
| } | ||
|
|
||
| if (points.size() < 2) { |
There was a problem hiding this comment.
์ฌ๊ธฐ๋ ๋งค์ง๋๋ฒ๊ฐ ์ฌ์ฉ๋์์ด์.
๋ค๋ง ํด๋น ๊ฐ์ ์ฌ๋ค๋ฆฌ ๊ฒ์์์๋ ๋ถ๋ณ์ ์ง๋ฆฌ์ ๊ฐ๊น์ด ๊ฐ์ด๋ผ ๊ตฌ์ง ์์๋ก ์ ์ธํด์ผํ ๊น ๊ณ ๋ฏผ์ด ์๋ค์.
์์๋ก ์ ์ธํ์๋ ์คํ๋ ค ๋ค์ด๋ฐ์ ์ ํ์ง ์์์ ๊ฒฝ์ฐ ํ๊ฐ๋ฆด ์ ์์ง ์์๊น ์ถ์ด์์!
์์ค๋ ์๊ฐ์ด ๊ถ๊ธํ๋ค์!
There was a problem hiding this comment.
์ฝ๋ ์ผ๊ด์ฑ๊ณผ ์๋ฌ ๋ฉ์์ง (์ง์ ์ name.legnth()์ ๊ฐ์ ์ด์ ๋ก)์์ ๋์ผํ ๊ฐ์ด ์ฐ์ผ ์ ์๋๋ก ์์๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
ํฌ์ธํธ์ ์๋ ์ฐธ์ฌ์์ ์๋ฅผ ์๋ฏธํ๊ธฐ์, ๊ฒ์์ ์ค์ ์ผ๋ก ๋น ์ง ์ ์๋ ๋ถ๋ถ์ด๋ผ๋ ์๊ฐ๋ ๋๋ค์!
์๋ฅผ ๋ค์ด "์ฐธ์ฌ์๊ฐ ํ๋ช
์ผ ์ ์๋ค" ๋๋ "์ธ ๋ช
์ด์์ด์ด์ผ ๊ฒ์์ด ๊ฐ๋ฅํ๋ค"๋ฑ์ผ๋ก ์ถ๊ฐ ์๊ตฌ์ฌํญ์ด ์๊ธด๋ค๋ฉด ์ฃผ์
๋ฐ๋ ํํ๋ก ๊ตฌ์ฑํด์ผ ํ๋ค๊ณ ๋๊ผ์ต๋๋ค.
์ ์ฉํ์ง ์์ ์ด์ ๋ ๋ฌต์์ ์ผ๋ก ์ฌ๋ค๋ฆฌ์ ์ธ๋ก ๋ผ์ธ์ 2๊ฐ ์ด์์ด๋ผ๋ ์ฝ์์ด ์กด์ฌํ๋ค๊ณ ์๊ฐํ๊ณ . 1๊ฐ ๊ฐ๋ฅ ๋๋ 3๊ฐ ์ด์์ ์ผ๋ฐ์ ์ด์ง ์์ ์ผ์ด์ค๋ผ ํ์ฌ ์ํ(2๊ฐ ์ด์)๋ฅผ ์ ์งํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฐ์ ํ์ต๋๋ค!
| import java.util.List; | ||
| import java.util.Random; | ||
|
|
||
| public class LineBuilder { |
There was a problem hiding this comment.
ํฉํ ๋ฆฌ๋ฅผ ์จ์ ์ป๊ณ ์ ํ๋ ์ด๋์ด ๋ฌด์์ธ๊ฐ์? ๐ค ๐ญ
| public static Line buildWithRandomPoints(int count) { | ||
| return new LineBuilder().initRandomMoveablePoint() | ||
| .addRandomMoveablePoints(count - 2) | ||
| .build(); | ||
| } | ||
|
|
||
| private Line build() { | ||
| points.add(lastPoint().createRightmost()); | ||
| return new Line(points); | ||
| } |
There was a problem hiding this comment.
ํด๋์ค์ ์ด๋ฆ์ด ๋น๋์ธ๋ฐ ๋น๋ํจ์๊ฐ private ํ๊ฒ ์ ์ธ๋๋ฉด ์ฌ์ฉํ ๋ ํ๊ฐ๋ฆฌ์ง ์์๊น์?
๐ค
There was a problem hiding this comment.
์ด์ ๋ฆฌ๋ทฐ์ธ #2120 (comment) ์ ๋๊ธ์ด ์๋ฌ๋ ค ์ด๊ณณ์ ํ๋ฒ์ ๋ต๋ณ๋๋ฆฝ๋๋ค!
ํฉํ ๋ฆฌ ์จ์ ์ป๊ณ ์ ํ๋ ์ด๋
์ต์ด ์์ฑ ์๋๋ ํฉํ ๋ฆฌ๋ฅผ ํตํด ์ํ๋ ํํ๋ก(manual) ์์ฑํ๊ฑฐ๋, ๋๋ค(auto)ํ๊ฒ ์์ฑํ๋ค. ๋ฅผ ๋ชฉํ๋ก ํ์์ต๋๋ค.
ํด๋์ค์ ์ด๋ฆ์ด ๋น๋์ธ๋ฐ build()๊ฐ private์ด ๋ ์ด์
ํ์ฌ๋ ์ํ๋ ํํ๋ก ์์ฑ(manual)์ ๋ํ ์๊ตฌ์ฌํญ์ด ์์ผ๋ ๋ง์์ผ ํ์ง ์์๊น? ๋ผ๋ ์๊ฐ๊ณผ ๋์ค์ ์ง์ ๋ผ์ธ์ ๊ตฌ์ฑํ ์ ์๋ค๋ ์๊ตฌ์ฌํญ์ด ์๊ฒผ์ ๋๋ฅผ ์ํด build()๋ฅผ ๋๊ณ ์ด๋ฅผ public์ผ๋ก ์ด๋ฉด ๋์ง ์์๊น? ๋ผ๋ ์ฌ๋ฌ๊ฐ์ง ์๊ฐ์ด ๊ฒฐํฉ๋์ด ์ ๋งคํ ์ฝ๋๊ฐ ๋์์ต๋๋ค ใ ใ
๊ฒฐ๊ตญ ๋น๋์ ์ ๋๋ ์ดํฐ์ ์ฑ ์์ ๋ถ๋ฆฌํ๊ณ build() ๋ฉ์๋๋ public์ผ๋ก ์ ์ฉํ์ต๋๋ค :)
| private LineBuilder addRandomMoveablePoints(int numberOfMiddlePoints) { | ||
| for (int i = 0; i < numberOfMiddlePoints; i++) { | ||
| Point point = lastPoint().createNext(RANDOM.nextBoolean()); | ||
| points.add(point); | ||
| } | ||
| return this; | ||
| } | ||
|
|
||
| private LineBuilder initRandomMoveablePoint() { | ||
| points.add(Point.createLeftmost(RANDOM.nextBoolean())); | ||
| return this; | ||
| } |
There was a problem hiding this comment.
๋ ๋จ๊ณ๋ฅผ ๋๋ ์ด์ ๊ฐ ๊ถ๊ธํด์!
์๋์๊ฐ์ด ํ๋จ๊ณ๋ก ์ฌ์ฉํ๋๊ฒ์ด ๋ ํธ๋ฆฌํ์ง ์์๊น์? ๐ค
(์ ๊ฐ ์๋ฐ๋ฅผ ์ค๋๋ง์ ์ฐ๊ณ + IDE์ด ํ๊ฒฝ์ด ์๋๋ผ์ ๋ฌธ๋ฒ์ค๋ฅ ์ํด๋ถํ๋๋ฆด๊ฒ์)
private LineBuilder create(int count) {
Point current = Point.createLeftmost(RANDOM.nextBoolean())
potins.add(current)
for (int i = 0; i < count - 2; i++) {
current = current.next()
potins.add(current()
}
}
There was a problem hiding this comment.
์ฒซ ๋ฒ์งธ ํฌ์ธํธ์ ์ถ๊ฐ ๋ฐฉ์์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ๋ํ๋ด๊ณ ์ถ์์ต๋๋ค. ์ด์ ๋๊ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก builder ๋ถ๋ฆฌ๋ฅผ ์งํํ๊ณ ๋ก์ง์ด ํ๋๋ก ํตํฉ๋์์ต๋๋ค!
| import java.util.List; | ||
| import java.util.Random; | ||
|
|
||
| public class LineBuilder { |
There was a problem hiding this comment.
์ ๊ฐ ์๊ฐํ๋ ํฉํ ๋ฆฌ์ ์ฅ์ ์ ์๋ ์ ๋์ธ๋ฐ ํด๋น์ฌํญ์ด ์๋๊ฒ ๊ฐ์์์ ๐ค
๊ฐ์ฒด ์์ฑ์ ์กฐ๊ฑด์ด ์์ ๋: ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ, ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
๊ตฌํ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋: ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฌ๋ฌ ๊ตฌํ ํด๋์ค ์ค ํ๋๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ, ์ถํ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ๊ตฌํ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
| public class Line { | ||
| private final List<Point> points; | ||
|
|
||
| Line(List<Point> points) { |
There was a problem hiding this comment.
ํฉํ ๋ฆฌ๋ก ์ฌ์ฉํ๊ธฐ ์ํด default ๋ก ์ ์ธํ์ ๊ฑธ๊น์? ๐
๊ทธ๋ ๋ค๋ฉด ํจํค์ง ์กฐ์ ์ ์กฐ๊ธ ๋ ์ ํด๋ณผ์ ์์ง ์์๊น์?
There was a problem hiding this comment.
๊ฐ์ฌํฉ๋๋ค
๋ฆฌ๋ทฐ ์ฃผ์ ๋ด์ฉ์ ๊ณ ๋ฏผํด๋ดค๋๋ฐ์!
Line์ ์์ฑ ๋ฐฉ์(๋งจ ์ข์ธก์ ์ข๋ก ์ด๋ ๋ถ๊ฐ, ๋งจ ์ฐ์ธก์ ์ฐ์ธก ์ด๋ ๋ถ๊ฐ)์๋ ๊ฐ์ ๊ฐ ํ์ํ์ฌ ์ง์ ์์ฑ์ด ๋ถ๊ฐ๋ฅ(private ์์ฑ์)ํ๋๋ก ๋ง๋ค๊ณ Builder๋ฅผ Line ๋ด๋ถ๋ก ์ด๋ํ๋ ํํ๋ก ํด๊ฒฐํด ๋ดค์ต๋๋ค.
(LineBuilder๋ฅผ ํตํด์ผ๋ง ๋ผ์ธ ์์ฑ์ด ๊ฐ๋ฅํ๊ฒ ๊ตฌ์ฑ)
| printPlayers(ladderGame.getPlayers()); | ||
| printLines(ladderGame.getLines()); | ||
| } |
There was a problem hiding this comment.
์๊ฑด ์ ๊ฐ ์์
๋ค์์๋...๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋ทฐ์ด๋กํ๋ํ ๋๋ถํฐ ๊ณ ๋ฏผ์ด๊ธดํ๋ฐ
๋ ๋ฆฌ์คํธ์ ์์์ ์์กดํ๋ ๋ฐฉ์์ ๋ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ํ์ธํ๋๊ฒ ์ด๋ ต์ง ์์๊น ์๊ฐ์ด ๋๋๋ฐ
์์ค๋ ์๊ฐ์ด ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
์ ์ด๋ ๊ฒ ์งฐ์๊น ๋์ด์ผ๋ดค๋๋ฐ ๊ธฐ์กด ์ฝ๋๋ API์ ํด๋ผ์ด์ธํธ ๋ชจ๋๋ฅผ ์ ํผ์ ๊ฐ๋ฐํ๋ค๋ณด๋ ์์์ ์ผ๋ก ๋ฐํ ์์์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค์!
๋ช ํํ๊ฒ ๋ ๋ซ๋ค๊ณ ๋๊ปด์ ํฌ์ธํธ์ ํ๋ ์ด์ด๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋๋ก ๊ตฌ์ฑ์ ๋ฐ๊ฟ๋ดค์ต๋๋ค.
๋๊ธ์ ๋ฌ๋ฉด์ ๋ ์๊ฐ์ ํ์ฌ๋ ์์์ ์ผ๋ก(์์ฑ ์์์ ์ํด) ํ๋ ์ด์ด์ ์ธ๋ฑ์ค์ ํฌ์ธํธ(์ธ๋ก ๋ผ์ธ)์ ์ธ๋ฑ์ค๊ฐ ๊ฒฐํฉ๋ ํํ์ด๋ค. ๋ผ๋ ์๊ฐ๋ ๋๋ค์.
|
๋ฆฌ๋ทฐ ๋๋ฌด ๊ฐ์ฌ๋๋ฆฝ๋๋ค ๐ |
์ ๋ง ์ค๋๋ง์ ์ฌ๋ค๋ฆฌ ๊ฒ์์ ์์ฑํด๋ดค์ต๋๋ค.
๋ง์์ ์ง์ ์ฝ๊ฐ์ด๋๋ง ๋์ด๋ธ ๊ฒ ๊ฐ๋ค์ ใ ใ
์ ๋ถํ๋๋ฆฝ๋๋ค ๐