Okt 102014
 

Aus diversen Programmiersprachen kennt man verschiedene Möglichkeiten Listen zu durchlaufen und die jeweiligen Elemente zu verarbeiten. Die Bekannteste ist wohl die For- bzw. For-Each Schleife.
In Python sieht die Implementierung bekanntermaßen wie folgt aus:

Wie auch aus anderen Sprachen bekannt ist fällt auf, dass die For Schleife über den Index auf das jeweilige Element zugreift und die For-Each Schleife direkt das Element bereitstellt. Oft möchte man aber auch in einer For-Each Schleife auf den Index zugreifen. Man müsste also separat einen Zähler mitlaufen lassen.
In Python gibt es nun aber die Möglichkeit diese Funktionalität miteinander zu “kombinieren”. Nämlich über die enumerate() Funktion:

Die enumerate() Funktion liefert einen Generator für den Index und das Element zurück.
Ganz praktisch wenn man weiß das es diesen Generator gibt :-).
Wer noch wissen möchte wie das Funktioniert: In Python gibt es, wie auch in anderen Programmiersprachen, das yield Schlüsselwort. Dieses liefert einzelne Elemente verzögert (Lazy) zurück. Des weiteren kann man in Python in einer Funktion mehr als einen Wert zurückgeben. Wenn man dies nun kombiniert erhält man folgende Funktion:

Sep 292014
 

Im Bereich der Webentwicklung muss man oft Eingabefelder hinsichtlich ihrer Gültigkeit validieren (Eine Eingabe muss eine Zahl sein, darf nur eine bestimmte Länge haben, etc.). Dies kann man beispielsweise client- oder serverseitig realisieren; Best practice wäre es beides zu verwenden.
In diesem Artikel möchte ich einen Ansatz zeigen, wie mann Eingabefelder auf der Serverseite am Beispiel von PHP validieren kann und wie diese Validierung auch wart- und erweiterbar für neue Anforderungen ist.

Validierung durch Nutzung von Polymorphie

Der von mir gewählte Ansatz verwendet die Polymorphie zur Realisierung. Die abstrakte Klasse Validation enthält die abstrakte Methode check(), welche die eigentliche Funktionalität polymorph bereitstellt:

Das Alias dient dazu herauszufinden um welche Instanz es sich aktuell handelt. D.h. der Parameter kann natürlich weggelassen werden (und das ganze ein Interface anstatt eine abstrakte Klasse werden). Für das Beispiel lasse ich das Alias aber bestehen.
Das wichtigste ist hier die abstrakte Methode check(). Diese nimmt den zu überprüfenden Wert entgegen und liefert einen Boolean als Erfolgsindikator zurück.
Von dieser Klasse können nun alle benötigten Validatoren abgeleitet werden. Als Beispiel könnte man also einen Validator nehmen, der prüft ob ein übergebener Wert eine bestimmte Länge hat:

Hier sieht man auch wofür der additionalParam genutzt werden kann. Natürlich kann man beliebig viele Validatoren implementieren. Das nachfolgende Klassendiagramm zeigt zwei weitere mögliche Validierungen:

Klassendiagramm Validation

Der Sinn der Polymorphie wird klar, wenn man nun einen Wert gegen mehrere Validatoren prüfen möchte. So könnte man sich zum Beispiel eine Validierungs-Suite erstellen, die eben diese Funktionalität kapselt. Eine Implementierung könnte wie folgt aussehen:

Man übergibt im Konstruktor also eine Menge von Validatoren in Form eines Arrays und den zu überprüfenden Wert. Die Methode checkValidators() liefert dann ein assoziatives Array, welches als Schlüssel das Alias der Klasse und als Wert den Erfolgsindikator hält.
Bei einer Auswertung für die drei genannten Klassen, dem Evaluierungswert „test“ und dem zusätzlichen Parameter „10“ für die Klasse SpecialLengthValidator, würde also folgende Ausgabe entstehen:

Die Wart- und Erweiterbarkeit ist durch die Polymorphie gegeben. Weitere Validatoren müssen lediglich von Validation erben und die Methode check() überschreiben.
Dieses Konzept lässt sich natürlich auch auf andere objektorientierte Programmiersprachen anwenden.

Aug 212013
 

Während der Entwicklung einiger Desktop-Applikationen hatte ich den Anwendungsfall, dass man den Zustand null in einer Checkbox darstellen soll (Indeterminate state). Da jedoch Boolean ein primitiver Datentyp ist, ist eine Wertzuweisung mit null nicht möglich.

.NET bietet für solche Fälle die generische Klasse Nullable<> an, um primitive Datentypen zu wrappen und diese null-zuweisungsfähig zu machen.
Eine Zuweisung funktioniert wie folgt:

Bei der ausführlichen Schreibweise fällt auf, dass der Konstruktor von Nullable<> nicht explizit aufgerufen wird. Der Wert wird implizit konvertiert.
Natürlich kann man auch bei eigenen Klassen die implizite Typkonvertierung implementieren. Hierfür benötigt man lediglich eine Property zum Speichern des zugewiesenen Wertes sowie einen impliziten benutzerdefinierten Typkonvertierungsoperator:

Anschließend lässt sich eine Wertzuweisung wie bei der Klasse Nullable<> durchführen:

Jun 252013
 

Im Zuge des Student Developer Club Finales sind 12 kleine Windows 8 Apps entstanden. Ziel war es innerhalb von einem Monat mindestens 10 Apps zu entwickeln.

Die Spiele Galgenmännchen 8 und Retro Snake haben mittlerweile schon > 3500 Downloads und befinden sich in den Top-Listen der jeweiligen Kategorie (es wurde nicht nur auf Quantität geachten ;-)).
Die Apps sind unter der Rubrik ‘Apps‘ zu finden.

Ich würde mich freuen wenn ihr die ein oder andere App ausprobiert und bewertet :-).

Apr 232013
 

Seit heute gibt es die offizielle Windows 8 App von oopbase.de!

http://apps.microsoft.com/windows/de-DE/app/oopbase/1f7e83fb-97b5-4a53-92ed-76b1e2c7635e

Sofern ihr Windows 8 nutzt würde ich mich über eine Bewertung freuen :-).

Mrz 142013
 

Heute möchte ich zeigen, wie man unter C# .NET eigene Attribute implementieren und verwenden kann.
Dazu zunächst die Definition eines Attributs von MSDN:

Attribute stellen eine effiziente Methode dar, um Deklarationsinformationen mit C#-Code (Typen, Methoden, Eigenschaften usw.) zu verknüpfen. Sobald das Attribut einer Programmentität zugeordnet ist, kann es zur Laufzeit mithilfe eines Verfahrens abgefragt werden, das als Reflektion bezeichnet wird.

Ein bekanntes Beispiel ist das Obsolete() Attribut. (Das Pendant in Java wäre @Deprecated)

Wenn man also über der Signatur einer Methode ein Attribut definiert, dann kann dieses via Reflection ausgelesen und verarbeitet werden. In dem konkreten Fall von Obsolete() würde der Compiler nun eine Warnung ausgeben, dass die entsprechende Methode veraltet ist.

Die Implementierung:
Zunächst ist ein Attribut nichts weiter als eine Klasse, die von System.Attribute erbt. Die simpelste Form könnte also wie folgt aussehen:

Wie der Klassenname verrät, soll ein Attribut implementiert werden, mit dem man zusätzliche Informationen über die jeweilige Methode erhält. Interessante Informationen wären evtl. das Erstellungsdatum sowie der Autor. Weiterhin möchten man vllt., dass man das Attribut ausschließlich über Methoden und nicht über Klassen setzen kann. Dazu wird die Klasse lediglich um zwei Properties sowie um ein eigenes Attribut erweitert:

In diesem Fall hätte die Methode Answer() den Autor “Chuck Norris” und das Erstellungsdatum “14.03.2013”. Die im Konstruktor definierten Parameter werden beim Aufrufen des Attributs übergeben.

Die Auswertung:
Wie bereits erwähnt lassen sich die Attribute nun via Reflection auswerten. Wenn man nun das obige Beispiel aufgreift und man z.B. wissen möchte, wie viele Methoden der Klasse Test heute entwickelt wurden, könnte eine Auswertung wie folgt aussehen:

Die Ausgabe für das obige Beispiel wäre Methods developed today = 1, da nur eine Methode in der Klasse Test mit dem Attribut versehen wurde.
Weitere Informationen zu Attributen können hier nachgelesen werden.

Jan 202013
 

Mit folgendem Code kann man das echo von sdtin aktivieren oder deaktivieren.
Besonders praktisch, da Benutzer Eingaben tätigen können, ohne das die Eingabe auf der Konsole angezeigt wird.

Dez 032012
 

Im folgenden zeige ich, wie man HTML Text in Textblöcken oder Labeln darstellen kann. Der Ausgangspunkt hierfür ist ein passender ValueConverter:

Wenn man nun also einen String an einen TextBlock bindet und den ValueConverter angibt, dann wird der Inhalt automatisch durch den Converter korrekt angezeigt. Damit man den Converter verwenden kann, muss man zunächst den Namespace in der XAML anlegen.

Anschließend muss man dann nur noch den angelegten Namespace als statische Ressource angeben.

Zuletzt kann dann das Databinding erfolgen.

Aug 012012
 

Mit folgender Funktion lässt sich ein zufälliges Passwort in C generieren. (In nächster Zeit werde ich öfters ein paar C/C++ Inhalte posten, da ich mich zur Zeit intensiv mit C beschäftige).

Zur Vorgehensweise: Es wird in jedem Schleifendurchlauf ein zufälliges Zeichen aus POSSIBLECHARS ermittelt und an die Variable retString angehangen. Die Schleife läuft so lange, bis der Zähler die vom Benutzer angegebene Anzahl erreicht hat.

Jun 182012
 

Vor ein paar Wochen bin ich auf ein interessantes Verhalten meiner Netbeans Entwicklungsumgebung gestoßen.

Ich habe eine generische Arraylist erstellt:

Die Entwicklungsumgebung hat mir dann folgendes angezeigt:

Nach dem Ausführen des Vorschlags sah die Initialisierung der Arraylist wie folgt aus:

Der Grund der Änderung scheint offensichtlich. Beim Initialisieren von generischen Typen musste der Typparameter bisher immer doppelt angegeben werden. Seit Java 7 gibt es jetzt also die verkürzte Schreibweise; eben die Diamantinferenz (Der Name kommt tatsächlich daher, dass die generischen Klammern ‘<>’ angeblich wie ein Diamant aussehen ;-)).

Der Vorteil dieser Schreibweise ist lediglich die reduzierte Schreibarbeit. Bei folgendem Konstrukt ist diese Tatsache vielleicht ganz angenehm.

In Bezug auf die Polymorphie tauchen mit der Schreibweise auch keine Probleme auf. Ausgegangen von einer Oberklasse (z.B. Animal) und einer Subklasse (z.B. Dog), wäre Folgendes so oder so nicht erlaubt:

Demnach gibt es keine Missverständnisse bei der neuen Schreibweise: