800===Dev Docs and License/Design Pattern

Locality of Behavior (행위의 국소성) 😊

블로글러 2024. 11. 17. 19:21

안녕하세요! 오늘은 객체지향 설계의 중요한 원칙 중 하나인 Locality of Behavior에 대해 알아보겠습니다.

Locality of Behavior란? 🤔

행위의 국소성이란 특정 데이터와 그 데이터를 사용하는 행위(메서드)가 같은 클래스에 있어야 한다는 객체지향 설계 원칙입니다.

쉽게 말해서:

  • 데이터를 가진 객체가 그 데이터로 하는 일도 책임져야 한다는 의미예요!
  • 마치 주방장이 자신의 주방 도구를 직접 관리하는 것과 같죠

왜 중요한가요? 🌟

  1. 응집도 향상

    • 연관된 데이터와 행위가 한 곳에 모여있어 코드 이해가 쉬워짐
    • 마치 주방 도구들이 주방에 모여있는 것처럼!
  2. 유지보수성 증가

    • 관련 코드가 한 곳에 모여있어 수정이 용이
    • 버그 수정도 더 쉬워짐
  3. 캡슐화 강화

    • 데이터와 그 처리가 한 곳에서 이루어져 정보 은닉이 자연스러움

나쁜 예시와 좋은 예시 💡

나쁜 예시 ❌

class Order {
    private List<OrderItem> items;
    private BigDecimal totalPrice;
}

class OrderService {
    public BigDecimal calculateTotal(Order order) {
        return order.getItems().stream()
                   .map(item -> item.getPrice())
                   .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}

좋은 예시 ✅

class Order {
    private List<OrderItem> items;
    private BigDecimal totalPrice;

    public BigDecimal calculateTotal() {
        return items.stream()
                   .map(OrderItem::getPrice)
                   .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}

실제 적용 사례 📱

1. 주문 시스템

class Cart {
    private List<Item> items;

    public BigDecimal calculateTotalPrice() {
        // 카트가 자신의 아이템 가격을 직접 계산
        return items.stream()
                   .map(Item::getPrice)
                   .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

    public void addItem(Item item) {
        // 카트가 자신의 아이템 추가를 직접 관리
        items.add(item);
    }
}

2. 사용자 인증

class User {
    private String password;
    private String salt;

    public boolean validatePassword(String inputPassword) {
        // 사용자가 자신의 비밀번호 검증을 직접 수행
        String hashedInput = hashPassword(inputPassword, this.salt);
        return hashedInput.equals(this.password);
    }
}

적용 시 주의사항 ⚠️

  1. 과도한 책임 부여 금지

    • 한 클래스에 너무 많은 행위를 넣지 않기
    • 단일 책임 원칙(SRP)도 함께 고려하기
  2. 적절한 균형 찾기

    • 때로는 별도의 서비스 계층이 필요할 수 있음
    • 비즈니스 로직의 복잡도에 따라 유연하게 적용

장점 정리 🎯

  1. 코드 가독성 향상

    • 관련 코드가 한 곳에 모여 있어 이해하기 쉬움
  2. 유지보수성 개선

    • 수정이 필요한 코드를 쉽게 찾을 수 있음
  3. 버그 감소

    • 데이터 처리 로직이 분산되지 않아 오류 가능성 감소
  4. 재사용성 증가

    • 응집도 높은 클래스는 다른 상황에서도 쉽게 재사용 가능

참고 자료 📚

728x90