안녕하세요. Brad입니다. 오늘은 좌표계산기 step5를 진행하였습니다. 진행을 하면서 고민했던 부분, 그것을 해결하기 위한 노력. 그리고 피드백 받은 부분에 대해 정리하였습니다.
고민했던 부분
사용자가 입력한 점 중에서 같은 위치의 점(
Point
)를 어떻게, 어디에서 체크할까?- equals(), hashCode() 미리 정의해두고
Set<Point>
을 이용하여 들어오는Point
개수와Set
안에 있는Point
개수 비교하여 다르면 오류 발생!
- equals(), hashCode() 미리 정의해두고
오류 메시지는 Domain에 있는 것이 좋을까? View에 있는 것이 좋을까?
- 로직과 관련되어 있기 때문에 Domain에 있는게 적합할 것 같기도 하고, 메시지만 전달한다는 점에서 View에 있어야할 것 같기도 하고.. 근데 Domain에 있는게 적합할 것 같긴한데요.
- 기존에 위와 같이 생각한 이유는
throw new IllegalArgumentException()
하기 전에 오류 메시지를 따로 출력해야한다고 생각했기 때문입니다. 하지만 코드스쿼드 멤버 NNN으로부터 Exception 괄호() 안에 오류 메시지를 직접 입력하고 상위 catch문에서getMessage()
를 통해 직접 입력한 오류 메시지를 출력할 수 있다는 것을 알게되었습니다. 이렇게 오류 메시지를 전달하는게 제일 깔끔할 것 같습니다. - 오류 처리와 관련해서는 '로또' 과제에서 또 다시 배운다고 하는데 지금 단계에서 바로 적용못해 아쉽네요.
implements
를 받은 클래스에서 접근제한자를 어떤 것을 쓰는게 좋을까?- 인터페이스 클래스는 외부에 접근되는 것이기 때문에 접근제한자
public
이 default로 설정됩니다. 그렇기 때문에 이 인터페이스 클래스를 받는 쪽에서도public
으로 사용되게 강제됩니다.
- 인터페이스 클래스는 외부에 접근되는 것이기 때문에 접근제한자
테스트코드에서 예외발생 상황은 어떻게 테스트할 수 있을까?
- @Test 어노테이션 옆에
(expected = 예외클래스.class)
를 적어줌으로써 테스트 할 수 있습니다. - 아래는 오늘 작성했던 테스트코드 중 하나입니다.
@Test(expected = IllegalArgumentException.class) public void isValid() { List<Point> points; points = Arrays.asList(new Point(10, 10), new Point(10, 10), new Point(14, 15)); TextParser.isValid(points); }
- @Test 어노테이션 옆에
피드백
Point p1 = new Point(5, 7);
Point p2 = new Point(12, 14);
Point p3 = new Point(11, 3);
Point p4 = new Point(6, 4);
points.add(p1);
points.add(p2);
points.add(p3);
points.add(p4);
Arrays.asList()를 사용하면 이런 코드를 좀 더 깔끔하게 구현할 수 있다.
Arrays.asList()를 사용하면 다음 한줄로 줄일수 있습니다.
points = Arrays.asList(new Point(5, 7), new Point(12, 14), new Point(11, 3), new Point(6, 4));
또는 이렇게도 넣을 수 있습니다.
Point[] p = {new Point(5, 7), new Point(12, 14), new Point(11, 3), new Point(6, 4)};
points = Arrays.asList(p);
기본적으로 Arrays.asList
는 Oracle Docs에서 아래와 같이 정의를 하고 있습니다.
Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between array-based and collection-based APIs, in combination with
Collection.toArray()
. The returned list is serializable and implementsRandomAccess
.
여기에서 fixed-size로 반환되기 때문에 size()
나 get()
을 사용할 수는 있으나 새로운 값을 넣으려면 오류가 발생합니다. 따라서 이 경우 새로운 객체를 생성하면 됩니다. 위의 경우 아래와 같이 나타낼 수 있습니다.
Point[] p = {new Point(5, 7), new Point(12, 14), new Point(11, 3), new Point(6, 4)};
points = new ArrayList<>(Arrays.asList(p));
points.add(new Point(12,12));
오늘 추가적으로 공부한 부분
'TIL' 카테고리의 다른 글
Today's Dev Notes(2018-10-18) (0) | 2018.10.19 |
---|---|
Today's Dev Notes(2018-10-16) (0) | 2018.10.16 |
Today's Dev Notes(2018-10-12) (0) | 2018.10.12 |
Today's Dev Notes(2018-10-10) (0) | 2018.10.10 |
Today's Dev Notes(2018-10-08) (0) | 2018.10.09 |