개요
예외라는 개념은 오류 코드를 연쇄적으로 전파하던 긴 코드를 제거할 수 있게 해줬다.
예외는 과용하면 좋지 않다. 말그대로 예외인 경우에만 쓰여야 한다.
함수 호출 전에 문제를 제거할 수 있다면 그렇게 해야 한다.
예시
DB 연결 같은 자원을 관리하는 자원 풀 클래스
풀은 어떤 자원이 할당되고 가용할 수 있는 지를 추적, 자원 바닥나면 새로 생성
import java.util.Deque; import java.util.List; import java.util.NoSuchElementException; public class Refactoring1 { static class Resource{ public static Resource create() { return null; } } static class ResourcePool{ private Deque<Resource> available; private List<Resource> allocated; public Resource get() { Resource result; try { result = available.pop(); allocated.add(result); }catch (NoSuchElementException e) { result = Resource.create(); allocated.add(result); } return result; } } } |
import java.util.Deque; import java.util.List; import java.util.NoSuchElementException; public class Refactoring1 { static class Resource{ public static Resource create() { return null; } } static class ResourcePool{ private Deque<Resource> available; private List<Resource> allocated; public Resource get() { Resource result; //풀에서 자원이 고갈되는 건 예상치 못한 조건이 아니다. 따라서 예외처리로 대응하는 건 옳지 않다. if(available.isEmpty()) { result = Resource.create(); allocated.add(result); }else { try { result = available.pop(); allocated.add(result); }catch (NoSuchElementException e) { throw new AssertionError("도달 불가"); } } return result; } } } |
예외에 도달하지 못한다면 이제 제거 import java.util.Deque; import java.util.List; public class Refactoring1 { static class Resource{ public static Resource create() { return null; } } static class ResourcePool{ private Deque<Resource> available; private List<Resource> allocated; public Resource get() { Resource result; if(available.isEmpty()) { result = Resource.create(); allocated.add(result); }else { result = available.pop(); allocated.add(result); } return result; } } } |
import java.util.Deque; import java.util.List; public class Refactoring1 { static class Resource{ public static Resource create() { return null; } } static class ResourcePool{ private Deque<Resource> available; private List<Resource> allocated; public Resource get() { //더 다듬기 Resource result = available.isEmpty()? Resource.create():available.pop(); allocated.add(result); return result; } } } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
12 - 상속 다루기 - 필드 올리기 (0) | 2023.10.26 |
---|---|
12 - 상속 다루기 - 메서드 올리기 (0) | 2023.10.09 |
11 - API 리팩터링 - 오류 코드를 예외로 바꾸기 (0) | 2023.09.22 |
11 - API 리팩터링 - 수정된 값 반환하기 (0) | 2023.09.21 |
11 - API 리팩터링 - 명령을 함수로 바꾸기 (0) | 2023.09.20 |