동작 파라미터화
를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다.
이는 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출한다. 즉, 코드 블록의 실행은 나중으로 미뤄진다.
동작 파라미터화를 추가하려면 쓸데없는 코드가 늘어나게 되는데, 이는 람다 표현식
으로 해결한다.
enum Color { RED, GREEN }
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;
}
색을 파라미터화할 수 있도록 메서드에 파라미터를 추가하면 변화하는 요구사항에 유연하게 대응할 수 있을 것이다.
public static List<Apple> filterApplesByColor(List<Apple> inventory, Color color) {
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory) {
if (apple.getColor().equals(color)) {
result.add(apple);
}
}
return result;
}
여기서 ‘색 이외에도 사과를 무게로도 구분하면 좋겠다’라는 요구사항이 생긴다면? → 무게 파라미터를 추가하면 된다.
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;
}
필터링을 적용하는 부분의 코드가 중복되는 것을 알 수 있는데, 이는 DRY 원칙을 어기는 것이다. 어떤 것을 기준으로 필터링할지 가리키는 플래그를 추가하여 이를 해결할 수 있다.