代码之家  ›  专栏  ›  技术社区  ›  les2

下面的日期解析例程中有多少问题来自于实际项目?

  •  0
  • les2  · 技术社区  · 16 年前

    在我看来,这些方法愚蠢得可笑,但我想了解一下其他开发人员对这些代码的看法。批评可能包括技术错误和文体错误。更正可以使用任何来自Apache Con Son的任何东西,例如StrugUTLS、DATUTILLS等,以及Java 5中的任何东西。如果这会影响您的风格,那么代码是为Web应用程序设计的。这四种方法都在同一个文件中定义,如果这很重要的话。我有没有提到这个代码也没有单元测试?!你会怎么解决这个问题?我刚刚遇到这个文件,修复这个代码不是我的直接任务。如果愿意的话,我可以在业余时间。

    方法一:

       public static boolean isFromDateBeforeOrSameAsToDate(final String fromDate,
         final String toDate) {
     boolean isFromDateBeforeOrSameAsToDate = false;
     Date fromDt = null;
     Date toDt = null;
     try {
         fromDt = CoreUtils.parseTime(fromDate, CoreConstants.DATE_PARSER);
         toDt = CoreUtils.parseTime(toDate, CoreConstants.DATE_PARSER);
         // if the FROM date is same as the TO date - its OK
         // if the FROM date is before the TO date - its OK
         if (fromDt.before(toDt) || fromDt.equals(toDt)) {
      isFromDateBeforeOrSameAsToDate = true;
    
         }
     } catch (ParseException e) {
         e.printStackTrace();
     }
     return isFromDateBeforeOrSameAsToDate;
        }
    

    方法二:

        public static boolean isDateSameAsToday(final Date date) {
     boolean isSameAsToday = false;
    
     if (date != null) {
         Calendar current = Calendar.getInstance();
         Calendar compare = Calendar.getInstance();
         compare.setTime(date);
    
         if ((current.get(Calendar.DATE) == compare.get(Calendar.DATE))
          && (current.get(Calendar.MONTH) == compare
           .get(Calendar.MONTH))
          && (current.get(Calendar.YEAR) == compare
           .get(Calendar.YEAR))) {
      isSameAsToday = true;
         }
    
     }
     return isSameAsToday;
        }
    

    方法三:

        public static boolean areDatesSame(final String fromDate,
         final String toDate) {
     boolean areDatesSame = false;
     Date fromDt = null;
     Date toDt = null;
     try {
         if (fromDate.length() > 0) {
      fromDt = CoreUtils.parseTime(fromDate,
       CoreConstants.DATE_PARSER);
         }
         if (toDate.length() > 0) {
      toDt = CoreUtils.parseTime(toDate, CoreConstants.DATE_PARSER);
         }
         if (fromDt != null && toDt != null) {
      if (fromDt.equals(toDt)) {
          areDatesSame = true;
      }
         }
    
     } catch (ParseException e) {
         if (logger.isDebugEnabled()) {
      e.printStackTrace();
         }
     }
     return areDatesSame;
        }
    

    方法四:

        public static boolean isDateCurrentOrInThePast(final Date compareDate) {
     boolean isDateCurrentOrInThePast = false;
     if (compareDate != null) {
         Calendar current = Calendar.getInstance();
         Calendar compare = Calendar.getInstance();
         compare.setTime(compareDate);
    
         if (current.get(Calendar.YEAR) > compare.get(Calendar.YEAR)) {
      isDateCurrentOrInThePast = true;
         }
    
         if (current.get(Calendar.YEAR) == compare.get(Calendar.YEAR)) {
      if (current.get(Calendar.MONTH) > compare.get(Calendar.MONTH)) {
          isDateCurrentOrInThePast = true;
      }
    
         }
    
         if (current.get(Calendar.YEAR) == compare.get(Calendar.YEAR)) {
      if (current.get(Calendar.MONTH) == compare.get(Calendar.MONTH)) {
          if (current.get(Calendar.DATE) >= compare
           .get(Calendar.DATE)) {
       isDateCurrentOrInThePast = true;
          }
    
      }
    
         }
    
     }
     return isDateCurrentOrInThePast;
        }
    

    下面是我如何编写相同的东西(首先,我会编写单元测试,但在这里我将跳过它)。

        public static int compareDatesByField(final Date firstDate,
         final Date secondDate, final int field) {
    
     return DateUtils.truncate(firstDate, field).compareTo(
      DateUtils.truncate(secondDate, field));
        }
    
        public static int compareDatesByDate(final Date firstDate,
         final Date secondDate) {
     return compareDatesByField(firstDate, secondDate, Calendar.DATE);
        }
    
    // etc. as required, although I prefer not bloating classes which little
    // methods that add little value ...
    
    // e.g., the following methods are of dubious value, depending on taste
        public static boolean lessThan(int compareToResult) {
     return compareToResut < 0;
        }
        public static boolean equalTo(int compareToResult) {
     return compareToResut == 0;
        }
        public static boolean greaterThan(int compareToResult) {
     return compareToResut > 0;
        }
        public static boolean lessThanOrEqualTo(int compareToResult) {
     return compareToResut <= 0;
        }
        public static boolean greaterThanOrEqualTo(int compareToResult) {
     return compareToResut >= 0;
        }
    
    // time-semantic versions of the dubious methods - perhaps these go in TimeUtils ?
    
    
       public static boolean before(int compareToResult) {
     return compareToResut < 0;
        }
        public static boolean on(int compareToResult) {
     return compareToResut == 0;
        }
        public static boolean after(int compareToResult) {
     return compareToResut > 0;
        }
        public static boolean onOrBefore(int compareToResult) {
     return compareToResut <= 0;
        }
        public static boolean onOrAfter(int compareToResult) {
     return compareToResut >= 0;
        }
    

    然后,客户机可以使用以下方法:

    /* note: Validate library from Apache Commons-Lang throws 
     * IllegalArgumentException when arguments are not valid 
     * (this comment would not accompany actual code since the
     * Javadoc for Validate would explain that for those unfamiliar with it)
     */
     Validate.isTrue(onOrAfter(compareDatesByDate(registrationDate, desiredEventDate),
         "desiredEventDate must be on or after the *day* of registration: ", desiredEventDate);
    
    2 回复  |  直到 16 年前
        1
  •  0
  •   Ben S    16 年前

    第一件事, 固定压痕 . Ctrl键 + 换档 + f 在Eclipse中。

    我不能忍受代码缩进错误。

    下一步, 编写单元测试 所有你接触的方法,在你接触它们之前。

    此外,使用 JodaTime . 它把标准的Java日期类打败了一个血腥的纸浆。很多难看的日期逻辑会通过切换到它来处理。

        2
  •  0
  •   Itay Maman    16 年前

    这里有各种各样的问题。例如:为什么是静态方法?但我的问题是 缺乏单元测试 . 无论我们想在这里应用什么重构,我们都需要测试来确保我们没有破坏任何东西。

    因此,我将从编写单元测试开始。所有其他问题都是次要的。

    推荐文章