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.

Erster – Oder doch nicht – VS2010 SP1 – Enthält keine Lösung für 2 Jahre alten Fehler

Habe ich den ersten Fehler in Visual Studio gefunden, der auch noch nach der Installation des SP 1 vorhanden ist?
Sicher nicht, aber deswegen bleibt es doch ärgerlich, dass ein bereits seit 2 Jahren bekannter Fehler nicht mit dem Service Pack behoben wurde.

Vor einigen Tagen habe ich von dem Problem berichtet, dass ein Breakpoint im DateTimePicker Event einen Rechner mit Windows 7 64 BIT zum einfrieren bringt.

Beim schreiben dieses Artikels habe ich gar nicht an das anstehende Service Pack 1 für Visual Studio gedacht.
Und ich hatte auch auf diesem Rechner keine Beta Version des SP1 installiert.

Nun habe ich Heute Morgen das Service Pack 1 für Visual Studio auf diesem Windows 7 64 BIT Rechner installiert.

Gerade eben, ich hatte das Problem mal wieder vergessen, habe ich in einer Methode die in einem Event des DateTimePicker aufgerufen wird einen Breakpunkt gesetzt und ……

Nein, das darf nicht war sein, das Problem ist trotz Service Pack 1 noch immer vorhanden.

Ich wiederhole also noch mal meine Frage:

Hallo Microsoft wann können wir mit einer Lösung rechnen?

WebMatrix und DotNetNuke – Noch nie war es einfacher !!!

Am Wochenende habe ich mir etwas Zeit genommen um mir die Installation von DotNetNuke unter Zuhilfenahme von WebMatrix anzuschauen.

Als kurzes Resumé sei gleich am Anfang gesagt:

Es war noch nie einfacher DotNetNuke zu installieren als mit WebMatrix !

Als erstes muss WebMatrix installiert werden. Dazu lädt man sich den WebInstaller von hier herunter und startet den Installer. Die Gesamte Installation kann gut und gerne (je nach Download Geschwindigkeit) eine halbe Stunde oder etwas mehr dauern.

Während der Installation von WebMatrix werden nachfolgend aufgelistete Programme automatisch installiert.

Je nachdem, auf welchem Betriebssystem man WebMatrix installiert und welche anderen Programme man vorher schon installiert hat, ist während der Installation ein Neustart notwendig.

Nachdem WebMatrix installiert ist und der Schnellstart Bildschirm angezeigt wird, wählt man „Website aus Web Gallery“ aus.

In der Web Gallery steht DotNetNuke auch gleich als erstes Programm zur Auswahl zur Verfügung.

Einfach DotNetNuke auswählen und auf den Button Weiter klicken.

Nun werden die für DotNetNuke zu installierenden Programme / Komponenten angezeigt.

Je nachdem welche Programme bereits auf dem Rechner installiert sind, wird nur das DotNetNuke Paket oder noch zusätzlich der SQL Server Express aufgeführt.

Der SQL Server 2008 Express (es würde auch mit einer 2005 er Version gehen) ist notwendig, da mit WebMatrix zusammen nur ein SQL Server Compact installiert wird, dieser aber weder Views und Trigger noch Gespeicherte Prozeduren unterstützt, welche aber für den Betrieb von DotNetNuke zwingend notwendig sind.

Mit dem nächsten Klick auf OK, wird dann DotNetNuke (und  gegebenenfalls der SQL Server Express ) installiert.

Nun noch auf den URL Link  klicken und die DotNetNuke Installationsroutine wird gestartet.

Für den absoluten Neuling würde ich empfehlen beim ersten Kontakt mit DotNetNuke die Installations-Methode Auto zu verwenden (übrigens ist an dieser Stelle ein unfassbarer Übersetzung Klops zu sehen – Auto wird mit manuell übersetzt, ist doch logisch, oder 🙂 ). Bei dieser Option wird alles von der Installationsroutine vorbelegt und nach dem Klick auf Next ist alles getan und DotNetNuke wird mit Standardvorgaben installiert. Wer bereits mehr mit DotNetNuke, der Einrichtung der Anpassung zu tun hatte, kann auch mit den Optionen Typical und Custom arbeiten (experimentieren).

Nachdem DotNetNuke die Installtion abgeschlossen hat, sollten ganz viele Zeilen mit eine grünen Success im Browser erschienen sein und als letzte Zeile sollte ein

Click here to access your portal

erscheinen.

Dann „Click“ und viel Spaß!!


Wer sich die Installation lieber als Video anschaut kann das unter nachfolgendem Link (in Englisch) anschauen.
http://www.dotnetnuke.com/Resources/VideoLibrary/Viewer/TabId/1613/VideoId/174/Installing-DotNetNuke-With-WebMatrix.aspx

Razor (CSHTML) – Neue View Engine für ASP.NET

Im Zusammenhang mit WebMatrix wird meist auch über Razor gesprochen.

Aber was ist Razor eigentlich?

Razor ist eine im letzten Jahr von Microsoft entwickelte neue View Engine, welche in Zusammenhang mit dem ASP.NET MVC Framework bzw. von WebMatrix neben einigen anderen View Engines eingesetzt werden kann.

Folgende View Engines stehen aktuell zur Verfügung:

  • ASPX (C#) == default View Engine (auch bekannt als WebFormViewEngine)
  • Razor (CSHTML)
  • NHaml
  • Spark

Eine ausführliche Beschreibung, was eine View Engine genau macht, würde den Rahmen dieses Beitrags sprengen. Daher folgt hier nur eine kurze Beschreibung der Hauptaufgaben einer View Engine.

Grundlegende Funktionalität einer View Engine:

  • Eine Vorlagen basierte Implementierung des Interface IViewEngine, welche einen Provider für die entsprechende View zur Verfügung stellt
  • Implementierung des IView Interface um den Inhalt der Vorlagen rendern zu können.
  • Die Implementierung der eigentlichen Engine, welche in der Lage ist den gerenderten Quellcode in ausführbaren Code zu übersetzen.

Wer ausführlichere Informationen  zum Thema View Engines benötigt, findet unter den nachfolgenden Links sowohl Basiswissen als auch Gegenüberstellungen der einzelnen Engines.

Coding4Fun -Developer Review – Four ASP.NET MVC View Engines (Englisch)

ScottGu’s Blog – Introducing “Razor” – a new view engine for ASP.NET (Englisch)

ASP.NET MVC (Model View Controller) – kurzer Rückblick

Im Zusammenhang mit WebMatrix und Razor taucht immer wieder der nachfolgende Begriff auf:

  • ASP.NET MVC (Model View Controller)

Dieser Model View Controller ist aber nichts neues und wird bereits seit 2007 in einem ASP.NET MVC Framework von Microsoft zur Verfügung gestellt.

Der Model View Controller ist allerdings die Voraussetzung für die Implementierung von Razor in der aktuellen Version von WebMatrix

Mehr Informationen zu ASP.NET MVC gibt es unter anderem bei den nachfolgenden Links:

ASP.NET MVC Framework (ScottGu’s Blog englisch Oktober 2007)

Erstellen von Webanwendungen ohne Webformulare (MSDN Magazin März 2008)

MS SQL – Views ermitteln in welchen ein bestimmtes Feld verwendet wird

In einem recht umfangreichen Projekt (C# Windows Forms Anwendung) welches als Datenbank eine MS SQL Datenbank verwendet, musste ich Erweiterungen der Datenbank (zusätzliche Felder) vornehmen.

Da ich diese neuen Felder auch in allen vorhandenen Abfragen ergänzen musste, in welchen ein anders bereits vorhandenes Feld (wir nennen es einfach mal “EinfahrtLKW”) der gleichen Tabelle ausgegeben wird, habe ich nach einer Lösung gesucht um mir alle Abfragen (Views) anzeigen zu lassen, in dem das Feld EinfahrtLKW Verwendung findet.

Um dies zu realisieren habe ich folgende Systemsicht verwendet:

INFORMATION_SCHEMA.VIEW_COLUMN_USAGE

Meine Abfrage sieht dann so aus:

select * from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE where COLUMN_NAME = 'EinfahrtLKW'

Und das Ergebnis sieht dann so aus:

 image

Mit dieser Information habe ich nun die Name der Views, die ich anpassen muss.

TortoiseSVN – Versionskontrolle aus einer Kopie entfernen

Von Zeit zu Zeit kommt es vor, dass man ein Verzeichnis welches sich unter Versionskontrolle (Subversion – TortoiseSVN) befindet,  einfach kopieren und aus dieser Kopie die Versionskontrolle entfernen möchte (Entfernen aller .svn oder _svn Verzeichnisse und deren Inhalt). Ich möchte damit eine echte Kopie aller Dateien (mit Ausnahme der Dateien der Versionskontrolle) erhalten welche sich in dem Projekt befindet, damit meine ich auch die Dateien und Verzeichnisse welche von der Versionskontrolle ausgeschlossen sind.

Klar kann man das mit dem Explorer Suchfunktion machen.

Projekt Kopieren und dann in der Kopie nach den Verzeichnissen mit _svn oder .svn (je nach eingestellter Option) suchen und diese dann anschließend markieren und löschen.

Explorer Suchfenster

Ein wie ich finde eleganterer Weg aber ist es dies durch TortoiseSVN selbst erledigen zu lassen.

Und hierzu gibt es eine ganz einfache Methode:

Man markiert das kopierte Verzeichnis, Rechtsklick mit der Maus und Kontextmenü TortoiseSVN und dort das Untermenü Export aufrufen.

Wenn man nun als Zielverzeichnis das Quellverzeichnis selbst angibt, dann stellt TortoiseSVN dies fest uns fragt:

Wollen Sie die Arbeitskopie aus der Versionskontrolle entfernen?

Wenn man nun mit Ja dieses Dialogfeld bestätigt, dann entfernt TortoiseSVN aus dem Verzeichnis alle Dateien und Verzeichnisse der Versionskontrolle.

Als Ergebnis erhält man also eine Arbeitskopie ohne Bezug auf die Versionskontrolle.

Windows Communication Foundation (WCF) – Welche Bindungen gibt es denn

Beim stöbern in den Tiefen der MSDN Dokumentationen bin ich mehr durch Zufall, als durch das Ergebnis einer Suchmaschine auf den Beitrag „Konfigurieren der vom System bereitgestellten Bindungen“ gestoßen.

Da ich bisher nichts (auf jeden Fall nichts auf Deutsch) finden konnte, wo die verschiedenen Bindungen die vom Framework zur Verfügung gestellt werden, kurz und prägnant aufgeführt und erläutert wurden, war ich gerade dabei und wollte das in einem eigenen Beitrag machen und da…

Ja da habe ich diesen Beitrag gefunden.

Hier nun kurz (sozusagen) als Suchmaschinen Hilfe für die MSDN Seite die verfügbaren Bindings kurz aufgelistet und dann der Link zu der Erläuterung auf MSDN.

Vom .NET Framework zur Verfügung gestellte Bindings für die Windows Communication Foundation

  • BasicHttpBinding
  • WSHttpBinding
  • WS2007HttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding
  • WS2007FederationHttpBinding
  • NetTcpBinding
  • NetNamedPipeBinding
  • NetMsmqBinding
  • NetPeerTcpBinding
  • MsmqIntegrationBinding

Die MSDN Beschreibung lautet : Konfigurieren der vom System bereitgestellten Bindungen

Controls versus Components

In Gesprächen mit Entwicklern taucht immer wieder die Frage auf was Controls von Components unterscheidet.

 

Die Kurzbeschreibung hierzu lautet:

 

Im Gegensatz zu Controls haben Components keine Visuellen Eigenschaften.

Es wird also nichts auf einer Form angezeigt.

Das was Components mit Controls gemeinsam haben, ist, dass man Sie zu einer Form hinzufügen kann und dass sie beide zur Design Time konfiguriert werden können.

NET Framework – Bereit für die Debug Session

Auch wenn schon … was weiß ich wie viele diese Nachricht „. NET Source Code veröffentlicht“ seit Gestern veröffentlicht haben, mache ich meinen Beitrag unter dem Motto „Eigene Notizen“.

Hier also jetzt vor allem aber nicht ausschließlich für mich selbst:

Der Source Code für das NET Framework (wenigstens einen Teil davon, siehe nachfolgende Auflistung) wurde von Microsoft veröffentlicht.

Für diese Assemblies steht der Source Code zur Verfügung:

  • Mscorlib.DLL
  • System.DLL
  • System.Data.DLL
  • System.Drawing.DLL
  • System.Web.DLL
  • System.Web.Extensions.DLL
  • System.Windows.Forms.DLL
  • System.XML.DLL
  • WPF (UIAutomation*.dll, System.Windows.DLL, System.Printing.DLL, System.Speech.DLL, WindowsBase.DLL, WindowsFormsIntegration.DLL, Presentation*.dll, some others)
  • Microsoft.VisualBasic.DLL

Der Source Code steht zur Zeit nur in Verbindung mit dem Debugger in VS2008 zur Verfügung, ein Download des gesamten Source Code ist „noch“ nicht verfügbar, soll aber wohl auch noch folgen.

Wie man VS2008 konfigurieren muss, damit man in das Framework hinein Debuggen kann, wir ausführlich in dem Blog Beitrag von Shawn Burke beschrieben.

Der Source Code ist unter der Microsoft Referenz Lizenz (oder wie ich sie nenne Peep Show Lizenz) veröffentlicht. Die sagt hauptsächlich aus:

  • Gucken -> Erlaubt !
  • Alles andere verboten

Ich bin gespannt ob dieses Lizenzmodell richtig verstanden wird, es gibt leider viele die eine Verfügbarkeit des Source Code gleichsetzen mit Open Source. Und selbst bei Open Source wird häufig die Lizenz nicht wirklich beachtet.

Na mal sehen wie das ausgeht!

PS: Ich habe das übrigens schon getestet, ist wirklich eine schöne Sache, mal schauen wann ich es dann auch mal wirklich brauchen kann.

Na ja auf jeden Fall können wir jetzt MS mit der Meldung eines Fehlers auch gleich einen Vorschlag für die Behebung schicken! smile_teeth