mooh2jj / Java-Challenge-Study

자바 챌린지 스터디
2 stars 13 forks source link

자바챌린지 2주차 과제 #2

Open mooh2jj opened 2 years ago

mooh2jj commented 2 years ago

이벤트 쿠폰 을 사용하는 서비스 내 데이터 파싱을 중점으로 문제를 만들어봤습니다.

  1. 쿠폰 이름으로 한글가 들어있는 것을 정규표현식으로 찾기


  1. Dto(req/res)에 쿠폰에 대한 여러가지 필드들이 존재할 수 있습니다. 그중 시간필드, 상태값 status필드도 존재합니다. 현재를 기준으로 beginDt ~ endDt 이외 기간에 쿠폰이라면 status Enum 상태가 unable("사용불가")하게 할 수 있는 로직을 만들어주세요.


  1. 개발할 시 추천 할만한 변수 네이밍 방식이 있다면 설명해주세요 :)
choiyoungkwon12 commented 2 years ago
@Override
    public CouponInfo getCouponInfo(String couponName) {

        // KOREAN_CONTAINS_REGEX_PATTERN = ".*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*"
        if (Pattern.matches(PatternRegEx.KOREAN_CONTAINS_REGEX_PATTERN, couponName)){
            Optional<Coupon> findCoupon = couponRepository.findByCouponName(couponName);
            if (findCoupon.isPresent()){
                Coupon coupon = findCoupon.get();
                LocalDateTime now = LocalDateTime.now();
                if (now.isBefore(coupon.getEndDate())){
                    return CouponInfo.builder()
                        .couponName(coupon.getCouponName())
                        .couponStatus(CouponStatus.ENABLE)
                        .couponDescription(coupon.getCouponDescription())
                        .build();
                }
                return CouponInfo.builder()
                    .couponName(coupon.getCouponName())
                    .couponStatus(CouponStatus.DISABLE)
                    .couponDescription("만료된 쿠폰입니다.")
                    .build();
            }
        }

        return CouponInfo.builder()
            .couponName(couponName)
            .couponDescription("이름과 일치하는 쿠폰을 찾을 수 없습니다")
            .build();
    }
  1. 먼저 팀에서는 컨벤션이 있는지 확인하고 있다면 따르는게 가장 좋다고 생각합니다. 그 외에는 개인적으로 코드를 봤을때 무슨 역할을 하는지 추측가능해야 한다고 생각해서 최대한 알아보기 쉽게 네이밍 하는 것이 좋다고 생각합니다. 예를 들면, 매직 넘버와 같은 것 대신에 상수로 선언하던가, 줄임말 대신에 풀어서 설명하는 네이밍 방식을 작성하는 것이 좋다고 생각합니다.

DanielYY95 commented 2 years ago

`

@PostMapping("/couponCheck")
public String checkCouponRegex(@RequestBody CouponReq requestDto){

    Coupon coupon = Coupon.builder()
                    .endDt(requestDto.getEndDt()).name(requestDto.getName()).build();

    // 날짜 비교
    LocalDateTime now = LocalDateTime.now();

    Duration remainDuration = Duration.between(now, coupon.getEndDt());

    long HH = remainDuration.toHoursPart();
    long MM = remainDuration.toMinutesPart();
    long SS = remainDuration.toSecondsPart();
    long DD = remainDuration.toDaysPart();

    String remainDt = String.format("%d일 %d시간 %d분 %d초 남았습니다.", DD, HH, MM, SS);

    String status = "active";

    if(requestDto.getEndDt().isBefore(now)){
        status = "unable";
    }

   // 한글 정규식 대조

    String koreanRegex = "^.*[가-힣]+.*";
    String couponNm = coupon.getName();

    String result = "한글 이름이 있는 쿠폰명: ";

    result += couponNm.matches(koreanRegex)? res.getName(): "없음";

    CouponRes res = CouponRes.builder().name(couponNm).remainDt(remainDt)
                    .endDt(coupon.getEndDt()).status(status).build();

    System.out.println("상태: "+res.getStatus());
    System.out.println("남은 일: "+res.getRemainDt());
    System.out.println("종료 일: "+res.getEndDt());

    return result;
}

`

3. 네이밍 (혼자 공부했을 때 정리했던 내용입니다)

0) 협업을 하다보면 내 코드를 다른 사람이 알아보기 쉬워야 유지보수가 쉽다.

1) 최대한 적은 단어를 쓰는게 좋지만 지저분해도 된다.

2) 변수

변수

3) 네이밍컨벤션

4) 메소드

5) 기타 규칙

6) 상황별 추천 단어

p.s 표준 라이브러리 및 프레임워크의 변수명들을 많이 참고하자 + 다른 사람들의 코드를 보면서 배우기 from 마이크로소프트(엄청 깐깐하게 코드)