ABOUT ME

💻

  • 워밍업 클럽 2기 BE 클린코드&테스트코드 DAY 4 미션
    카테고리 없음 2024. 10. 3. 22:41

    보기 좋은 코드 작성법

    • 예외가 발생할 가능성 낮추기
    • 어떤 값의 검증이 필요한 부분은 주로 외부 세계와의 접점
    • e.g) 사용자 입력, 외부 사용자 요청
    • 의도한 예외와 예상하지 못한 예외를 구분하기

    Null을 대하는 자세

    • 항상 NPE를 방지하는 방향으로 경각심을 가지기
    • 메서드 설계 시 return null을 자제하기
    • Optional은 꼭 필요한 상황에서 반환 타입에 사용
    • 반환받았다면 최대한 빠르게 해소하기

     

    강의내용을 바탕으로 리팩토링을 해보았다. 

     

    1. 리팩토링 하기

    리팩토링 전

    public boolean validateOrder(Order order) {
        if (order.getItems().size() == 0) {
            log.info("주문 항목이 없습니다.");
            return false;
        } else {
            if (order.getTotalPrice() > 0) {
                if (!order.hasCustomerInfo()) {
                    log.info("사용자 정보가 없습니다.");
                    return false;
                } else {
                    return true;
                }
            } else if (!(order.getTotalPrice() > 0)) {
                log.info("올바르지 않은 총 가격입니다.");
                return false;
            }
        }
        return true;
    }

    리팩토링 결과

     public boolean validateOrder(Order order) {
            isMoreThenOne();
            checkTotalPrice();
            isUser();
    
            return true;
        }
    
        public boolean isUser() {
            if (order.hasCustomerInfo()) {
                return true;
            }
    
            throw new IllegalArgumentException("사용자 정보가 없습니다.");
        }
    
        public boolean isMoreThenOne() {
            if (order.getItems().size() == 0) {
                throw new IllegalArgumentException("주문 항목이 없습니다.");
            }
    
            return true;
        }
    
        public boolean checkTotalPrice() {
            if (order.getTotalPrice() == 0) {
                throw new IllegalArgumentException("올바르지 않은 총 가격입니다.");
            }
    
            return true;
        }

     

    else절을 제외하고, 부정절을 사용하지 않는 방향으로 리팩토링하려고 노력하였다.

    아닌 경우는 에러를 던져 사용자가 에러 문구를 확인할 수 있도록 짜보았다!

    간결하고 더 보기 좋아진 것 같다 야호!

     

    2. SOLID 원칙 자신만의 언어로 정리하기

    • 단일 책임 원칙 (Single Responsibility Principle)
      클래스는 하나의 책임만 가져야 하며, 그 책임을 모두 수행하는 데 집중해야 합니다. 이로 인해 클래스가 변경될 이유는 하나뿐이어야 합니다. 예를 들어, 데이터 처리와 UI 로직을 한 클래스에 담지 말고, 각각의 책임에 따라 분리하면 유연한 변경이 가능합니다.
    • 개방-폐쇄 원칙 (Open-Closed Principle)
      소프트웨어 엔티티는 확장에 열려 있어야 하고, 수정에는 닫혀 있어야 합니다. 기능을 추가할 때 기존 코드를 변경하지 않고 새로운 코드로 기능을 확장할 수 있어야 합니다. 이를 위해 인터페이스와 다형성을 적극적으로 사용합니다.
    • 리스코프 치환 원칙 (Liskov Substitution Principle)
      서브타입은 언제나 자신의 기반 타입으로 교체될 수 있어야 한다는 원칙입니다. 즉, 부모 클래스를 사용하는 곳에 자식 클래스를 사용해도 문제가 없어야 합니다. 이를 통해 클래스 간 일관성을 유지하고, 코드의 안정성을 확보할 수 있습니다.
    • 인터페이스 분리 원칙 (Interface Segregation Principle)
      하나의 일반적인 인터페이스보다는 구체적인 작은 인터페이스들을 여러 개 만들어 사용하는 것이 좋다는 원칙입니다. 불필요한 메서드를 강요하지 않도록, 필요한 기능만 구현하도록 인터페이스를 나누어야 합니다.
    • 의존성 역전 원칙 (Dependency Inversion Principle)
      고수준 모듈이 저수준 모듈에 의존하는 대신, 추상화에 의존해야 한다는 원칙입니다. 즉, 의존성을 하위 구현이 아닌 인터페이스나 추상 클래스에 두어야 유연성과 재사용성을 높일 수 있습니다.

     

    댓글

Designed by Tistory.