# Refactoring durchführen



## papa (8. Feb 2014)

Hallo,

ich muss im folgenden Code ein Refactoring durchführen, allerdings weiß ich nicht, wie und welches Refactoring ich hier anwenden muss.

Über eure Hilfe würde ich mich sehr freuen.


```
public static int erstelleEinzigartigesAktenzeichen(GregorianCalendar date, int zahl) {
	int aktenzeichen = 0;
	aktenzeichen = date.get(GregorianCalendar.DAY_OF_MONTH);
	aktenzeichen = aktenzeichen * 100;
	aktenzeichen = aktenzeichen + date.get(GregorianCalendar.MONTH);
	aktenzeichen = aktenzeichen * 100;
	aktenzeichen = aktenzeichen + date.get(GregorianCalendar.YEAR);
	aktenzeichen = aktenzeichen * 100;
	aktenzeichen = aktenzeichen + (date.get(GregorianCalendar.HOUR_OF_DAY) * zahl);
	return aktenzeichen;
}
```


----------



## turtle (8. Feb 2014)

Ich gebe zu deinen Code nicht zu verstehen

Alleine deswegen solltest du wirklich klarer formulieren, was das alles soll.

Ich VERMUTE, das du ein eindeutiges Aktenzeichen zu einem Datum erzeugen möchtest. Das würde ich so machen. 

```
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
		String format = sdf.format(date.getTime()) + "_" + zahl;
		System.out.println(format);
```


----------



## papa (8. Feb 2014)

Das Ziel ist es einfach eine Zahl (=Aktenzeichen) zu generieren, die kein zweites Mal generiert werden kann. Allerdiengs kann man hier nur eine Zahl pro Stunde generiert werden, da die Zahl sonst gleich wäre.
Ich hoffe der Code ist jetzt verständlich.
An diesem Code muss ich jetzt ein Refactoringverfahren anwenden. Aber ich weiß nicht wie und welches Verfahren ist anwenden muss. Außerdem ist der Code eigentlich nicht digital gegeben, sondern auf Papier. Die Lösung muss von Hand geschrieben werden (es sollte also eigentlich nicht allzu schwer sein).
Die genaue Aufgabenstellung ist: Führen Sie ein Refactoring durch.


```
public static int erstelleEinzigartigesAktenzeichen(GregorianCalendar date, int zahl) {
    int aktenzeichen = 0;

    // Nimmt den aktuellen Tag des Monats. Heute ist der 8. des Monats, also aktenzeichen = 8
    // anschließend wird die Zahl mit 100 multipliziert, also aktenzeichen = 800
    aktenzeichen = date.get(GregorianCalendar.DAY_OF_MONTH);
    aktenzeichen = aktenzeichen * 100;

    // Nimmt den aktuellen Monat. Fängt bei 0 an zu zählen, also befinden wir uns im 1. Monat
    // Dies wird auf aktenzeichen dazuaddiert, und anschließend mit 100 multipliziert.
    // nach diesem Abschnitt: aktenzeichen = 80100
    aktenzeichen = aktenzeichen + date.get(GregorianCalendar.MONTH);
    aktenzeichen = aktenzeichen * 100;

    // Nimmt das aktuelle Jahr, addiert es auf aktenzeichen und multipliziert es anschließend mit 100.
    // nach diesem Abschnitt: aktenzeichen = 8211400
    aktenzeichen = aktenzeichen + date.get(GregorianCalendar.YEAR);
    aktenzeichen = aktenzeichen * 100;

    // Nimmt die aktuelle Stunde und multipliziert es mit einem wählbaren Faktor.
    // z.B. zahl = 5. Es ist die 17. Stunde des Tages. 17 * 5 = 85
    // nach diesem Abschnitt: aktenzeichen = 8211485
    aktenzeichen = aktenzeichen + (date.get(GregorianCalendar.HOUR_OF_DAY) * zahl);

    // Gibt aktenzeichen zurück
    return aktenzeichen;

}
```

Ich hoffe meine Formulierung ist jetzt etwas klarer


----------



## turtle (8. Feb 2014)

Dachte ich mir doch.

Entferne doch einfach die Bindestriche aus meinem Beispiel. 

Dies erzeugt ein "Aktenzeichen" auf die Millisekunde genau und sollte eigentlich recht unwahrscheinlich sein, das es doppelt vorkommt.

Wenn das nicht passt, kannst du ja "nur" bis zur Stunde genau ausgeben, oder, oder...


----------



## papa (8. Feb 2014)

Das ist aber nicht die Aufgabe..
Hier muss ein Refactoring durchgeführt werden, d.h. der Code muss verbessert werden ohne das die Funktionalität geändert oder beeinträchtigt wird.
Refactoring wird der Code lesbarer und verständlicher.
Refactoringmethoden sind z.B. "Extract Method", "Replace Method with Method Object", "Split Temporary Variable", Extract Class" und ca. 10 weitere.
Welches Refactoringverfahren muss ich anwenden und wie sieht der Code, nachdem das Verfahren angewand wurde aus?
Vielen Dank im Voraus


----------



## JavaMeister (8. Feb 2014)

Mach doch einfach alle.


----------



## turtle (9. Feb 2014)

> der Code muss verbessert werden ohne das die Funktionalität geändert oder beeinträchtigt wird


Eben


----------



## KSG9|sebastian (9. Feb 2014)

Schau doch mal den Code genau an...immer dasselbe Muster

zahl + Feld aus Kalender
zahl * 100
zahl + Feld aus Kalender
zahl * 100
zahl + Feld aus Kalender
zahl * 100

Wie wärs denn als Denkanstoß mit sowas? Und da springen einem noch das ein oder andere weitere "Ding" ins Auge...


```
int extractAndMultiply(int number, GregorianCalender calender, int...fields){
   for(int field : fields) {
      zahl = (zahl + calendar.get(field)) * 100;
   }
   return number;
}
```


----------

