우아한테크코스 2단계 사다리 타기 미션에 대한 코치님의 피드백 내용을 정리해 보았다
그러나 현실적으로 어떤 방식을 선택할지에 대한 기준은 매우 애매하다
따라서 흔히 이러한 선택을 한다
Out 부터 In으로 접근해서 In Out으로 구현한다
-> 큰 부분에서 설계하다가 도메인에 대한 지식이 늘어나면 In Out으로 전환한다
Out->In, In->Out 방식은 핑퐁처럼 주고 받으며 사용할 수 있는 방법론이다.
추천 방법
ex)
public class LadderGame {
// 사다리를 어떻게 만들어야 할까
// 라인 안의 포인트
class Name{}
class Line{}
}
public class Line {
private final List<Boolean> line ;
//생성자
}
public class LineTest {
@Test
void 생성테스트()
}
public class Point {
//코드
}
public class Line {
private final List<point> line ;
//생성자
}
public class Point {
publinc int movedirection(int position){
return position
};
}
class PointTest {
@Test
void 1인위치가_아래로_내려가면_위치가_1() {
final var point = new Point();
//포인트가 아래로 내려갈 수 있다
final var position = point.movedirection(1);
assertThat(position).isEqualto(1);
}
@Test
void 2인위치가_아래로_내려가면_위치가_2() {
final var point = new Point();
//포인트가 아래로 내려갈 수 있다
final var position = point.movedirection(2);
assertThat(position).isEqualto(2);
}
//어떻게 오른쪽으로 point가 이동하게 할 수 있을까?
@Test
void 2인위치가_오른쪽으로_내려가면_위치가_3() {
final var point = new Point();
//포인트가 아래로 내려갈 수 있다
final var position = point.movedirection(2);
assertThat(position).isEqualto(3);
}
}
public class Point {
private boolean right;
publinc int movedirection(int position){
if (position.right){
position++
}
};
}
class PointTest {
//어떻게 왼쪽쪽으로 point가 이동하게 할 수 있을까?
@Test
void 2인위치가_왼쪽으로_내려가면_위치가_1() {
final var point = new Point();
//포인트가 아래로 내려갈 수 있다
final var position = point.movedirection(2);
assertThat(position).isEqualto(3);
}
}
public class Point {
private boolean right;
publinc int movedirection(int position){
if (position.right){
return position++
}
if (position.left){
return position--
}
};
}
public class Point {
private boolean right;
private boolean left;
public Point(boolean left, boolean right){
if (둘다 true){
new 예외();
}
}
public int movedirection(int position){
if (position -1 <0){
throw new 예외();
}
if (position.right){
return position++
}
if (position.left){
return position--
}
};
}
public class Position {
private final int value;
Position(int value){
if (value -1 <0){
throw new 예외();
this.value = value;
}
}
}
public class Point {
private boolean right;
private boolean left;
public Point(boolean left, boolean right){
if (둘다 true){
new 예외();
}
//주입
}
public Position movedirection(int position){
if (right){
return new Position(position+1);
}
if (left){
return new Position(position-11);
}
};
}
public enum Direction {
LEFT,
RIGHT,
STRAIGHT
}
public class Point{
private final Direction direction;
public Point(Direction direction){
this.direction = direction
//
}
// ENUM 기반으로 기존 코드 리팩터링
}
-> 큰 개념에서 만들다가 필요성이 느껴지는 순간 하위 개념을 만들 수 있고, 역할도 위임할 수 있다.
-> 그러나 하위 개념을 만들 때 상위 개념을 고려하지 말자, 코드가 어려워지고 결합도까지 높아질 수 있다.
-> 현업에서는 Point를 만드는 개발자와 LadderGame을 만드는 개발자가 다를 수 있다. 따라서, 상위 개념에서 "LadderGame은 이래야 해!" 라고 하는 순간 결합도가 높아지는 것이다.