Programmverkürzung einer analogen Uhr

Hey,
Ich habe mir ein Programm für eine analoge Uhr geschrieben und dabei die JGUItoolbox verwenet (ist vielleicht jemandem ein Begriff). Jetzt möchte ich mein Programm optimieren und verkürzen. Wäre nett wen jemand mal drüberschaun könnte und Verkürzungsvorschläge liefern könnt.

Java:
public class analog extends Zeichnung
{
public Rechteck hinten=new Rechteck(0,0,641,641);
public Bild Uhr=new Bild(0,0,600,600,"Prag_Uhr.jpg");
public Kreis Hintergrund= new Kreis(0,0,300);
public AusgabePanel Tag=new AusgabePanel("Tag",367,275,50,50);
public AusgabePanel Wochentag=new AusgabePanel("WT",417,275,50,50);
public Linie sekunde= new Linie(600,300,300,300);
public Linie minute= new Linie(600,300,300,300);
public Linie stunde= new Linie(500,300,300,300);
public Kreis Mittelkreis= new Kreis(285,285,15);
public ChkTaste umstellen=new ChkTaste("",290,290,20,20);
public String day;
public int DAY;
double x_s;
double y_s;
double cos_s;
double sin_s;
int x_s_i;
int y_s_i;
double p;
double j2;
double x_m;
double y_m;
double cos_m;
double sin_m;
int x_m_i;
int y_m_i;
double j3;
double j4;
double j5;
double j6;
double j7;
double x_h;
double y_h;
double cos_h;
double sin_h;
int x_h_i;
int y_h_i;
int g;
double gh;
public analog()
{
g=300;
gh=g*0.66;
setSize(645,660);
Hintergrund.setzeFarbe("weiss");
hinten.setzeFarbe("schwarz");
sekunde.setzeFarbe("rot");
minute.setzeFarbe("gruen");
stunde.setzeFarbe("gruen");
stunde.setzeLinienDicke(10);
Hintergrund.unsichtbarMachen();
Tag.setzeHintergrundfarbe("schwarz");
Wochentag.setzeHintergrundfarbe("schwarz");
Tag.setzeSchriftfarbe("weiss");
Wochentag.setzeSchriftfarbe("weiss");
p=java.lang.Math.PI;
Uhr.einpassen();
einsetzen();
}
public void umstellen_weiss()
{
minute.setzeFarbe("schwarz");
stunde.setzeFarbe("schwarz");
Hintergrund.sichtbarMachen();
Uhr.unsichtbarMachen();
einsetzen();
}
public void umstellen_prag()
{
minute.setzeFarbe("gruen");
stunde.setzeFarbe("gruen");
Hintergrund.unsichtbarMachen();
Uhr.sichtbarMachen();
einsetzen();
}
public void einsetzen()
{
while(true)
{
day="";
StaticTools.warte(1000);
minute(StaticTools.jetzt_Minute());
sekunde(StaticTools.jetzt_Sekunde());
stunde(StaticTools.jetzt_Stunde());
Tag(StaticTools.jetzt_Tag());
WT(StaticTools.jetzt_WochenTag());
if(umstellen.istGewaehlt())
{umstellen_weiss();}else
if(!umstellen.istGewaehlt())
{umstellen_prag();}
}
}
public void Tag(int d)
{
day=""+d;
Tag.setzeAusgabetext(day);
}
public void WT(int d)
{
if(d==1)
Wochentag.setzeAusgabetext("SO");
if(d==2)
Wochentag.setzeAusgabetext("MO");
if(d==3)
Wochentag.setzeAusgabetext("DI");
if(d==4)
Wochentag.setzeAusgabetext("MI");
if(d==5)
Wochentag.setzeAusgabetext("DO");
if(d==6)
Wochentag.setzeAusgabetext("FR");
if(d==7)
Wochentag.setzeAusgabetext("SA");
}
public void sekunde(double j)
{
j3=j-15;
j2=(j3/60)*2*p;
sin_s = Math.sin(j2);
cos_s = Math.cos(j2);
y_s=g+cos_s*g;
x_s=g+sin_s*g;
x_s_i=(int)x_s;
y_s_i=(int)y_s;
sekunde.setzeEndpunkte(y_s_i,x_s_i,g,g);
}
public void minute(double j)
{
j5=j-15;
j4=(j5/60)*2*p;
sin_m = Math.sin(j4);
cos_m = Math.cos(j4);
y_m=g+cos_m*g;
x_m=g+sin_m*g;
x_m_i=(int)x_m;
y_m_i=(int)y_m;
minute.setzeEndpunkte(y_m_i,x_m_i,g,g);
}
public void stunde(double j)
{
j7=j-15;
j6=(j7/12)*2*p;
sin_h = Math.sin(j6);
cos_h = Math.cos(j6);
y_h=g+cos_h*gh;
x_h=g+sin_h*gh;
x_h_i=(int)x_h;
}
}

Schon mal vielen Dank im Voraus. 🙂

PS: Mein Ziel wäre unter 100 Zeilen.
 
Zuletzt bearbeitet:
Nunja, du hast dich ja sehr bemüht die Java-Konventionen nicht einzuhalten. Näheres dazu findest du im Internet oder hier im Forum.

Die ganzen Instanzvariablen sind sicherlich auch nicht notwendig.
 
Die JGuiToolbox macht so etwas? Ich kannte sie vorher noch nicht, aber wenn sie so einen Code liefert, braucht man sie nicht. Kurz gesagt, dieser Code lässt sich bestenfalls auf 0 Zeilen kürzen.
Er ist nicht blos wegen der fehlenden Konventionen oder zu vielen Variablen unbrauchbar, sondern vor allem auch wegen der Implementierung mehrerer Klassen, die man eben so gut (bzw. sogar besser) als Methoden schreiben könnte, maw. ohne ständig new zur Ausführung von nur einer Operation verwenden zu müssen.
 
Zuletzt bearbeitet von einem Moderator:
Das zu "kürzen" wäre die falsche Herangehensweise.
Die Richtige ist: löschen und neu machen.
Du hast da 20 Instanzvariablen, die definitiv nicht alle brauchst (zumindest nicht als Instanzvariablen). Außerdem wären da Arrays dann teilweise doch schöner.
 
Leute, nun ist aber mal gut 😉

Um eine AnalogUhr zu bauen, braucht es ja nicht viel. Du benötigst ja nur einen Kreis und 2 Zeiger.
Der Code selbst hat, wie ich schon vorher erwähnte, viele Variablen, die wild definiert sind. Abgesehen von den Code Conventions, die hier einfach über den Haufen geworfen werden, verwendest du hier auch einige Custom-Klassen.

Mal ein Beispiel, wo man anfangen könnte:
Java:
public void minute(double j) 
// Richtige Benennung von Methoden: Was soll "minute" mir sagen? setzteMinute(double j) sagt vielleicht mehr
// Aber da würde mich dann "double j" wundern. Was soll j sein? Sekunden? Warum dann double?
{
  j5=j-15; 
// Variablen Namen sind nichtssagend. Was ist j5 ? Variablen schreibt man generell so, dass der Leser versteht, was 
// die Variable sagen soll
  j4=(j5/60)*2*p;
  sin_m = Math.sin(j4);
// Variablen, sollten keine _ enthalten, sondern camelCase verwenden: diesIstMeineVariableUndSoSollteSieAuchGeschriebenWerden.
  cos_m = Math.cos(j4);
  y_m=g+cos_m*g;
  x_m=g+sin_m*g;
  x_m_i=(int)x_m;
  y_m_i=(int)y_m;
  minute.setzeEndpunkte(y_m_i,x_m_i,g,g);
}
 
Ungefähr ist hier das Wort. Ist zwar nicht das schönste und sauberste Beispiel, aber wohl schöner als das, was du da gepostet hast. Besonders zu beachten: Es ist deutlich übersichtlicher, die Variablen haben (manchmal) bessere Namen und man kann das ganze deutlich kürzer gestalten.
 
Leute, nun ist aber mal gut 😉
Grundsätzlich bin ich deiner Meinung.
Ich hab mich ja eh schon wieder beruhigt.

Aber der opening Post ist eine Zumutung.

Ich hab vollstes Verständnis für jede noch so banale Anfängerfrage.

Ich hab auch hohes Verständnis dafür, dass manche Frage - die Google oder Forum leicht beantworten könnte - nochmal gestellt wird, weil Anfängern halt oft die Begriffe nicht klar sind, nach denen gegoogelt werden könnte, oder weil die Materie anfangs halt extrem umfangreich ist.

Aber mein Verständnis hört auf, wenn jemand
der sich offensichtlich schon ein bisschen mit programmieren beschäftigt hat (sonst wäre der Code nicht so weit)
der sicher schon ein paar Posts hier gelesen hat
dann jedes FaQ, jede Konvention ignoriert und schreibt "macht mal was besseres draus".


So wie von jedem hier eine gewisse Objektivität und Hilfsbereitschaft erwartet wird, erwarte ich mir von allen Hilfesuchenden ein Minimum an Kooperationswillen.

Sollte der gepostet Code wirklich der Programmierstil des TO sein, dann hat er wirklich Hilfe nötig.
Schritt 1: Kürze den Code nicht auf 100 Zeilen, sondern verlängere ihn erstmal, durch korrektes Formatieren
Schritt 2: dann nimm die jede Vraiable durch. Wie soll sie heißen, Wo brauchst du sie -> dort definierst du sie
Schritt 3: dann nimm die jede Methode durch. Welcher Schritt ist nötig? rest bereinigen
...
Dann kommst du auf deine 100 Zeilen. (trotz schlechtem Code, noch ohne was verbessert zu haben)

Java:
public class analog extends Zeichnung {
	public Rechteck		hinten		= new Rechteck(0, 0, 641, 641);
	public Bild			Uhr			= new Bild(0, 0, 600, 600, "Prag_Uhr.jpg");
	public Kreis		Hintergrund	= new Kreis(0, 0, 300);
	public AusgabePanel	Tag			= new AusgabePanel("Tag", 367, 275, 50, 50);
	public AusgabePanel	Wochentag	= new AusgabePanel("WT", 417, 275, 50, 50);
	public Linie		sekunde		= new Linie(600, 300, 300, 300);
	public Linie		minute		= new Linie(600, 300, 300, 300);
	public Linie		stunde		= new Linie(500, 300, 300, 300);
	public Kreis		Mittelkreis	= new Kreis(285, 285, 15);
	public ChkTaste		umstellen	= new ChkTaste("", 290, 290, 20, 20);
	final  int			g = 300;
	final  double		gh;

	public analog() {
		gh = g * 0.66;
		setSize(645, 660);
		Hintergrund.setzeFarbe("weiss");
		hinten.setzeFarbe("schwarz");
		sekunde.setzeFarbe("rot");
		minute.setzeFarbe("gruen");
		stunde.setzeFarbe("gruen");
		stunde.setzeLinienDicke(10);
		Hintergrund.unsichtbarMachen();
		Tag.setzeHintergrundfarbe("schwarz");
		Wochentag.setzeHintergrundfarbe("schwarz");
		Tag.setzeSchriftfarbe("weiss");
		Wochentag.setzeSchriftfarbe("weiss");
		Uhr.einpassen();
		einsetzen();
	}

	public void umstellen_weiss() {
		minute.setzeFarbe("schwarz");
		stunde.setzeFarbe("schwarz");
		Hintergrund.sichtbarMachen();
		Uhr.unsichtbarMachen();
		einsetzen();
	}

	public void umstellen_prag() {
		minute.setzeFarbe("gruen");
		stunde.setzeFarbe("gruen");
		Hintergrund.unsichtbarMachen();
		Uhr.sichtbarMachen();
		einsetzen();
	}

	public void einsetzen() {
		while (true) {
			day = "";
			StaticTools.warte(1000);
			minute(StaticTools.jetzt_Minute());
			sekunde(StaticTools.jetzt_Sekunde());
			stunde(StaticTools.jetzt_Stunde());
			Tag(StaticTools.jetzt_Tag());
			WT(StaticTools.jetzt_WochenTag());
			if (umstellen.istGewaehlt())	umstellen_weiss();
			else 							umstellen_prag();
		}
	}

	public void Tag(int d) {
		Tag.setzeAusgabetext("" + d);
	}

	public void WT(int d) {
		switch (d)
		case 1:	Wochentag.setzeAusgabetext("SO"); break;
		case 2:	Wochentag.setzeAusgabetext("Mo"); break;
		case 3:	Wochentag.setzeAusgabetext("Di"); break;
		case 4:	Wochentag.setzeAusgabetext("Mi"); break;
		case 5:	Wochentag.setzeAusgabetext("Do"); break;
		case 6:	Wochentag.setzeAusgabetext("Fr"); break;
		case 7:	Wochentag.setzeAusgabetext("Sa"); break;
	}

	public void sekunde(double sec) {
		double j = ((sec - 15) / 60) * 2 * java.lang.Math.PI;
		int y = (int)(g + Math.cos(j) * gh);
		int x = (int)(g + Math.sin(j) * gh);
		sekunde.setzeEndpunkte(y, x, g, g);
	}

	public void minute(double min) {
		double j = ((min - 15) / 60) * 2 * java.lang.Math.PI;
		int y = (int)(g + Math.cos(j) * gh);
		int x = (int)(g + Math.sin(j) * gh);
		minute.setzeEndpunkte(y, x, g, g);
	}

	public void stunde(double std) {
		double j = ((std - 15) / 12) * 2 * java.lang.Math.PI;
		int y = (int)(g + Math.cos(j) * gh);
		int x = (int)(g + Math.sin(j) * gh);
		stunde.setzeEndpunkte(y, x, g, g);
	}
}
 
Erstmal sorry für das unschöne Format. Habs jetz mal mit nem schöneren Format gemacht, die Variablen besser benannt und Arrays verwendet. Hoffe, dass es jetzt einigermaßen passt.

Java:
public class analogeUhr extends Zeichnung
{
    public Rechteck     hintenHintergrund = new Rechteck(0,0,641,641);
    public Bild         Uhr               = new Bild(0,0,600,600,"Prag_Uhr.jpg");
    public Kreis        Hintergrund       = new Kreis(0,0,300);
    public AusgabePanel Tag               = new AusgabePanel("Tag",367,275,50,50);
    public AusgabePanel Wochentag         = new AusgabePanel("WT",417,275,50,50);
    public Linie        sekundenZeiger    = new Linie(600,300,300,300);
    public Linie        minutenZeiger     = new Linie(600,300,300,300);
    public Linie        stundenZeiger     = new Linie(500,300,300,300);
    public Kreis        Mittelkreis       = new Kreis(285,285,15);
    public ChkTaste     umstellen         = new ChkTaste("",290,290,20,20);
    public String       day;
    public int          DAY;
    public double[]     CosinusUndSinusWerte = new double[6];
    public double[]     Zeitwerte            = new double[6];
    public int[]        IntKoordinaten       = new int[6];
    public double[]     DoubleKoordinaten    = new double [6];
           double       p;
           int          g;
           double       gh;
    public analogeUhr()
    {
        g=300;
        gh=g*0.66;
        setSize(645,660);
        Hintergrund.setzeFarbe("weiss");
        hintenHintergrund.setzeFarbe("schwarz");
        sekundenZeiger.setzeFarbe("rot");
        minutenZeiger.setzeFarbe("gruen");
        stundenZeiger.setzeFarbe("gruen");
        stundenZeiger.setzeLinienDicke(10);
        Hintergrund.unsichtbarMachen();
        Tag.setzeHintergrundfarbe("schwarz");
        Wochentag.setzeHintergrundfarbe("schwarz");
        Tag.setzeSchriftfarbe("weiss");
        Wochentag.setzeSchriftfarbe("weiss");
        p=java.lang.Math.PI;
        Uhr.einpassen();
        WerteEinsetzen();
    }

    public void umstellenWeiss()
    {
        minutenZeiger.setzeFarbe("schwarz");
        stundenZeiger.setzeFarbe("schwarz");
        Hintergrund.sichtbarMachen();
        Uhr.unsichtbarMachen();
        WerteEinsetzen();
    }

    public void umstellenPrag()
    {
        minutenZeiger.setzeFarbe("gruen");
        stundenZeiger.setzeFarbe("gruen");
        Hintergrund.unsichtbarMachen();
        Uhr.sichtbarMachen();
        WerteEinsetzen();
    }

    public void WerteEinsetzen()
    {
        while(true)
        {
            day="";
            StaticTools.warte(1000);
            setzeMinute(StaticTools.jetzt_Minute());
            setzeSekunde(StaticTools.jetzt_Sekunde());
            setzeStunde(StaticTools.jetzt_Stunde());
            setzeTag(StaticTools.jetzt_Tag());
            setzeWochentag(StaticTools.jetzt_WochenTag());
            if ( umstellen.istGewaehlt())
            {umstellenWeiss();}else
            if(!umstellen.istGewaehlt())
            {umstellenPrag();}
        }
    }

    public void setzeTag(int d)
    {
        day=""+d;
        Tag.setzeAusgabetext(day);
    }

    public void setzeWochentag(int d)
    {
        if(d==1)
            Wochentag.setzeAusgabetext("SO");
        if(d==2)
            Wochentag.setzeAusgabetext("MO");
        if(d==3)
            Wochentag.setzeAusgabetext("DI");
        if(d==4)
            Wochentag.setzeAusgabetext("MI");
        if(d==5)
            Wochentag.setzeAusgabetext("DO");
        if(d==6)
            Wochentag.setzeAusgabetext("FR");
        if(d==7)
            Wochentag.setzeAusgabetext("SA");
    }

    public void setzeSekunde(double Zeitwert)
    {
        Zeitwerte[1]=Zeitwert-15;
        Zeitwerte[0]=(Zeitwerte[1]/60)*2*p;
        CosinusUndSinusWerte[1] = Math.sin(Zeitwerte[0]);
        CosinusUndSinusWerte[0] = Math.cos(Zeitwerte[0]);
        DoubleKoordinaten[1]=g+CosinusUndSinusWerte[0]*g;
        DoubleKoordinaten[0]=g+CosinusUndSinusWerte[1]*g;
        IntKoordinaten[0]=(int)DoubleKoordinaten[0];
        IntKoordinaten[1]=(int)DoubleKoordinaten[1];
        sekundenZeiger.setzeEndpunkte(IntKoordinaten[1],IntKoordinaten[0],g,g);
    }

    public void setzeMinute(double Zeitwert)
    {
        Zeitwerte[3]=Zeitwert-15;
        Zeitwerte[2]=(Zeitwerte[3]/60)*2*p;
        CosinusUndSinusWerte[3] = Math.sin(Zeitwerte[2]);
        CosinusUndSinusWerte[2] = Math.cos(Zeitwerte[2]);
        DoubleKoordinaten[3]=g+CosinusUndSinusWerte[2]*g;
        DoubleKoordinaten[2]=g+CosinusUndSinusWerte[3]*g;
        IntKoordinaten[2]=(int)DoubleKoordinaten[2];
        IntKoordinaten[3]=(int)DoubleKoordinaten[3];
        minutenZeiger.setzeEndpunkte(IntKoordinaten[3],IntKoordinaten[2],g,g);
    }

    public void setzeStunde(double Zeitwert)
    {
        Zeitwerte[5]=Zeitwert-15;
        Zeitwerte[4]=(Zeitwerte[5]/12)*2*p;
        CosinusUndSinusWerte[5] = Math.sin(Zeitwerte[4]);
        CosinusUndSinusWerte[4] = Math.cos(Zeitwerte[4]);
        DoubleKoordinaten[5]=g+CosinusUndSinusWerte[4]*gh;
        DoubleKoordinaten[4]=g+CosinusUndSinusWerte[5]*gh;
        IntKoordinaten[4]=(int)DoubleKoordinaten[4];
        IntKoordinaten[5]=(int)DoubleKoordinaten[5];
        stundenZeiger.setzeEndpunkte(IntKoordinaten[5],IntKoordinaten[4],g,g);
    }
}
 
Danke für das Danke.

Was aber noch viel wichtiger wäre:
Schau dir das Ganze jetzt an, und such die Unterschiede zu deinem Code.

Dann überlegst du dir, warum diese Unterscheide sinnvoll sind,
und was du daraus gelernt hast.

Ich bin gespannt auf deine Erkenntnisse.
 

Zurück
Oben