Java 拆分临时变量重构示例

Java 拆分临时变量重构示例,java,variables,split,refactoring,temporary,Java,Variables,Split,Refactoring,Temporary,我正在准备考试,在前一年的实际考试中,我偶然发现了一个奇怪的问题: 对这段代码执行拆分临时变量重构: public int createUniqueCasenumber (GregorianCalendar date, int departmentID) { int temp = 0; temp = date.get(GregorianCalendar.DAY_OF_MONTH); temp = temp * 100; temp = temp

我正在准备考试,在前一年的实际考试中,我偶然发现了一个奇怪的问题: 对这段代码执行拆分临时变量重构:

 public int createUniqueCasenumber (GregorianCalendar date, int departmentID) {
      int temp = 0;

      temp = date.get(GregorianCalendar.DAY_OF_MONTH);
      temp = temp * 100;

      temp = temp + date.get(GregorianCalendar.MONTH);
      temp = temp * 100;

      temp = temp + date.get(GregorianCalendar.YEAR);
      temp = temp * 100;

      temp = temp + (date.get(GregorianCalendar.HOUR_OF_DAY) * departmentID);

      return temp;
  }
现在,我将拆分临时变量重构理解为一种情况,即临时变量用于不同的目的,我们只需将其“重命名”为两个不同的有意义的名称。 但在这种情况下,我真的无法想到智能名称,这个临时变量的函数与循环收集变量非常相似

唯一与所需重构非常接近的是:

 public int createUniqueCasenumber (GregorianCalendar date, int departmentID) {
      int result= 0;

      int firstStep = 100 * date.get(GregorianCalendar.DAY_OF_MONTH);

      int secondStep = 100 * (firstStep + date.get(GregorianCalendar.MONTH));

      int thirdStep = 100 * (secondStep + date.get(GregorianCalendar.YEAR));

      result = thirdStep + (date.get(GregorianCalendar.HOUR_OF_DAY) * departmentID);

      return result;
  }
但你为什么要“在现实生活中”这样做呢?还是我看不出有什么深刻的意义? 有什么想法吗


提前感谢:)

您的重构不正确;每个
-步骤
变量不依赖于任何其他变量(请注意,从
日期开始分配给
临时
。get
的每个赋值都会覆盖之前的赋值)。这也清楚地表明,除了最后一个赋值和所有乘以100的乘法外,所有赋值都是无用的


此重构清楚地表明,这些值是独立的,可以按任何顺序分配(如果允许的话,甚至可以并行分配)。

您可以分两步重构此代码

如果你仔细观察,你可能会注意到,那一天乘以100三次,一个月两次,一年一次

因此,您可以通过以下方式重写代码:

public int createUniqueCasenumber(GregorianCalendar date, int departmentID) {
    int temp = date.get(GregorianCalendar.DAY_OF_MONTH) * 100 * 100 * 100;

    temp += date.get(GregorianCalendar.MONTH) * 100 * 100;

    temp += date.get(GregorianCalendar.YEAR) * 100;

    temp += date.get(GregorianCalendar.HOUR_OF_DAY) * departmentID;

    return temp;
}
之后,拆分温度变量就容易多了:

public int createUniqueCasenumber(GregorianCalendar date, int departmentID) {
    int magnifiedDay = date.get(GregorianCalendar.DAY_OF_MONTH) * 100 * 100 * 100;

    int magnifiedMonth = date.get(GregorianCalendar.MONTH) * 100 * 100;

    int magnifiedYear = date.get(GregorianCalendar.YEAR) * 100;

    int magnifiedHour = date.get(GregorianCalendar.HOUR_OF_DAY) * departmentID;

    return magnifiedDay + magnifiedMonth + magnifiedYear + magnifiedHour;
}

对不起,我在重新输入方法时犯了一个错误。每一步都依赖于前一步。见更正。所以问题仍然是,考官们期望的是什么。