Code Optimierung – Teil 1250 (in C# geht auch Spaghetti kodierung)

Ich bin zur Zeit, unter anderem damit beauftragt ein Projekt für einen Kunden zu überarbeiten und zu optimieren.

In diesem Zusammenhang bin ich Heute Morgen auf ein Stück Quellcode gestoßen der mich sofort an die früher (so vor 20 Jahren) sehr üblichen Spaghetti Code Programme erinnert hat.

Ich zeige hier einfach mal den Code dieser Methode wie ich sie vorgefunden habe und anschließend die von mir leicht überarbeitete Methode.

Die Methode wird übrigens dazu verwendet verschiedene Button ein und auszublenden, sowie in Abhängigkeit von Datenfeldern einer Datenbank den Button mit einem Image zu verschönern und entsprechende Datums und Uhrzeiten anzuzeigen oder auszublenden.
Ich denke anhand der nachfolgenden Abbildungen kann man sich ungefähr vorstellen was die Methode macht.

Hier der doch etwas unübersichtliche Code

#region Ankunft

if (entladung.AnkunftLKW.HasValue)
{
	dtpAnkunftDate.Visible = true;
	dtpAnkunftTime.Visible = true;
}
else
{
	dtpAnkunftDate.Visible = false;
	dtpAnkunftTime.Visible = false;
}
#endregion

#region Einfahrt

if (entladung.EinfahrtLKW.HasValue)
{
	dtpEinfahrtDate.Visible = true;
	dtpEinfahrtTime.Visible = true;
}
else
{
	dtpEinfahrtDate.Visible = false;
	dtpEinfahrtTime.Visible = false;
}

#endregion

#region Entladung Start

if (entladung.EntladeStart.HasValue)
{
	dtpEntladungStartDate.Visible = true;
	dtpEntladungStartTime.Visible = true;
	btnEntladungStart.ImageIndex = 0;
	if (entladung.EntladeEnde.HasValue)
	{
		btnEntladungStart.Enabled = false;
	}
	else
	{
		btnEntladungStart.Enabled = true;
	}
}
else
{
	dtpEntladungStartDate.Visible = false;
	dtpEntladungStartTime.Visible = false;
}

#endregion

#region Entlade Ende

if (entladung.EntladeEnde.HasValue)
{
	dtpEntladungEndeDate.Visible = true;
	dtpEntladungEndeTime.Visible = true;
	btnEntladungEnde.ImageIndex = 0;

	btnEntladungEnde.Enabled = !entladung.AusfahrtLKW.HasValue;
}
 else
{
	if (entladung.EntladeStart.HasValue)
	{
		btnEntladungEnde.Enabled = true;
	}
	else
	{
		btnEntladungEnde.Enabled = false;
		btnEntladungEnde.ImageIndex = -1;
	}

	dtpEntladungEndeDate.Visible = false;
	dtpEntladungEndeTime.Visible = false;

}

#endregion

#region Ausfahrt

if (entladung.AusfahrtLKW.HasValue)
{
	dtpAusfahrtDate.Visible = true;
	dtpAusfahrtTime.Visible = true;
}
else
{
	dtpAusfahrtDate.Visible = false;
	dtpAusfahrtTime.Visible = false;
}

#endregion

Hier der Optimierte Code

dtpAnkunftDate.Visible = entladung.AnkunftLKW.HasValue;
dtpAnkunftTime.Visible = entladung.AnkunftLKW.HasValue;

dtpEinfahrtDate.Visible = entladung.EinfahrtLKW.HasValue;
dtpEinfahrtTime.Visible = entladung.EinfahrtLKW.HasValue;

dtpEntladungStartDate.Visible = entladung.EntladeStart.HasValue;
dtpEntladungStartTime.Visible = entladung.EntladeStart.HasValue;

dtpEntladungEndeDate.Visible = entladung.EntladeEnde.HasValue;
dtpEntladungEndeTime.Visible = entladung.EntladeEnde.HasValue;

dtpAusfahrtDate.Visible = entladung.AusfahrtLKW.HasValue;
dtpAusfahrtTime.Visible = entladung.AusfahrtLKW.HasValue;

btnEntladungStart.ImageIndex = entladung.EntladeStart.HasValue ? 0 : -1;

btnEntladungStart.Enabled = ((!entladung.EntladeStart.HasValue) |
						((entladung.EntladeStart.HasValue && !entladung.EntladeEnde.HasValue)));

btnEntladungEnde.ImageIndex = entladung.EntladeEnde.HasValue ? 0 : -1;

btnEntladungEnde.Enabled = (entladung.EntladeStart.HasValue && !entladung.AusfahrtLKW.HasValue);

Man beachte die Zeilenzahlen. Die obere Variante hat genau die 4 fache Anzahl Code.
Obwohl, schön aussehen tun die vielen If’s und Else schon 🙂

Und da der untere Code viel kürzer und einfacher ist, braucht man auch nichts mehr mit Region umklammern.

2 Gedanken zu „Code Optimierung – Teil 1250 (in C# geht auch Spaghetti kodierung)“

  1. Ich wuerde hier noch einen Schritt weiter gehen und ein paar Zeilen mehr mit verbesserter Uebersichtlichkeit eintauschen:

    bool ankunftLKW = entladung.AnkunftLKW.HasValue;
    bool enfahrtLKW = entladung.EinfahrtLKW.HasValue;
    bool entladungStart = entladung.EntladeStart.HasValue;
    bool entladungEnde = entladung.EntladeEnde.HasValue;
    bool ausfahrtLKW = entladung.AusfahrtLKW.HasValue;
    
    dtpAnkunftDate.Visible = ankunftLKW;
    dtpAnkunftTime.Visible = ankunftLKW;
    
    dtpEinfahrtDate.Visible = enfahrtLKW;
    dtpEinfahrtTime.Visible = enfahrtLKW;
    
    dtpEntladungStartDate.Visible = entladungStart;
    dtpEntladungStartTime.Visible = entladungStart;
    
    dtpEntladungEndeDate.Visible = entladungEnde;
    dtpEntladungEndeTime.Visible = entladungEnde;
    
    dtpAusfahrtDate.Visible = ausfahrtLKW;
    dtpAusfahrtTime.Visible = ausfahrtLKW;
    
    btnEntladungStart.ImageIndex = entladungStart ? 0 : -1;
    btnEntladungStart.Enabled = (!entladungStart || (entladungStart && !entladungEnde));
    btnEntladungEnde.ImageIndex = entladungEnde ? 0 : -1;
    btnEntladungEnde.Enabled = (entladungStart && !ausfahrtLKW);
    

    Korrekterweise sollten die bool Variablen auch so spaet wie moeglich deklariert werden. Das wuerde dann aber dazu fuehren, dass man versucht ist die einzelnen Bloecke weiter in Unterfunktionen zu packen. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.