일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 정적팩토리메서드
- 스프링
- method refetence
- fetch join
- 기능적 요구사항
- 소프트웨어의 품격
- open-session-in-view
- ioc컨테이너
- 스프링 시큐리티 설정
- 그래프큐엘
- IOC
- 스프링 포매터
- jpa lazy
- java predicate
- Atomicity
- 자바 필터
- Spring
- 동적파라미터
- jpa no session
- 스프링시큐리티
- 스프링di
- kotlin ::
- 생성자주입
- spring formatter
- 도커 이미지 빌드
- 스프링부트 도커
- 비기능적 요구사항
- 토비의 스프링
- 수정자주입
- kotlin 리팩터링
Archives
- Today
- Total
공부기록
코드의 점진적인 발진으로 동적파라미터를 이해해보자 본문
반응형
아래 내용은 책 모던 자바 인 액션(http://www.yes24.com/Product/Goods/77125987?scode=032&OzSrank=2) 을 정리한것임을 밝힙니다.
코드의 점진적인 발진으로 동적파라미터를 이해해보자
첫번째 요구사항.
사과를 재배하는 농부 후안의 요구사항
- "제가 수확한 사과 중에 색깔이 "GREEN"인 사과만 수집해주세요
FirstStep.class
public static List<Apple> filterGreenApples(List<Apple> inventory) { List<Apple> result = new ArrayList<>(); for (Apple apple : inventory) { if (GREEN.equals(apple.getColor())) { result.add(apple); } } return result; }
두번째 요구사항
후안이 또다른 요구를 해왔다.
- "제가 수확한 사과 중에 무게가 xxx 이상인 것들만 수집해주세요"
SecondStep.class
public static List<Apple> filterApplesByWeight(List<Apple> inventory, int weight) { List<Apple> result = new ArrayList<>(); for (Apple apple : inventory) { if (apple.getWeight() > weight) { result.add(apple); } } return result; }
세번째 요구사항
- "수확한 사과 중에 색깔이 xxx고, 무게가 yyy 이상인 사과만 수집해주세요"
ThirdStep.class
public static List<Apple> filterApples(List<Apple> inventory, Color color, int weight, boolean flag) { List<Apple> result = new ArrayList<>(); for (Apple apple : inventory) { if ((flag && apple.getColor().equals(color)) || (!flag && apple.getWeight() > weight)) { result.add(apple); } } return result; }
각 요구사항마다 중복 코드가 너무 많다. 해결책?
- 변화하는 요구사항에 좀 더 유연하게 대응할 수 있는 방법이 있다.
Apple
의 속성에 기초해boolean
값을 반환하는 방법이 있다.Predicate
인터페이스를 정의하자.- 그 다음
Predicate
의 구현체인AppleGreenColorPredicate
,AppleHeavyWeightPredicate
을 만들자. - 클라이언트 코드(
Main.class
)에서 인자값으로 구현체를 사용하면 된다.- 전략패턴 찾아볼 것
- ApplePredicate.class
public interface ApplePredicate { boolean test(Apple apple); }
- AppleGreenColorPredicate.class
public class AppleGreenColorPredicate implements ApplePredicate{ @Override public boolean test(Apple apple) { return GREEN.equals(apple.getColor()); } }
- AppleHeavyWeightPredicate.class
public class AppleHeavyWeightPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { return apple.getWeight() > 150; } }
- FourthStep.class
public class FourthStep { public static List<Apple> filterApples(List<Apple> apples, ApplePredicate predicate) { List<Apple> result = new ArrayList<>(); for (Apple apple : apples) { if (predicate.test(apple)) { result.add(apple); } } return result; } }
- Main.class
public class Main { public static void main(String[] args) { List<Apple> inventory = Arrays.asList( new Apple(80, Color.GREEN), new Apple(155, Color.GREEN), new Apple(120, Color.RED) ); List<Apple> heavyApples = FourthStep.filterApples(inventory, new AppleHeavyWeightPredicate()); heavyApples.forEach(System.out::println); List<Apple> greenApples = FourthStep.filterApples(inventory, new AppleGreenColorPredicate()); greenApples.forEach(System.out::println); } }
반응형
'JAVA' 카테고리의 다른 글
[JAVA] 프록시 패턴에 대해 알아보자 (0) | 2020.06.24 |
---|---|
아이템24. 멤버클래스는 되도록 static으로 만들라. (0) | 2019.12.17 |
아이템 17. 변경가능성을 최소화하라. (0) | 2019.12.11 |
아이템15. 클래스와 멤버의 접근권한을 최소화하라. (0) | 2019.12.01 |
아이템12. toString을 항상 재정의하라 (0) | 2019.12.01 |