ããŒã¿ãæ€èšŒããå Žåãéåžžãæ€èšŒãšã©ãŒãå ±åããããã«äŸå€ã䜿çšããªãã§ãã ããã ããã§ã¯ããéç¥ããã¿ãŒã³ã䜿çšããŠãã®ãããªã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããæ¹æ³ã説æããŸãã
![](https://habrastorage.org/files/4b8/ca6/efd/4b8ca6efdcc848d3892d9c096a9bd3e8.png)
æè¿ãçä¿¡JSONã¡ãã»ãŒãžã®åºæ¬çãªæ€èšŒãè¡ãã³ãŒããèŠãŸããã ãããªæãã§......
public void heck() { if (Date == null) throw new ArgumentNullException(" "); DateTime parsedDate; try { parsedDate = DateTime.Parse(Date); } catch (FormatException e) { throw new ArgumentException(" ", e); } if (parsedDate < DateTime.Now) throw new ArgumentException(" "); if (NumberOfSeats == null) throw new ArgumentException(" "); if (NumberOfSeats < 1) throw new ArgumentException(" "); }
ããã¯ãæ€èšŒãå®è£ ããããã®äžè¬çãªã¢ãããŒãã§ãã äžéšã®ããŒã¿ã«å¯ŸããŠäžé£ã®ãã§ãã¯ãéå§ãããŸãïŒäžèšã®äŸã§ã¯ã2ã€ã®ãã©ã¡ãŒã¿ãŒãæ€èšŒãããŸãïŒã ãã§ãã¯ã«å€±æãããšããšã©ãŒã¡ãã»ãŒãžãšãšãã«äŸå€ãã¹ããŒãããŸãã
ãã®ã¢ãããŒãã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã ãŸãããã®æ¹æ³ã§äŸå€ã䜿çšããªãã§ãã ããã äŸå€ã¯ãäœããäºæ³ãããåäœã³ãŒããè¶ ããããšã瀺ããŸãã ãã ããå ¥åãã©ã¡ãŒã¿ãŒã®ãã§ãã¯ãè¡ãå Žåãããã¯ãšã©ãŒã¡ãã»ãŒãžãäºæããŠããããã§ãããšã©ãŒãäºæãããåäœã§ããå ŽåãäŸå€ã䜿çšããªãã§ãã ããã
ãšã©ãŒãäºæãããåäœã§ããå ŽåãäŸå€ã䜿çšããªãã§ãã ãã
ãã®ã³ãŒãã®2çªç®ã®åé¡ã¯ãæåã®ãšã©ãŒãæ€åºããããšã¯ã©ãã·ã¥ããããšã§ãããéåžžã¯ãæåã®ãšã©ãŒã ãã§ãªããçä¿¡ããŒã¿ã§ãã¹ãŠã®ãšã©ãŒãéç¥ããæ¹ãé©åã§ãã ãã®å Žåãã¯ã©ã€ã¢ã³ãã¯ãã¹ãŠã®ãšã©ãŒããŠãŒã¶ãŒã«è¡šç€ºããããšãéžæã§ããããããŠãŒã¶ãŒã¯1ã€ã®æ¹æ³ã§ãšã©ãŒãä¿®æ£ã§ããŸãã ããã¯ãã³ã³ãã¥ãŒã¿ãŒã§æµ·æŠãããŠãããšããå°è±¡ããŠãŒã¶ãŒã«äžãããããåªããŠããŸãã
äžèšã®ãããªå Žåã¯ããéç¥ããã¿ãŒã³ã䜿çšããããšããå§ãããŸãã éç¥ã¯ããšã©ãŒãåéãããªããžã§ã¯ãã§ãã åæ€èšŒãšã©ãŒã¯ãéç¥ã«ãšã©ãŒãè¿œå ããŸãã æ€èšŒãªããžã§ã¯ãã¯ãæ å ±ãåä¿¡ããããã«çµ±åã§ããéç¥ãè¿ããŸãã ç°¡åãªäœ¿çšäŸã¯æ¬¡ã®ãšããã§ãã
private void ValidateNumberOfSeats(Notification note) { if (numberOfSeats < 1) note.addError(" "); // , }
次ã«ãNotification.hasErrorsïŒïŒã¡ãœãããåŒã³åºããŠãšã©ãŒã«å¿çããã ãã§ãã ä»ã®éç¥æ¹æ³ã§ã¯ããšã©ãŒã®è©³çŽ°ãæäŸãããå ŽåããããŸãã
if (numberOfSeats < 1) note.addError(" "); return note;
ãã®ãªãã¡ã¯ã¿ãªã³ã°ã䜿çšããå Žå
ç§ã¯ããªãã®ã³ãŒãã§äŸå€ã®äœ¿çšãé¿ããããšãæ¯æããŠããªãããšã«æ³šæãã¹ãã§ãã äŸå€ã¯ãäºæããªãç¶æ³ãåŠçããããžãã¯ã®ã¡ã€ã³ãããŒããåé¢ããããã®éåžžã«äŸ¿å©ãªææ³ã§ãã ãã®ãªãã¡ã¯ã¿ãªã³ã°ã¯ãäŸå€ãšããŠã®åºåä¿¡å·ãäŸå€çãªç¶æ³ã§ã¯ãªããããã¡ã€ã³ããã°ã©ã ããžãã¯ã§åŠçããå¿ èŠãããå Žåã«æå³ããããŸãã äžèšã®ã³ãŒãã¯ããã®ãããªç¶æ³ã®äžè¬çãªäŸã§ãã
äŸå€ã䜿çšããããã®é©åãªã«ãŒã«ã¯ããPragmatic Programmersããšããæ¬ã«ãããŸãã
ããã°ã©ã ã®éåžžã®ãããŒã®äžéšãšããŠäŸå€ã䜿çšããããšã¯ãã£ãã«ãªããšèããŠããŸããäŸå€ã¯ãäºæããªãç¶æ³ã®ããã«äºçŽããå¿ èŠããããŸãã æªåŠçã®äŸå€ã«ãã£ãŠããã°ã©ã ãçµäºããããã¹ãŠã®äŸå€ãã³ãã©ãŒãåé€ããŠããã®ã³ãŒãã¯æ©èœããŸããïŒããšèªåããŸããçãããããããã®å ŽåãäŸå€ã¯éåžžã®ããã°ã©ã ãããŒã®äžéšãšããŠäœ¿çšãããŠããŸãã
-ãã€ãã»ããŒãã¹ãšã¢ã³ãã£ã»ãã³ã
ããããå°ãåºãããéèŠãªçµè«ã¯ãç¹å®ã®ã¿ã¹ã¯ã«äŸå€ãé©çšãããã©ããã¯ãã³ã³ããã¹ãã«äŸåããŸãã ååšããªããã¡ã€ã«ã®èªã¿åãã¯ãäŸå€ã§ããå Žåãšããã§ãªãå ŽåããããŸãã ããšãã°ãUnixã®/ etc / hostsãªã©ãããç¥ãããæ¹æ³ã§ãã¡ã€ã«ãèªã¿åãããšãããšããã¡ã€ã«ãããã«ãããšæ³å®ã§ãããããäŸå€ãã¹ããŒããããšã¯çã«ããªã£ãŠããŸãã äžæ¹ãã³ãã³ãã©ã€ã³ãä»ããŠãŠãŒã¶ãŒãæäŸãããã¹ã«æ²¿ã£ãŠãã¡ã€ã«ãèªã¿åãå Žåãããããããã«ãã¡ã€ã«ããªãããšãäºæããæ¬è³ªçã«éæä»çãšã©ãŒãšå¯Ÿè©±ããããã«å¥ã®ã¡ã«ããºã ã䜿çšããå¿ èŠããããŸãã
æ€èšŒãšã©ãŒã®äŸå€ã®äœ¿çšãé©åãªå ŽåããããŸãã ãããã¯ãåŠçäžã«æ€èšŒã«åæ ŒããããŒã¿ãååšããç¶æ³ã§ãããä¿è·ã®ããã«æ€èšŒãå床å®è¡ããå¿ èŠããããŸã
ç¡å¹ãªããŒã¿ãããæããããšãå¯èœã«ãããœãããŠã§ã¢ãšã©ãŒããèªåèªèº«ãå®ãã
ãã®èšäºã§ã¯ãçã®å ¥åæ€èšŒã®ã³ã³ããã¹ãã§ãäŸå€ãéç¥ã«çœ®ãæããããšã«ã€ããŠèª¬æããŸãã ãŸãããã®ææ³ã¯ãäŸå€ãã¹ããŒãããããéç¥ã®ã»ããé©ããŠããä»ã®ç¶æ³ã§ã圹ç«ã¡ãŸãããæãäžè¬çã§ãããããæ€èšŒã±ãŒã¹ã«çŠç¹ãåãããŸãã
åºçºç¹
ãããŸã§ã®ãšãããããžãã¹ããžãã¯ã«ã€ããŠã¯è§ŠããŠããŸãããã³ãŒãã®äžè¬çãªåœ¢åŒã«éäžããããšãéèŠã ã£ãããã§ãã ããããããã«è°è«ããããã«ãããžãã¹ããžãã¯ã«é¢ããæ å ±ãååŸããå¿ èŠããããŸãã ãã®å Žåãäžéšã®ã³ãŒãã¯ãåå Žã®åº§åžãäºçŽãããŠããJSONã¡ãã»ãŒãžãåä¿¡ããŸãã ã³ãŒãã¯ãJSON.NETã©ã€ãã©ãªã䜿çšããŠJSONããååŸããBookingRequestã¯ã©ã¹ã«ãããŸãã
JsonConvert.DeserializeObject<BookingRequest>(json);
BookingRequestã¯ã©ã¹ã«ã¯ãããã§æ€èšŒãã2ã€ã®èŠçŽ ã®ã¿ãå«ãŸããŠããŸããããã©ãŒãã³ã¹ã®æ¥ä»ãšãªã¯ãšã¹ãããã座åžæ°ã§ãã
class BookingRequest { public int? NumberOfSeats { get; set; } public string Date { get; set; } }
æ€èšŒã¯ãã§ã«äžã«ç€ºãããŠããŸãã
public void heck() { if (Date == null) throw new ArgumentNullException(" "); DateTime parsedDate; try { parsedDate = DateTime.Parse(Date); } catch (FormatException e) { throw new ArgumentException(" ", e); } if (parsedDate < DateTime.Now) throw new ArgumentException(" "); if (NumberOfSeats == null) throw new ArgumentException(" "); if (NumberOfSeats < 1) throw new ArgumentException(" "); }
éç¥ãäœæ
éç¥ã䜿çšããã«ã¯ãNotificationãªããžã§ã¯ããäœæããå¿ èŠããããŸãã éç¥ã¯éåžžã«åçŽãªå Žåããããå Žåã«ãã£ãŠã¯åãªããªã¹ãã§ãã
var notification = new List<string>(); if (NumberOfSeats < 5) notification.add(" 5"); // // ⊠if (notification.Any()) //
äžèšã®å®è£ ã§ã¯ãã¿ãŒã³ã䜿çšããããšãã§ããŸãããããå°ãå®è¡ããŠã代ããã«åçŽãªã¯ã©ã¹ãäœæããããšããå§ãããŸãã
public class Notification { private List<String> errors = new List<string>(); public void AddError(string message) { errors.Add(message); } public bool HasErrors { get { return errors.Any(); } } }
ç¹å¥ãªã¯ã©ã¹ã䜿çšããŠãæå³ãããæ確ã«ããŸããèªè ã¯ãã¢ã€ãã¢ãšãã®å®è£ ã®éã«ã¡ã³ã¿ã«ããããäœæããå¿ èŠã¯ãããŸããã
Checkã¡ãœãããåé¢ãã
æåã®æé ã¯ãCheckã¡ãœããã2ã€ã®éšåã«åå²ããããšã§ããå åŽã®éšåã¯éç¥ã®ã¿ãåŠçããäŸå€ã¯ã¹ããŒããŸãããå€åŽã®éšåã¯ããšã©ãŒãæ€åºãããå Žåã«äŸå€ãã¹ããŒããCheckã¡ãœããã®çŸåšã®åäœãä¿åããŸã
ãã¡ãœããã®éžæãã¡ãœããã䜿çšããŠãChecké¢æ°ã®æ¬äœãValidationé¢æ°ã«ç§»åããŸãã
public void heck() { Validation(); } public void Validation() { if (Date == null) throw new ArgumentNullException(" "); DateTime parsedDate; try { parsedDate = DateTime.Parse(Date); } catch (FormatException e) { throw new ArgumentException(" ", e); } if (parsedDate < DateTime.Now) throw new ArgumentException(" "); if (NumberOfSeats == null) throw new ArgumentException(" "); if (NumberOfSeats < 1) throw new ArgumentException(" "); }
次ã«ãNotificationã®äœæãšé¢æ°ããã®æ»ãå€ã䜿çšããŠValidationã¡ãœãããæ¡åŒµããŸãã
public Notification Validation() { var notification = new Notification(); //... return notification; }
ããã§ãéç¥ã確èªãããšã©ãŒãå«ãŸããŠããå Žåã¯äŸå€ãã¹ããŒã§ããŸãã
public void heck() { var notification = Validation(); if (notification.HasErrors) throw new ArgumentException(notification.ErrorMessage); }
å°æ¥ãã»ãšãã©ã®ãŠãŒã¶ãŒãCheckããããã®ã¡ãœããã®äœ¿çšã奜ãããšãäºæ³ããããããValidationã¡ãœããããªãŒãã³ã«ããŸããã
ãããŸã§ã®ãšãããã³ãŒãã®åäœããŸã£ããå€æŽããŠããªãããã倱æããæ€èšŒãã§ãã¯ã¯ãã¹ãŠäŸå€ãã¹ããŒãç¶ããŸãããäŸå€ã¹ããŒãéç¥ã«çœ®ãæãå§ããããã®ããŒã¹ãäœæããŸããã
å ã®ã¡ãœãããåé¢ããããšã§ãæ€èšŒããã®çµæã«å¯Ÿããåå¿ããåé¢ããããšãã§ããŸããã
ç¶è¡ããåã«ããšã©ãŒã¡ãã»ãŒãžã«ã€ããŠããã€ã説æããå¿ èŠããããŸãã ãªãã¡ã¯ã¿ãªã³ã°ãè¡ããšãã芳å¯ãããåäœã®å€åãé¿ããããšãéèŠã§ãã ãã®ã«ãŒã«ã¯ãã©ã®ãããªåäœã芳å¯å¯èœããšããåé¡ã«ã€ãªãããŸãã æããã«ãäŸå€ãã¹ããŒããããšã¯å€éšããã°ã©ã ã芳å¯ãããã®ã§ããããšã©ãŒã¡ãã»ãŒãžãã©ã®çšåºŠæ°ã«ããŸããïŒ éç¥ã¯å€ãã®ãšã©ãŒã¡ãã»ãŒãžãåéããããšãã°ãã®æ¹æ³ã§1ã€ã«çµåããŸãã
public string ErrorMessage { get { return string.Join(", ", errors); } }
ãã ããããã°ã©ã ã®äžäœå±€ã§åé¡ãçºçããå¯èœæ§ããããæåã®ãšã©ãŒã®ã¿ãåä¿¡ããããšã«äŸåããŠããŸãã ãã®å Žåã次ã®ããã«å®è£ ããå¿ èŠããããŸãã
public string ErrorMessage { get { return errors[0]; } }
åŒã³åºãããé¢æ°ã ãã§ãªããæ¢åã®ãã³ãã©ãŒã調ã¹ãŠãç¹å®ã®ç¶æ³ã§ã®æ£ããåäœãå€æããå¿ èŠããããŸãã
çªå·æ€èšŒ
è¡ãã¹ãæãããªããšã¯ãæåã®ãã§ãã¯ã眮ãæããããšã§ãã
public Notification Validation() { var notification = new Notification(); if (Date == null) notification.AddError(" "); //... }
æãããªçœ®ãæãã§ãããã³ãŒããå£ããŠããŸãã®ã§æªãã§ãã Dateã®åŒæ°ãšããŠnullãæž¡ããšãNotificationãªããžã§ã¯ãã«ãšã©ãŒãè¿œå ãããã³ãŒãã®å®è¡ãç¶è¡ããã解ææã«DateTime.Parseã¡ãœããã§NullReferenceExceptionãååŸãããŸãã ããã¯ç§ãã¡ãåŸãããã®ã§ã¯ãããŸããã
ãã®å Žåãèªæã§ã¯ãªããããå¹æçãªæ¹æ³ã¯ãã¡ãœããã®æåŸããå®è¡ããããšã§ãã
public Notification Validation() { //... if (NumberOfSeats < 1) notification.AddError(" "); }
次ã®ãã§ãã¯ã¯nullãã§ãã¯ãªã®ã§ãæ¡ä»¶ãè¿œå ããŠNullReferenceExceptionãåé¿ããå¿ èŠããããŸã
public Notification Validation() { //... if (NumberOfSeats == null) notification.AddError(" "); else if (NumberOfSeats < 1) notification.AddError(" "); }
ã芧ã®ãšããã次ã®ãã§ãã¯ã«ã¯å¥ã®ãã£ãŒã«ããå«ãŸããŠããŸãã ãŸãããããã®ãã§ãã¯ã¯å¥ã®ãã£ãŒã«ãã®ãã§ãã¯ã§ãèæ ®ããå¿ èŠããããŸãã æ€èšŒæ¹æ³ã¯è€éã«ãªããããŠããŸãã ãããã£ãŠãå¥ã®ã¡ãœããã§NumberOfSeatsãã§ãã¯ãåé€ããŸãã
public Notification Validation() { //... ValidateNumberOfSeats(notification); } private void ValidateNumberOfSeats(Notification notification) { if (NumberOfSeats == null) notification.AddError(" "); else if (NumberOfSeats < 1) notification.AddError(" "); }
æ°åã®åŒ·èª¿è¡šç€ºãããæ€èšŒãèŠããšãããŸãèªç¶ã«èŠããŸããã æ€èšŒã«if-then-elseãããã¯ã䜿çšãããšãã³ãŒããé床ã«ãã¹ãããããããªããŸãã ããã«é²ãããšãã§ããªãå Žåã«å£ããç·åœ¢ã³ãŒãã䜿çšããããšã¯ãã奜ãŸãããããã¯ã»ãã¥ãªãã£æ¡ä»¶ã䜿çšããŠå®è£ ã§ããŸãã
private void ValidateNumberOfSeats(Notification notification) { if (NumberOfSeats == null) { notification.AddError(" "); return; } if (NumberOfSeats < 1) notification.AddError(" "); }
ã¡ãœããã®æåŸããã³ãŒããæ©èœããããŸãŸã«ãããšãã決å®ã¯ããªãã¡ã¯ã¿ãªã³ã°ã®åºæ¬ååã瀺ããŠããŸãã ãªãã¡ã¯ã¿ãªã³ã°ã¯ãäžé£ã®åäœãç¶æããå€æã«ãã£ãŠã³ãŒããåæ§ç¯ããããã®ç¹å¥ãªææ³ã§ãã ãããã£ãŠããªãã¡ã¯ã¿ãªã³ã°ãããšãã¯ãåžžã«åäœãç¶æããæå°ã®æé ãå®è¡ããããã«ããŠãã ããã ããã«ããããšã©ãŒã®å¯èœæ§ãäœããªããŸãã
æ¥ä»æ€èšŒ
æ¥ä»ã®ãã§ãã¯ãå¥ã®æ¹æ³ã§ä¿åããããšããå§ããŸãã
public Notification Validation() { ValidateDate(notification); ValidateNumberOfSeats(notification); }
次ã«ãæ°å€ã®å Žåãšåæ§ã«ãã¡ãœããã®æåŸããäŸå€ã®çœ®ãæããéå§ããŸãã
private void ValidateNumberOfSeats(Notification notification) { //... if (parsedDate < DateTime.Now) notification.AddError(" "); }
ã¹ããŒãããäŸå€ã«ã¯å ã®äŸå€ãå«ãŸããŠããããã次ã®ã¹ãããã§ã¯äŸå€ããã£ããããã®ãå°ãé£ãããªããŸãã ãããåŠçããã«ã¯ãNotificationã¯ã©ã¹ãå€æŽããŠäŸå€ãåãå ¥ããå¿ èŠããããŸãã
Exceptionãã©ã¡ãŒã¿ãŒãAddErrorã¡ãœããã«è¿œå ããæ¢å®å€ã®nullãæå®ããŸãã
public void AddError(string message, Exception exc = null) { errors.Add(message); }
ã€ãŸããäŸå€ãåãå ¥ããŸãããç¡èŠããŸãã ã©ããã«é 眮ããã«ã¯ãNotificationã¯ã©ã¹å ã®ãšã©ãŒã®çš®é¡ãæååããããè€éãªãªããžã§ã¯ãã«å€æŽããå¿ èŠããããŸãã Notificationå ã«Errorã¯ã©ã¹ãäœæããŸãã
private class Error { public string Message { get; set; } public Exception Exception { get; set; } public Error(string message, Exception exception) { Message = message; Exception = exception; } }
ããã§ã¯ã©ã¹ãã§ããã®ã§ãããã䜿çšããããã«Notificationãå€æŽããå¿ èŠããããŸãã
//... private List<Error> errors = new List<Error>(); public void AddError(string message) { errors.Add(new Error(message, null)); } public void AddError(string message, Exception exception = null) { errors.Add(new Error(message, exception)); } //... public string ErrorMessage { get { return string.Join(", ", errors.Select(e => e.Message)); } }
æ°ããéç¥ãçšæãããããäºçŽãªã¯ãšã¹ããå€æŽã§ããããã«ãªããŸããã
private void ValidateDate(Notification notification) { if (Date == null) throw new ArgumentNullException(" "); DateTime parsedDate; try { parsedDate = DateTime.Parse(Date); } catch (FormatException e) { notification.AddError(" ", e); return; } if (parsedDate < DateTime.Now) notification.AddError(" "); }
æåŸã®å€æŽã¯éåžžã«ç°¡åã§ãã
private void ValidateDate(Notification notification) { if (Date == null) notification.AddError(" "); DateTime parsedDate; try { parsedDate = DateTime.Parse(Date); } catch (FormatException e) { notification.AddError(" ", e); return; } if (parsedDate < DateTime.Now) notification.AddError(" "); }
ãããã«
éç¥ã¡ã«ããºã ã䜿çšããŠã¡ãœãããå€æãããã次ã®ã¿ã¹ã¯ã¯ãCheckã¡ãœãããåŒã³åºãããå Žæã確èªãã代ããã«Validateã䜿çšããå¯èœæ§ãæ€èšããããšã§ãã ãããè¡ãã«ã¯ãæ€èšŒãã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®å®è£ ã«ã©ã®ããã«é©åããããåæããå¿ èŠããããŸã;ããã¯ãããã§èª¬æãããªãã¡ã¯ã¿ãªã³ã°ã®ç¯å²ãè¶ ããŠããŸãã ããããäžæçã«ã¯ãæ€èšŒãšã©ãŒãäºæ³ãããç¶æ³ã§äŸå€ã®äœ¿çšãé€å€ãããšããç®æšããããŸãã
å€ãã®å Žåãããã«ããCheckã¡ãœãããå®å šã«åé€ãããŸãã ãã®å Žåããã®ã¡ãœããã®ãã¹ãã¯ãæ€èšŒã¡ãœããã䜿çšããŠæŽæ°ããå¿ èŠããããŸãã ãŸããéç¥ãéããŠè€æ°ã®ãšã©ãŒã®æ£ããã³ã¬ã¯ã·ã§ã³ãæ€èšŒãããã¹ããè¿œå ããããšãã§ããŸãã