Best Practice Code Refaktorisierung

Prafy

Mitglied
Hallo allerseits,
ich habe letztens ein paar Videos zum Thema Refaktorisierung gesehen. Und da habe ich festgestellt, dass das mein Code teilweise dringend nötig hätte. Daraufhin habe ich mein aktuelles Projekt überarbeitet, aber an einer Stelle habe ich keine Ahnung, wie ich das refaktorisieren könnte.
Code:
private Day[] createWeek(Day day)
    {
        DayOfWeek dayName = DayOfWeek.MONDAY;
        week = new Day[7];
        switch(day.getDay())
        {
        case MONDAY:
            for(int i = 0; i < 7; i++)
                {
                    week[i] = new Day(dayName.plus(i), (byte) (day.getDayNumber() + i), day.getMonth(), day.getYear());
                }
                week[0].setToday(true);
            break;
        case TUESDAY:
            week[0] = new Day(dayName, (byte) (day.getDayNumber() - 1), day.getMonth(), day.getYear());
            for(int i = 0; i < 6; i++)
            {           
                week[i + 1] = new Day(dayName.plus(i + 1), (byte) (day.getDayNumber() + i), day.getMonth(), day.getYear());
            }
            week[1].setToday(true);
            break;
        case WEDNESDAY:
            week[0] = new Day(dayName.plus(0), (byte) (day.getDayNumber() - 2), day.getMonth(), day.getYear());
            week[1] = new Day(dayName.plus(1), (byte) (day.getDayNumber() - 1), day.getMonth(), day.getYear());
            for(int i = 0; i < 5; i++)
            {           
                week[i + 2] = new Day(dayName.plus(i + 2), (byte) (day.getDayNumber() + i), day.getMonth(), day.getYear());
            }
            week[2].setToday(true);
            break;
        case THURSDAY:
            for(int i = 0, j = 3; i < 3; i++, j--)
            {
                week[i] = new Day(dayName.plus(i), (byte) (day.getDayNumber() - j), day.getMonth(), day.getYear());
            }
            for(int i = 0; i < 4; i++)
            {           
                week[i + 3] = new Day(dayName.plus(i + 3), (byte) (day.getDayNumber() + i), day.getMonth(), day.getYear());
            }
            week[3].setToday(true);
            break;
        case FRIDAY:
            for(int i = 0, j = 4; i < 4; i++, j--)
            {
                week[i] = new Day(dayName.plus(i), (byte) (day.getDayNumber() - j), day.getMonth(), day.getYear());
            }
            for(int i = 0; i < 3; i++)
            {           
                week[i + 4] = new Day(dayName.plus(i + 4), (byte) (day.getDayNumber() + i), day.getMonth(), day.getYear());
            }
            week[4].setToday(true);
            break;
        case SATURDAY:
            for(int i = 0, j = 5; i < 5; i++, j--)
            {
                week[i] = new Day(dayName.plus(i), (byte) (day.getDayNumber() - j), day.getMonth(), day.getYear());
            }
            for(int i = 0; i < 2; i++)
            {           
                week[i + 5] = new Day(dayName.plus(i + 5), (byte) (day.getDayNumber() + i), day.getMonth(), day.getYear());
            }
            week[5].setToday(true);
            break;
        default:
            for(int i = 0, j = 6; i < 7; i++, j--)
            {
                week[i] = new Day(dayName.plus(i), (byte) (day.getDayNumber() - j), day.getMonth(), day.getYear());
            }
            week[6].setToday(true);
            break;
        }
        return week;
    }
Kurze Erklärung zum Code: Die Methode bekommt einen beliebigen Wochentag per Parameter und errechnet dann die Woche drum herum. Wenn also ein Mittwoch der 14. reinkommt, berechnet er also den Dienstag den 13. und Montag den 12. und die darauffolgenden Tage bis Sonntag, sodass das ganze grafisch dann so aussieht:
40a1d42b3c4944f8879c7cbdf8fe2149.png

Hat jemand eine Idee, wie ich das schöner machen, also refaktorisieren kann? Denn besonders wenn ich jetzt auch noch die Erkennung ausbaue, dass vor dem 1. eines Monats nicht der 0. und -1. kommt oder nach dem 31. nicht der 32. folgt, wird das noch verwirrender.
Falls jemand Ideen hat, wäre ich sehr dankbar. :)
Gruß,
Prafy

P.S.: Oder gibt es vielleicht sogar grundlegend andere Vorschläge, weil ich es mir wieder viel zu kompliziert mache? Hinweis: Ja, ich habe extra eine eigene Klasse Day geschrieben, die ich deshalb hier in der Methode auch so gesondert behandeln muss.
 

mrBrown

Super-Moderator
Mitarbeiter
Ganz simple:
Der erste Tag der Woche ist der aktuelle Tag minus den Wochentagssindex (Mi,14 -> 14-2 = 12).
Die 7 Tage dann durchiterieren, starten mit dem ersten Tag und Montag.

Behandeln von Tagen kleiner 1 und größer 28/29/30/31 behandelst du dann entweder im Day-Konstruktor, oder eine extra Methode, die negative Tage/Monate etc zulässt und das passend umrechnet (ich würd letzteres machen)
 

Prafy

Mitglied
Okay, vielen Dank, die Methode sieht nun so aus und funktioniert prächtig. :D
Java:
private Day[] createWeek(Day day)
    {      
        DayOfWeek dayName = DayOfWeek.MONDAY;
        week = new Day[7];
      
        for(int i = 0, j = -(day.getDay().getValue() - 1); i < 7; i++, j++)
        {
            week[i] = new Day(dayName.plus(i), (byte) (day.getDayNumber() + j), day.getMonth(), day.getYear());
        }
        week[day.getDay().getValue()].setToday(true);
        return week;
    }
Manchmal denkt man einfach viel zu umständlich, aber mit ein paar Denkanstößen wie solchen kommt man doch meist gut weiter. :D

LocalDate? Ich habe ein bisschen rumgegooglet und eigentlich nur Foren gesehen, in denen alles mit dem deprecated Date gemacht wurde. Dafür müsste man sich in der Java Bibliothek wohl ein bisschen besser auskennen. :D
Ich schaue mir die Klasse mal an. Aber danke für den Tipp @Thallius
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Manchmal denkt man einfach viel zu umständlich, aber mit ein paar Denkanstößen wie solchen kommt man doch meist gut weiter. :D
Selbst das ginge noch besser, j kann man sich zB sparen, und stattdessen i+day.getDayNumber()+(day.getDay().getValue()+1) rechnen (und den zweiten Teil der Rechnung kann man auch noch in einer Variablen ablegen)


LocalDate? Ich habe ein bisschen rumgegooglet und eigentlich nur Foren gesehen, in denen alles mit dem deprecated Date gemacht wurde. Dafür müsste man sich in der Java Bibliothek wohl ein bisschen besser auskennen. :D
Date solltest du auch besser ignorieren, die neue Date-API ist aber ziemlich gut zu benutzen, mittlerweile sollte man da auch einiges zu finden ;)
 

Prafy

Mitglied
Ihr immer mit euren besseren Lösungen. :D
So, habe jetzt mal alles so einfach gemacht, wie man es hätte machen können und zwar so, wie ihr das vorgeschlagen habt (Also alles auf LocalDate umgeschrieben und die Methode gekürzt). Aber wenn es kompliziert geht, kann man es ja mal versuchen, mache ich meist leider immer als erstes. :D
Der finale Code der Methode sieht so aus:
Code:
private Day[] createWeek(Day day)
    {
        week = new Day[7];
   
        LocalDate date = day.getDate();
   
        for(int i = 0, j = date.getDayOfWeek().getValue() - 1; i < 7; i++, j--)
        {
            week[i] = new Day(date.minusDays(j));
        }
   
        week[date.getDayOfWeek().getValue() - 1].setToday(true);
        CalendarPanel.showYear(date.getYear());
        return week;
    }
@mrBrown Bei dem, was du zuletzt gesagt hattest bin ich nicht ganz durchgestiegen. Trotzdem finde ich, dass das jetzt auch eine schöne Lösung ist, die auf jeden Fall funktioniert. ;) Ich mag das 'j' halt sehr gerne. :D
 

mrBrown

Super-Moderator
Mitarbeiter
So etwa (ist dein alter Code):

Java:
private Day[] createWeek(Day day) {    
        DayOfWeek monday = DayOfWeek.MONDAY;
        week = new Day[7];
     
        int firstDayOfWeek = day.getDayNumber() - (day.getDay().getValue() + 1);

        for(int i = 0; i < 7; i++)
        {
            week[i] = new Day(monday.plus(i),
                 (byte) (firstDayOfWeek + i), day.getMonth(), day.getYear());
        }
        week[day.getDay().getValue()].setToday(true);
        return week;
    }

Java:
CalendarPanel.showYear(date.getYear());

würde ich aus der Funkion rausnehmen, das führt sonst irgendwann zu Fehlern (und macht ua UnitTests schwierig bis unmöglich).
Außerdem siehts nach static aus, was auch eher schlecht wäre...
 

Prafy

Mitglied
Hm ... also mit UnitTests und so habe ich mich noch nie beschäftigt. Ich will immer mein Wissen ein bisschen erweitern (ich will halt einfach ein guter Programmierer werden ^^), komme aber nie über viel mehr als das, was ich eben selber zusammencode, hinaus. Und ein Informatikstudium mache ich ja wahrscheinlich leider auch nicht. :(
Aber das showYear() lässt oben rechts im Kalender noch das Jahr anzeigen, etwa so:
ab7d5ec0546949429d66fb28d6ca4ac8.png

Und all diese Day-Objekte (extends JPanel) sind in einem anderen JPanel vom Typ CalendarPanel eingegliedert. Um nun das Jahr anzuzeigen muss das CalendarPanel eben das Jahr über die Day-JPanels anzeigen. Und da das eigentliche CalendarPanel-Objekt ja nur der JFrame hat, kann ich da entweder nur über das JFrame zugreifen oder direkt in CalendarPanel über static, was ich hier gemacht habe. Ich weiß, dass das irgendwie rein refaktorisierungstechnisch nicht optimal ist, aber da weiß ich auch nicht wirklich, wie ich das anders strukturieren soll, weil das Jahr einfach über das CalendarPanel gehen muss, oder?

Übrigens: Im dem Bild, welches ich beim eröffnen vom Thread oben reingepackt habe, war das Jahr nicht zu sehen, weil es aus irgendeinem Grund von der leicht gelblichen Einfärbung des Tages überdeckt wurde. Das ist auch noch ein Problem, welches ich habe. Das heißt, dass jedes mal, wenn Montag ist, das Jahr durch die Tagesmarkierung überdeckt wird. ^^
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Tipps für Organisation von Code-Reviews nach einem Pull Request. Allgemeine Java-Themen 5
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
schemil053 Methoden Code-Verbesserung Allgemeine Java-Themen 2
D Webarchive (war): Code verschleiern Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
OnDemand Releaseversion Tag in Code Allgemeine Java-Themen 5
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
F Code auslagern Allgemeine Java-Themen 5
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
B Bitte um Code Erklärung Allgemeine Java-Themen 5
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
OnDemand Clean Code oder Allgemeine Java-Themen 5
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
S Code Erklärung Allgemeine Java-Themen 21
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen &#8203; Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
X Was macht folgender Code!? Allgemeine Java-Themen 6
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
Fab1 Best Practice Vorgehensweise bestehenden Code/Programm verschönern Allgemeine Java-Themen 4
M Code optimieren Allgemeine Java-Themen 7
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
J Erzeugung von Java-Code Allgemeine Java-Themen 2
A Source code analyze Allgemeine Java-Themen 8
N VB Code in Java verwenden Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben