규칙을 바탕으로 필터 대상을 선별하는 유니버설 코드 구현 방안이 필요하다
4149 단어 코드 디자인
업무
다음 페이지에서 쿠폰 목록 조회
실현 방안 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;
}
결점
//
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
. 예를 들어 상기 규칙을 설정합니다.
쿠폰을 필터링하기 전에 위의 규칙 목록을 조회하고 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" # ( ) ( )
}