210218_B책_조건문 NullPointer 피하기

정재현·2021년 2월 18일
0

TIL

목록 보기
70/80

오늘도 계속해서 B책이다.
일반적으로 자바 초보자가 처음 접하는 예외가 NullPointer 예외라고 한다.
나도 업무시에 NullPointer를 자주 접한다.

먼저 예제 코드를 보자면,
간단하게 특정 코드만..

void writeMessage(String message, Path location) throws IOException {
  if (Files.isDirectory(location)) {
      throw new IllegalArgumentException("The path is invalid")
  }

  if (message.trim().equals("") || message == null) {
      throw new IllegalArgumentException("The message is invalid")
  }

}

자, 우선 내 기준에 내가 몰랐던 메서드는
isDirectory() => 이건 해당 경로에 폴더가 있는지 없는지를 반환한다.

이 코드에는 2가지 잘못된 점이 있다.
1. 매개변수 검증순서
2. null 순서

첫번째부터 보자면,
매개변수의 순서는 message, location 이지만 밑에 조건문의 순서는 바뀌어있다.
순서가 뭐 그리 중요한가 싶지만서도 적절한 순서로 수행함으로써 읽기 흐름이 크게 향상된다. (배려배려)
이러한 행동은 좋은 관례이고, 어떤 매개변수 하나를 빠뜨릴 위험도 적어진다.

두번째는 조건의 null 순서이다.
인수를 검증할 때는 순서가 중요한데
1. 반드시 null을 먼저 확인한 후
2. 도메인에 따라 "유효하지 않은" 값을 검사해야 한다.

그런데 여기서 또 하나의 특이점은 메서드 인수로 null을 전달하는 방식은 메서드가 매개변수 없이도
올바르게 기능한다는 뜻이니 피해야 한다고 한다.
꼭! 해야한다면 매개변수가 있는 메서드와 없는 메서드 두 개로 리팩토링 하는게 맞다고..
==> 오.. 나는 매개변수가 null을 가져도 올바르게 진행하는 메서드는 좋다고 생각했다. 왜냐면 null일 때와 null이 아닐 때를 둘다 커버 가능하다고 생각했으니깐..

위의 2가지 잘못된 점을 고쳐보면~

void writeMessage(String message, Path location) throws IOException {
 
  if (message == null || message.trim().isEmpty()) {
      throw new IllegalArgumentException("The message is invalid")
  }

  if (location == null || Files.isDirectory(location)) {
        throw new IllegalArgumentException("The path is invalid")
    }

}

이렇게 고칠 수 있다.
지은이의 경험에 비추어 본다면 매개변수 검사는 public, protected, default 메서드에서만 하면 된다고 한다.
이러한 메서드는 어디에서든 접근할 수 있고, 접근이 어떻게 일어나는지 알기 쉽지 않기때문이라고 한다.
===> 오호.. 맞는말이다.

이러한 내용을 알게되었으니 업무에 활용해봐야겠다!

오늘의 코멘트: 실수하고 있었구만..

profile
"돈받고 일하면 프로다"

0개의 댓글