규칙을 바탕으로 필터 대상을 선별하는 유니버설 코드 구현 방안이 필요하다

4149 단어 코드 디자인
규칙을 바탕으로 필터 대상을 선별하는 유니버설 코드 구현 방안이 필요하다

업무


다음 페이지에서 쿠폰 목록 조회
  • 현재 사용 가능한 모든 쿠폰 조회
  • 해당되는 쿠폰 필터링
  • 검사 클래스 통용권 또는 상품 클래스와 동일
  • 만감권을 검사하고 100에서 50을 빼면 주문 금액이 100을 채우면 사용 가능
  • 점포권은 다른 점포의 점포권을 사용할 수 없음
  • 검사

    실현 방안 1

        //  
        public List getAvailableCoupons(String productCategory, int orderPrice, String shopId, String userId){
            //  
            List couponList = couponMapper.queryCoupons(userId);
            //  
            List availableList = new ArrayList<>();
            for (Coupon coupon : couponList) {
                //    
                if(!checkCategory(coupon,productCategory)){ //  
                    continue;
                }
                //    100 50
                if(!checkPrice(coupon,orderPrice)){ //  
                    continue;
                }
                //  
                if(!checkShopCoupon(coupon,shopId)){ //  
                    continue;
                }
                availableList.add(coupon);
            }
    
            return availableList;
        }

    결점

  • 단원 테스트가 불편하다. 만약에 점포권 검사를 실패하려면 검사가 통과되었어도 확실히 호출되었는지 확인할 수 없다checkShopCoupon. checkCategory가 실패했거나 checkPrice 실패로 인해 어떤 검사만 충분한 테스트를 할 수 없다
  • 확장이 불편합니다. 만약에 도서 클래스를 추가할 때 플랫폼 쿠폰을 사용할 수 없으면 코드를 수정하고 다음과 같은 검사를 추가해야 합니다. 그리고 출시 후에 이 쿠폰의 제한을 취소하려면 코드를 수정하여 출시해야 합니다.
  •     if(!checkBookCategory(productCategory,couponFrom)){
            //    
            continue;
        }

    실현 방안 2


    규칙을 구성하는 방법으로 쿠폰을 선별합니다spel. 예를 들어 상기 규칙을 설정합니다.
  • 검사 클래스 규칙은 통용권이 아니며 작품 클래스 배제category와 같지 않습니다!= 'all' and category != productCategory
  • 만감금액 규칙 만감권 검사 및 주문금액 부족 만감금액 제외fullPrice!=null and orderPrice < fullPrice
  • 점포권 규칙 점포권 검사 및 소속 점포가 작품과 다른 배제couponFrom=='shop'and couponShopId!=productShopId

  • 쿠폰을 필터링하기 전에 위의 규칙 목록을 조회하고 Rule 객체로 전환합니다. 이 코드는 다음과 같습니다.
        public List getAvailableCoupons2(String productCategory, int orderPrice, String shopId, String userId){
            //  
            List couponList = couponMapper.queryCoupons(userId);
            //  
            List availableList = new ArrayList<>();
            //  
            String rules = couponMapper.getFilterRules();
            List couponFilterRules = convertToFilterRules(rules);
            outer:for (Coupon coupon : couponList) {
                for (CouponFilterRule rule : couponFilterRules) {
                    //      
                    if(rule.matches(coupon)){
                        continue outer;
                    }
                }
                availableList.add(coupon);
            }
            return availableList;
        }

    장점

  • 단원 테스트는 유연하고 자유로운 테스트를 할 수 있다. 어떤 검사는 다른 검사의 간섭이 없다. 예를 들어 검사 종류만 테스트할 수 있다
  • // coupon1   coupon2   coupon3  【 】
    when(couponMapper.queryCoupons(userId)).thenReturn(newArrayList(coupon1,coupon2,coupon3));
    when(couponMapper.getFilterRules()).thenReturn("category != 'all' and category != productCategory");
    //  2 
    assertEquals(2, availableList.size()); 
    //  ID 1,2
    ...
  • 확장이 편리하다. 만약에 검사 규칙을 추가하려면 도서 클래스가 플랫폼권 사용을 지원하지 않는다면 설정 규칙을 추가하면 다음과 같다
  • productCategory == 'book' and couponFrom == 'platform'

    어떠한 코드 개발이나 출시 후 이 규칙을 없애는 것도 편리하다

    초과 작업


    지원spel표현식 쿠폰 대상에 불필요한 주문금액이 필요한 작품 클래스 작품 소속 점포 Id 등 정보

    기타 문제

  • 명중이 다른 규칙에 따라 다른 힌트를 반환해야 할 수 있습니다. 예를 들어 클래스가 일치하지 않는 주문 금액 부족 등
  • 주문서를 제출할 때도 사용한 쿠폰이 합법적인지 확인해야 한다. 일부 장면은 다음 페이지에서 쿠폰을 조회해야 주문서를 제출할 때 제한을 받지 않는다. 만약에 옛날 버전이 쿠폰을 지원하지 않으면 다음 페이지에서 쿠폰을 선택할 수 있지만 주문 제출 실패는 사용자에게 업그레이드 버전을 알려준다
  • 해결하다

  • 규칙 설정에 대응하는 문안과 장면의 개폐 상태를 증가시킨다. 예를 들어
  • {
      "rule": "not checkVersion(3.0.0)", #  3.0.0 
      "message": " , ", #  
      "switchStatus": "01" #    ( )    ( )
    }

    참조 문서


    http://www.baeldung.com/sprin...

    좋은 웹페이지 즐겨찾기