[우아한테크코스] 3월 24일 TIL
1 minute read
오늘 배운 것
- js 기본 개념(우테코 홈페이지 & 생활코딩)
- 체스 리팩토링(내 리뷰 & 파피 리뷰 & 엘레강트)
- 글쓰기 수정
체스 리팩토링
- 내 리뷰
- Optional에 null을 반환한다면 의미가 있을까?
메서드가 반환할 결과값이 없음
을 명백하게 표현할 필요가 있는 곳에서 제한적으로 사용할 수 있는 메커니즘을 제공하는 것이 Optional이 생겨나게된 이유이다.
null을 반환하면 에러가 발생할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이다. 따라서 변수의 값은 null이 되면 안되고 항상 인스턴스를 가리켜야 한다.
Optional.orElse() 는 안에 코드가 무조건 실행되므로 orElseGet()이 낫다.
Optional은 비싸니까 단지 값만 얻으면 된다면 Optional 대신 null을 비교해서 얻도록 하자.
필드, 생성자, 메서드 인자에 Optional이 오면 안된다.
- board의 초기화 위치
애초에 Map을 초기화 해서 생성할 때 넘겨주는 것이 테스트하기에도 이해하기에도 더 좋은 방법이다.
chessGame 자체에서 Map 만들어서 Board를 생성하도록 하였다.
- Piece가 Point를 가진 것
Point는 Piece도 가지고 Board도 가진다.
Board에서 매핑할 때만 있어도 되지 않을까?
잘 된다. 오히려 더 각 기물들이 깔끔하고 객체지향적인 구현인 것 같다..!
- isPawn()과 같은 메서드에 대해서
대부분의 기물이 false일 때 그냥 false로 부모 클래스에 메서드를 만들어두고 해당하는 곳에서만 override하는 방식도 존재한다.
- final의 선언
부모클래스의 메서드는 자식이 오버라이딩이 가능하다.
이를 막고 싶으면 메서드에 final을 선언하면 된다.
더 이상 상속이 불가능한 클래스에도 final을 선언하면 상속을 막을 수 있다.
- 상수.equals(“~~”)
NPE 방지!!!
- 캐싱된 points 관리
point를 데려올 때 매번 같은 row, column인 것을 가져오려다보니 과하다는 지적을 받았다.
index를 계산하는 메서드를 만들어 순서가 보장된 list에 매핑된 point를 가져오도록 하였다.
- row, column 객체 분리의 문제
row, column의 객체를 분리하는 것은 같은 일만 하고 있으므로 의미가 없을 것 같다.
PositionValue 객체를 만들어 두 일을 하도록 하였다.
- stream의 사용
stream을 과하게 사용하면 가독성이 떨어진다.
map() 안에서 getter을 사용하지 않도록 하고, filter()에는 하나의 조건을 넣도록 하자.
최대한 적은 filter를 사용하도록 하자.
- 파피 리뷰
- negative logic 피하기
bishop isNotMovableDirection 수정
Piece에 point 제거
board moveStepByStep direction source와 target 비교해서 찾기, point만 받도록 생각해보기
- filter 한번만 사용
기대값이 앞에, 실제값이 뒤에
상속을 하지 않는 클래스에 final 선언을 통해 불필요한 상속 제거
override한 메서드에 어노테이션 붙이기
isPawn false로 함수 만들고 필요한 곳에만 true로 오버라이딩