[우아한테크코스] 3월 24일 TIL

1 minute read

오늘 배운 것

  1. js 기본 개념(우테코 홈페이지 & 생활코딩)
  2. 체스 리팩토링(내 리뷰 & 파피 리뷰 & 엘레강트)
  3. 글쓰기 수정

체스 리팩토링

  1. 내 리뷰
    • 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를 사용하도록 하자.
  2. 파피 리뷰
    • negative logic 피하기
    • bishop isNotMovableDirection 수정
    • Piece에 point 제거
    • board moveStepByStep direction source와 target 비교해서 찾기, point만 받도록 생각해보기
    • filter 한번만 사용
    • 기대값이 앞에, 실제값이 뒤에
    • 상속을 하지 않는 클래스에 final 선언을 통해 불필요한 상속 제거
    • override한 메서드에 어노테이션 붙이기
    • isPawn false로 함수 만들고 필요한 곳에만 true로 오버라이딩