ããã«ã¡ã¯ãHabrã
ååã翻蚳ããã ãã®èšäºã«åºãããããšããããŸãã ããã«èå³æ·±ãã®ã¯ããã®ãããªèšäºãããŸããŸãªèšèªã®å°é家ã«åœ¹ç«ã€ãããããªãããJavaã®äŸãå«ãŸããŠããå Žåã§ãã ããã«ãJavaã«é¢ãã倧èŠæš¡ãªæ¬ã®åºçã«é¢ããææ°ã®ã¢ã€ãã¢ãçãããšå
±æããããšèããŠããŸãããçŸæç¹ã§ã¯ããŸã ãã·ã¢èªã«ç¿»èš³ãããŠããªã2014幎12æã®Martin Fowlerã®åºçã«ç²ŸéããŠãã ããã 翻蚳ã¯å°ãçž®å°ããŠè¡ãããŸãã
ããŒã¿ãæ€èšŒããå Žåãéåžžãæ€èšŒã倱æããããšã瀺ãã·ã°ãã«ãšããŠäŸå€ã䜿çšããªãã§ãã ããã ããã§ã¯ããéç¥ããã¿ãŒã³ã䜿çšããåæ§ã®ã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã«ã€ããŠèª¬æããŸããæè¿ãJSONã¡ãã»ãŒãžã®æãåçŽãªæ€èšŒãå®è¡ããã³ãŒãã«åºäŒããŸããã 次ã®ããã«èŠããŸããã
public void check() { if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) throw new IllegalArgumentException("number of seats cannot be null"); if (numberOfSeats < 1) throw new IllegalArgumentException("number of seats must be positive"); }
ããããéåžžã®æ€èšŒæ¹æ³ã§ãã ããŒã¿ã«ããã€ãã®æ€èšŒãªãã·ã§ã³ãé©çšããŸãïŒäžèšã¯ã¯ã©ã¹å
šäœã®ã»ãã®æ°ãã£ãŒã«ãã§ãïŒã å°ãªããšã1ã€ã®æ€èšŒã¹ãããã倱æãããšããšã©ãŒã¡ãã»ãŒãžãšãšãã«äŸå€ãã¹ããŒãããŸãã
ãã®ã¢ãããŒãã«ã¯ããã€ãã®åé¡ããããŸããã ãŸãããã®ãããªå Žåã«äŸå€ã䜿çšããã®ã¯å¥œãã§ã¯ãããŸããã äŸå€ã¯ãåé¡ã®ã³ãŒãå
ã®äœããã®ç°åžžãªã€ãã³ãã®ã·ã°ãã«ã§ãã ãã ããå€éšå
¥åããã§ãã¯ããå Žåãå
¥åããã¡ãã»ãŒãžã«ãšã©ãŒãå«ãŸããŠããå¯èœæ§ããããšæ³å®ããŸããã€ãŸãããšã©ãŒãäºæ³ããããã®å Žåã¯äŸå€ãé©çšããã®ã¯æ£ãããããŸããã
ãã®ãããªã³ãŒãã®2çªç®ã®åé¡ã¯ãæåã®ãšã©ãŒãæ€åºãããåŸã«ã¯ã©ãã·ã¥ããå Žåãæåã®ãšã©ãŒã ãã§ãªããå
¥åããŒã¿ã§çºçãããã¹ãŠã®ãšã©ãŒãå ±åããããšããå§ãããŸãã ãã®å Žåãã¯ã©ã€ã¢ã³ãã¯ãã¹ãŠã®ãšã©ãŒããŠãŒã¶ãŒã«ããã«è¡šç€ºã§ããããããŠãŒã¶ãŒã¯1åã®æäœã§ãšã©ãŒãä¿®æ£ãããŠãŒã¶ãŒãã³ã³ãã¥ãŒã¿ãŒã§ç«ãšããŠã¹ãåçããããšã匷å¶ããŸããã
ãã®ãããªå Žåããéç¥ããã¿ãŒã³ã䜿çšããŠæ€èšŒãšã©ãŒã®ã¬ããŒããæŽçããããšã奜ã¿ãŸãã éç¥ã¯ãšã©ãŒãåéãããªããžã§ã¯ãã§ãããæ€èšŒã«å€±æãããã³ã«ãå¥ã®ãšã©ãŒãéç¥ã«è¿œå ãããŸãã æ€èšŒã¡ãœããã¯éç¥ãè¿ããŸããéç¥ã解æããŠã詳现æ
å ±ã確èªã§ããŸãã ç°¡åãªäŸã¯ããã§ãã¯ãå®è¡ããããã®æ¬¡ã®ã³ãŒãã§ãã
private void validateNumberOfSeats(Notification note) { if (numberOfSeats < 1) note.addError("number of seats must be positive");
ãã®åŸãaNotification.hasErrorsïŒïŒã®ãããªåçŽãªåŒã³åºããè¡ã£ãŠããšã©ãŒãããã°å¿çããŸãã éç¥ã®ä»ã®æ¹æ³ã§ã¯ããã詳现ãªãšã©ãŒæ
å ±ãæãäžããããšãã§ããŸãã
ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ããã€é©çšãããããã§ãã³ãŒãããŒã¹å
šäœã®äŸå€ãåãé€ãããšããå§ãããŸããã äŸå€ã¯ãç·æ¥äºæ
ãåŠçããããããã¡ã€ã³ã®è«çã¹ããªãŒã ããåé€ããéåžžã«äŸ¿å©ãªæ¹æ³ã§ãã ææ¡ããããªãã¡ã¯ã¿ãªã³ã°ã¯ãäŸå€ã䜿çšããŠå ±åãããçµæãå®éã«äŸå€ã§ã¯ãªããããããã°ã©ã ã®ã¡ã€ã³ããžãã¯ã«ãã£ãŠåŠçãããå¿
èŠãããå Žåã«ã®ã¿é©åã§ãã ããã§èæ
®ãããæ€èšŒã¯ããŸãã«ãã®ãããªå Žåã§ãã
äŸå€ãå®è£
ãããšãã«äœ¿çšããå¿
èŠããã䟿å©ãªãéåãã¯ãPragmatic Programmersã«ãããŸãã
äŸå€ã¯ãããã°ã©ã ã®éåžžã®éçšã®äžéšãšããŠæ£çºçã«ã®ã¿äœ¿çšãããã¹ãã§ãããšèããŠããŸãã äŸå€çãªã€ãã³ãã§ãããã«æ£ç¢ºã«é Œãå¿
èŠããããŸãã ãã£ãããããªãã£ãäŸå€ãããã°ã©ã ãçµäºããããäŸå€ãã³ãã©ãŒãåé€ãããå Žåããã®ã³ãŒãã¯æ©èœãç¶ããŸããããšèªåããŠãã ããã çãããããããã®å ŽåãäŸå€ã¯éæä»çãªç¶æ³ã§ããããé©çšãããŸãã
-ãã€ãã»ããŒãã¹ãšã¢ã³ãã£ã»ãã³ã
ãããã£ãŠãéèŠãªçµæïŒç¹å®ã®ã¿ã¹ã¯ã«äŸå€ã䜿çšãããã©ããã®æ±ºå®ã¯ããã®ã³ã³ããã¹ãã«äŸåããŸãã ãã®ãããDaveãšAndyã¯ç¶ããŠãæªç¥ã®ãã¡ã€ã«ããã®èªã¿åãã¯ç°ãªãã³ã³ããã¹ãã§äŸå€ã«ãªãå Žåãšããã§ãªãå ŽåããããŸãã Unixã·ã¹ãã ã®/ etc / hostsãªã©ãããç¥ãããŠããå Žæãããã¡ã€ã«ãèªã¿åãããšããŠããå Žåããã¡ã€ã«ãããã«ãããšæ³å®ããããšã¯è«ççã§ãããããã§ãªãå Žåã¯äŸå€ãã¹ããŒããããšããå§ãããŸãã äžæ¹ãã³ãã³ãã©ã€ã³ã§ãŠãŒã¶ãŒãå
¥åãããã¹ã«æ²¿ã£ãŠãããã¡ã€ã«ãèªã¿åãããšããå Žåããã¡ã€ã«ãååšããªããšæ³å®ããå¥ã®ã¡ã«ããºã ïŒãšã©ãŒã®éæä»çãªæ§è³ªã瀺ããã®ïŒã䜿çšããå¿
èŠããããŸãã
æ€èšŒãšã©ãŒã«äŸå€ã䜿çšããã®ãè³¢æãªå ŽåããããŸãã ç¶æ³ã¯æ瀺ãããŠããŸãïŒåŠçã®åæ段éã§æ¢ã«æ€èšŒãããŠããã¯ãã®ããŒã¿ããããŸããããœãããŠã§ã¢ãšã©ãŒããå®å
šã«ããããã«ããã®ãããªãã§ãã¯ãå床è¡ããããããç¡å¹ãªããŒã¿ãããæããããšããããŸãã
ãã®èšäºã§ã¯ãçã®å
¥åæ€èšŒã®ã³ã³ããã¹ãã§ãé€å€ãéç¥ã«çœ®ãæããããšã«ã€ããŠèª¬æããŸãã ãã®ãããªææ³ã¯ãéç¥ãäŸå€ãããé©åãªãªãã·ã§ã³ã§ããå Žåã«åœ¹ç«ã¡ãŸãããããã§ã¯æ€èšŒãæãäžè¬çãªãªãã·ã§ã³ã«çŠç¹ãåœãŠãŸãã
éå§ãããããŸã§ã®ãšãããã³ãŒãã®æãäžè¬çãªæ§é ã®ã¿ã説æããããããµããžã§ã¯ãé åã«ã€ããŠã¯èšåããŠããŸããã ãããããã®åŸããã®äŸã®éçºã§ã¯ãäž»é¡é åãããæ£ç¢ºã«æŠèª¬ããå¿
èŠããããŸãã ããã¯ãåå Žã®åº§åžã®äºçŽã«é¢ããã¡ãã»ãŒãžãJSON圢åŒã§åãåãã³ãŒãã«ãªããŸãã ãã®ã³ãŒãã¯äºçŽãªã¯ãšã¹ãã¯ã©ã¹ã§ãgsonã©ã€ãã©ãªã䜿çšããŠJSONæ
å ±ã«åºã¥ããŠå
¥åãããŸãã
gson.fromJson(jsonString, BookingRequest.class)
Gsonã¯ã¯ã©ã¹ãååŸããJSONããã¥ã¡ã³ãå
ã®ããŒã«äžèŽãããã£ãŒã«ããæ¢ãããããã®ãã£ãŒã«ãã«å
¥åããŸãã
ãã®äºçŽãªã¯ãšã¹ãã«ã¯ãæ€èšŒãã2ã€ã®èŠçŽ ã®ã¿ãå«ãŸããŸããã€ãã³ãã®æ¥ä»ãšæå®åžæ°ã§ãã
ã¯ã©ã¹BookingRequest ... private Integer numberOfSeats; private String date; â , class BookingRequest⊠public void check() { if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) throw new IllegalArgumentException("number of seats cannot be null"); if (numberOfSeats < 1) throw new IllegalArgumentException("number of seats must be positive"); }
éç¥ãäœæéç¥ã䜿çšããã«ã¯ããã®ããã®ç¹å¥ãªãªããžã§ã¯ããäœæããå¿
èŠããããŸãã éç¥ã¯éåžžã«åçŽãªå Žåããããè¡ã®ãªã¹ãã®ã¿ã§æ§æãããå ŽåããããŸãã
éç¥ã¯ãšã©ãŒãèç©ããŸã
List<String> notification = new ArrayList<>(); if (numberOfSeats < 5) notification.add("number of seats too small");
åçŽãªãªã¹ãã®ã€ãã£ãªã ã¯ãã¿ãŒã³ã®è»œéãªå®è£
ãæäŸããŸãããããã§åæ¢ããŠåçŽãªã¯ã©ã¹ãäœæããããšã¯å¥œã¿ãŸããã
public class Notification { private List<String> errors = new ArrayList<>(); public void addError(String message) { errors.add(message); } public boolean hasErrors() { return ! errors.isEmpty(); } âŠ
å®éã®ã¯ã©ã¹ã䜿çšããŠãæå³ãããæ確ã«è¡šçŸããŸããã³ãŒããªãŒããŒã¯ãã€ãã£ãªã ãšãã®å®å
šãªæå³ã粟ç¥çã«é¢é£ä»ããå¿
èŠã¯ãããŸããã
æ€èšŒæ¹æ³ãéšåã«å解ããŸããŸããæ€èšŒæ¹æ³ã2ã€ã®éšåã«åããŸãã å
éšéšåã¯éç¥ã§ã®ã¿æ©èœããäŸå€ãã¹ããŒããŸããã å€éšéšåã¯ãæ€èšŒã¡ãœããã®å®éã®åäœãä¿æããŸããã€ãŸããæ€èšŒã倱æãããšäŸå€ãã¹ããŒãããŸãã
ãããè¡ãããã«ãç§ãæåã«äœ¿çšããã®ã¯ãç°åžžãªæ¹æ³ã§ã¡ãœãããéžæããããšã§ããæ€èšŒã¡ãœããã®å
šäœãæ€èšŒã¡ãœããã«å
¥ããŸãã
ã¯ã©ã¹BookingRequest ... public void check() { validation(); } public void validation() { if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) throw new IllegalArgumentException("number of seats cannot be null"); if (numberOfSeats < 1) throw new IllegalArgumentException("number of seats must be positive"); }
次ã«ãéç¥ãäœæããŠè¿ãããã«æ€èšŒã¡ãœãããä¿®æ£ããŸãã
ã¯ã©ã¹BookingRequest ... public Notification validation() { Notification note = new Notification(); if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) throw new IllegalArgumentException("number of seats cannot be null"); if (numberOfSeats < 1) throw new IllegalArgumentException("number of seats must be positive"); return note; }
ããã§ãéç¥ã確èªãããšã©ãŒãå«ãŸããŠããå Žåã¯äŸå€ãã¹ããŒã§ããŸãã
ã¯ã©ã¹BookingRequest ... public void check() { if (validation().hasErrors()) throw new IllegalArgumentException(validation().errorMessage()); }
æ€èšŒã¡ãœãããå
¬éããŸãããã»ãšãã©ã®åŒã³åºãå
ã¯ããã¹ãã¡ãœãããããèŠèŸŒã¿å®¢ããããã®ã¡ãœããã䜿çšããããšã奜ããšæãããããã§ãã
å
ã®æ¹æ³ã2ã€ã®éšåã«åããããšã§ãæ€èšŒãã§ãã¯ãšãšã©ãŒãžã®å¯Ÿå¿æ¹æ³ã®æ±ºå®ãåºå¥ããŸãã
ãã®æ®µéã§ã¯ãã³ãŒãã®åäœã«ãŸã£ãã觊ããŠããŸããã éç¥ã«ã¯ãšã©ãŒãå«ãŸããã倱æããæ€èšŒãã§ãã¯ã¯åŒãç¶ãäŸå€ãã¹ããŒããããã§è¿œå ããæ°ããæ©æ§ãç¡èŠããŸãã ããããäŸå€ã®åé¡ãéç¥ã«çœ®ãæãã段éãèšå®ããŠããŸãã
ãããéå§ããåã«ããšã©ãŒã¡ãã»ãŒãžã«ã€ããŠäœãèšãå¿
èŠããããŸãã ãªãã¡ã¯ã¿ãªã³ã°ã®éã«ã¯ã芳å¯ãããåäœã®å€æŽãé¿ãããšããã«ãŒã«ããããŸãã ãã®ãããªç¶æ³ã§ã¯ããã®ã«ãŒã«ã¯ããã«çåãæèµ·ããŸããã©ã®ãããªåäœã芳å¯å¯èœã§ããïŒ æããã«ãé©åãªäŸå€ãã¹ããŒããããšã¯å€éšããã°ã©ã ã«ãšã£ãŠããçšåºŠé¡èã§ããããšã©ãŒã¡ãã»ãŒãžã¯ã©ã®çšåºŠé¢é£ããŠããŸããïŒ ãã®çµæãéç¥ã«ã¯å€ãã®ãšã©ãŒãèç©ããã次ã®ãããª1ã€ã®ã¡ãã»ãŒãžã«ãŸãšããããŸãã
ã¯ã©ã¹éç¥... public String errorMessage() { return errors.stream() .collect(Collectors.joining(", ")); }
ããããããã§åé¡ãçºçããã®ã¯ãããé«ãã¬ãã«ã§ãæåã«èŠã€ãã£ããšã©ãŒã«ã€ããŠã®ã¿ã¡ãã»ãŒãžãåä¿¡ããããšã«ããã°ã©ã ã®å®è¡ãçµã³ã€ããŠããã次ã®ãããªãã®ãå¿
èŠãªå Žåã§ãã
ã¯ã©ã¹éç¥... public String errorMessage() { return errors.get(0); }
ãã®ç¶æ³ã«å¯Ÿããé©åãªå¿çãå€æããã«ã¯ãåŒã³åºãåŽã®é¢æ°ã ãã§ãªãããã¹ãŠã®äŸå€ãã³ãã©ãŒã«ã泚æãæãå¿
èŠããããŸãã
ããã§åé¡ãåŒãèµ·ããããšã¯ã§ããŸããã§ããããæ°ããå€æŽãå ããåã«ãã®ã³ãŒããã³ã³ãã€ã«ããŠãã¹ãããŸãã
çªå·æ€èšŒãã®å Žåã®æãæãããªã¹ãããã¯ãæåã®æ€èšŒã眮ãæããããšã§ãã
ã¯ã©ã¹BookingRequest ... public Notification validation() { Notification note = new Notification(); if (date == null) note.addError("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) throw new IllegalArgumentException("number of seats cannot be null"); if (numberOfSeats < 1) throw new IllegalArgumentException("number of seats must be positive"); return note; }
æãããªã¹ãããã§ãããã³ãŒããå£ããããæªãã§ãã é¢æ°ã«ç©ºã®æ¥ä»ãæž¡ããšãã³ãŒãã¯éç¥ã«ãšã©ãŒãè¿œå ããŸãããããã«è§£æããnullãã€ã³ã¿ãŒäŸå€ãã¹ããŒããŸãããã®äŸå€ã«ã¯é¢å¿ããããŸããã
ãããã£ãŠããã®å Žåã¯ãããã»ã©åçŽã§ã¯ãªãããããå¹æçãªããšãã€ãŸãåŸéããããšããå§ãããŸãã
ã¯ã©ã¹BookingRequest ... public Notification validation() { Notification note = new Notification(); if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) throw new IllegalArgumentException("number of seats cannot be null"); if (numberOfSeats < 1) note.addError("number of seats must be positive"); return note; }
åã®ãã§ãã¯ã¯ãŒããã§ãã¯ã§ãããããnullãã€ã³ã¿ãŒäŸå€ãã¹ããŒããªãããã«ããæ¡ä»¶ä»ãã³ã³ã¹ãã©ã¯ããå¿
èŠã§ãã
ã¯ã©ã¹BookingRequest ... public Notification validation() { Notification note = new Notification(); if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); if (numberOfSeats == null) note.addError("number of seats cannot be null"); else if (numberOfSeats < 1) note.addError("number of seats must be positive"); return note; }
次ã®ãã§ãã¯ã¯å¥ã®ãã£ãŒã«ãã«åœ±é¿ããããšãããããŸãã ãªãã¡ã¯ã¿ãªã³ã°ã®åã®æ®µéã§æ¡ä»¶ä»ãæ§æãå°å
¥ããå¿
èŠãããã ãã§ãªããæ€èšŒæ¹æ³ãéåžžã«è€éã§å解ãããå¯èœæ§ãããããã«æããŸãã ãã®ãããæ°å€ã®æ€èšŒãæ
åœããããŒããéžæããŸãã
ã¯ã©ã¹BookingRequest ... public Notification validation() { Notification note = new Notification(); if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); validateNumberOfSeats(note); return note; } private void validateNumberOfSeats(Notification note) { if (numberOfSeats == null) note.addError("number of seats cannot be null"); else if (numberOfSeats < 1) note.addError("number of seats must be positive"); }
匷調衚瀺ãããæ°å€æ€èšŒãèŠãŠããã®æ§é ã奜ãã§ã¯ãããŸããã æ€èšŒæã«if-then-elseãããã¯ã䜿çšããã®ã¯å¥œãã§ã¯ãããŸãããæ·»ä»ãã¡ã€ã«ã®æ°ãå€ãããã³ãŒãã¯éåžžã«ç°¡åãªããã§ãã ç§ã¯ãããã°ã©ã ã®å®è¡ãäžå¯èœã«ãªããšããã«åäœãåæ¢ããç·åœ¢ã³ãŒãã奜ã¿ãŸãããã®ãããªãã€ã³ãã¯ãå¢çæ¡ä»¶ã䜿çšããŠæ±ºå®ã§ããŸãã ãããããã¹ããããæ¡ä»¶æ§æã®å¢çæ¡ä»¶ãžã®çœ®æãå®è£
ããæ¹æ³ã§ãã
ã¯ã©ã¹BookingRequest ... private void validateNumberOfSeats(Notification note) { if (numberOfSeats == null) { note.addError("number of seats cannot be null"); return; } if (numberOfSeats < 1) note.addError("number of seats must be positive"); }
ãªãã¡ã¯ã¿ãªã³ã°ãããšãã¯ãåžžã«æå°éã®æé ã§æ¢åã®åäœãç¶æããããã«ããŠãã ããã
äžæ©åŸéãããšããç§ã®æ±ºå®ã¯ããªãã¡ã¯ã¿ãªã³ã°ã«ãããŠéèŠãªåœ¹å²ãæãããŸãã ãªãã¡ã¯ã¿ãªã³ã°ã®æ¬è³ªã¯ãã³ãŒãã®æ§é ãå€æŽããããšã§ãããå®è¡ãããå€æã«ãã£ãŠåäœãå€æŽãããªãããã«ããŸãã ãããã£ãŠããªãã¡ã¯ã¿ãªã³ã°ã¯åžžã«å°ããªæé ã§å®è¡ããå¿
èŠããããŸãã ãã®ããããããã¬ã§è¿œãè¶ãå¯èœæ§ã®ãããšã©ãŒã«å¯ŸããŠä¿èšŒããŸãã
æ¥ä»æ€èšŒæ¥ä»ãæ€èšŒãããšã
ãã¡ãœããã匷調衚瀺ããããšããåã³å§ã
ãŸã ã
ã¯ã©ã¹BookingRequest ... public Notification validation() { Notification note = new Notification(); validateDate(note); validateNumberOfSeats(note); return note; } private void validateDate(Notification note) { if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) throw new IllegalArgumentException("date cannot be before today"); }
IDEã§èªåã¡ãœããå²ãåœãŠã䜿çšããå Žåãçµæã®ã³ãŒãã«ã¯éç¥åŒæ°ãå«ãŸããŠããŸããã§ããã ããã§ãæåã§è¿œå ããããšããŸããã
æ¥ä»ãæ€èšŒãããšãã«æ»ããŸãããïŒ
ã¯ã©ã¹BookingRequest ... private void validateDate(Notification note) { if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid format for date", e); } if (parsedDate.isBefore(LocalDate.now())) note.addError("date cannot be before today"); }
2çªç®ã®æ®µéã§ã¯ãã¹ããŒãããäŸå€ã«æ¡ä»¶äŸå€ãããããããšã©ãŒåŠçã§åé¡ãçºçããŸãã åŠçããã«ã¯ããã®ãããªäŸå€ãåãå
¥ããããšãã§ããããã«éç¥ãå€æŽããå¿
èŠããããŸãã ç§ã¯ã¡ããã©ããã«ããã®ã§ãäŸå€ãã¹ããŒããããšãæåŠããéç¥ãåŠçããŸã-ç§ã®ã³ãŒãã¯èµ€ã§ãã ãããã£ãŠãããŒã«ããã¯ããŠãäžèšã®ãã©ãŒã ã®validateDateã¡ãœãããçµäºããæ¡ä»¶ä»ãäŸå€ãåãåãéç¥ãæºåããŸãã
éç¥ã®å€æŽãéå§ããæ¡ä»¶ãåãå
¥ããaddErrorã¡ãœãããè¿œå ããŠãããå
ã®ã¡ãœãããå€æŽããŠãæ°ããã¡ãœãããåŒã³åºããããã«ããŸãã
ã¯ã©ã¹éç¥... public void addError(String message) { addError(message, null); } public void addError(String message, Exception e) { errors.add(message); }
ãããã£ãŠãæ¡ä»¶ä»ãäŸå€ãåãå
¥ããŸãããç¡èŠããŸãã ã©ããã«é
眮ããã«ã¯ããšã©ãŒã¬ã³ãŒããåçŽãªæååããå°ãè€éãªãªããžã§ã¯ãã«å€æããå¿
èŠããããŸãã
ã¯ã©ã¹éç¥... private static class Error { String message; Exception cause; private Error(String message, Exception cause) { this.message = message; this.cause = cause; } }
Javaã®ãã©ã€ããŒããã£ãŒã«ãã¯å¥œãã§ã¯ãããŸããããããã§ã¯ãã©ã€ããŒãã®å
éšã¯ã©ã¹ãæ±ã£ãŠããããããã¹ãŠãç§ã«åã£ãŠããŸãã éç¥ä»¥å€ã®å Žæã§ãã®ãšã©ãŒã¯ã©ã¹ãžã®ã¢ã¯ã»ã¹ãéãå Žåããããã®ãã£ãŒã«ããã«ãã»ã«åããŸãã
ã¯ã©ã¹ããããŸãã ããã§ãæååã§ã¯ãªããéç¥ã䜿çšããããã«å€æŽããå¿
èŠããããŸãã
ã¯ã©ã¹éç¥... private List<Error> errors = new ArrayList<>(); public void addError(String message, Exception e) { errors.add(new Error(message, e)); } public String errorMessage() { return errors.stream() .map(e -> e.message) .collect(Collectors.joining(", ")); }
æ°ããéç¥ããããšãäºçŽãªã¯ãšã¹ãã«å€æŽãå ããããšãã§ããŸã
ã¯ã©ã¹BookingRequest ... private void validateDate(Notification note) { if (date == null) throw new IllegalArgumentException("date is missing"); LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { note.addError("Invalid format for date", e); return; } if (parsedDate.isBefore(LocalDate.now())) note.addError("date cannot be before today");
ãã§ã«éžæããã¡ãœããã«ããã®ã§ãreturnã³ãã³ãã䜿çšããŠæ®ãã®æ€èšŒãç°¡åã«åãæ¶ãããšãã§ããŸãã
æåŸã®å€æŽã¯éåžžã«ç°¡åã§ãã
ã¯ã©ã¹BookingRequest ... private void validateDate(Notification note) { if (date == null) { note.addError("date is missing"); return; } LocalDate parsedDate; try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { note.addError("Invalid format for date", e); return; } if (parsedDate.isBefore(LocalDate.now())) note.addError("date cannot be before today"); }
ã¹ã¿ãã¯ã¢ããæ°ããã¡ãœãããäœæãããã®ã§ã次ã®ã¿ã¹ã¯ã¯ãå
ã®æ€èšŒã¡ãœãããåŒã³åºã人ã確èªãããããã®èŠçŽ ãå°æ¥æ°ããæ€èšŒã¡ãœããã䜿çšããããã«èª¿æŽããããšã§ãã ããã§ã¯ããã®ãããªæ§é ãã¢ããªã±ãŒã·ã§ã³ã®äžè¬çãªããžãã¯ã«ã©ã®ããã«é©åããããããåºãã³ã³ããã¹ãã§æ€èšããå¿
èŠãããããããã®åé¡ã¯ããã§æ€èšãããªãã¡ã¯ã¿ãªã³ã°ã®ç¯å²ãè¶
ããŠããŸãã ããããäžæçãªç®æšã¯ãæ€èšŒã倱æããå¯èœæ§ããããã¹ãŠã®å Žåã«åºãé©çšãããŠããäŸå€ã®äœ¿çšãåãé€ãããšã§ãã
å€ãã®å Žåãããã«ããæ€èšŒã¡ãœãããå®å
šã«åãé€ãããšãã§ããŸããæ€èšŒã¡ãœããã§åäœããããã«ãããã«é¢é£ãããã¹ãŠã®ãã¹ããæžãæããå¿
èŠããããŸãã ããã«ãéç¥ã®ãšã©ãŒãæ£ããèç©ãããŠããããšã確èªããããã«ããã¹ãã®ä¿®æ£ãå¿
èŠã«ãªãå ŽåããããŸãã
ãã¬ãŒã ã¯ãŒã¯å€ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãéç¥ãã¿ãŒã³ã䜿çšããŠæ€èšŒããæ©èœãæäŸããŸãã Javaã§ã¯ã
Java Bean Validationãš
Spring Validationã§ãã ãããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãæ€èšŒãéå§ããéç¥ã䜿çšããŠãšã©ãŒãåéããäžçš®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãšããŠæ©èœããŸãïŒ
Set Errors
Spring).
, , . , .
Set Errors
Spring).
, , . , .