Navigation


German VFPConversion Developer's Blog

Dieser Blog ist allen VFP-Entwicklern gewidmet, die .NET und SQL Server in Ihren Applikationen einsetzen oder komplett darauf umsteigen wollen. Das inkludiert natuerlich auch .NET 3.0 Technologien wie WPF und WCF.

Content Area Footer

Monday, April 24, 2006
Ein Paradebeispiel für die Verwendung von Generics

Die .NET Runtime 2.0 hat ein sehr tolles neues Feature mit dem Namen „Generics“. Generics haben viel mit Strong-Typing zu tun. Wie Sie vielleicht wissen, sollte alles, was man in .NET macht, strong-typed sein, da dies einen positiven Effekt auf die Qualität und vieler anderer Dinge in Ihrer Applikation hat. Jedoch gibt es einige Anwendungsgebiete, bei denen Strong Typing unter .NET 1.1 ignoriert werden musste bzw. musste der Entwickler alternativ eine Unmenge an Code schreiben, um die Vorteile von Strong Typing auch in diesen Fällen nutzen zu können.

Ein Beispiel ist eine Liste von Objekten, die in einer Collection gespeichert warden. Hierfür bietet .NET verschiedene Klassen, wie beispielsweise die ArrayList-Klasse. Eine Array-List kann alle Objekt-Typen speichern. Beispielsweise kann eine Array-List aus Forms bestehen:

ArrayList myForms = new ArrayList();
myForms.Add(new Form());
myForms.Add(new Form());
myForms.Add(new CustomerEditForm());

Dies ist C#-Code. Hätten Sie eine ArrayList-Klasse in VFP entworfen, würde das so aussehen:

LOCAL myForms
myForms = CreateObject("ArrayList")
myForms.Add(CreateObject("Form"))
myForms.Add(CreateObject("Form"))
myForms.Add(CreateObject("CustomerEditForm"))

Eine Collection von Objekten kann in vielen Fällen sehr praktisch sein, zum Beispiel kann man alle Forms in einer Collection in einer Schleife abfragen und am Bildschirm anzeigen:

foreach (Form frm in myForms)
{
    frm.Show();
}

Es gibt jedoch ein Problem, wenn jemand in der Collection etwas anderes als eine Form speichert, denn eine ArrayList kann ja wiegesagt alle Arten von Objekten speichern, nicht nur Forms. Der folgende Code würde also zu einer Katastrophe führen:

ArrayList myForms = new ArrayList();
myForms.Add(new Form());
myForms.Add(new Form());
myForms.Add(new Button());
foreach (Form frm in myForms)
{
    frm.Show();
}

Dieser Code würde zur Laufzeit einen Fehler verursachen, denn es gibt keine Möglichkeit, die ArrayList dahingehend zu überprüfen, ob sich nur Forms in der Auflistung befinden. Wie kann man dieses Problem also in den Griff bekommen? In .NET 1.1 löst man diese Aufgabenstellung, indem man eine Subklasse aus der ArrayList erstellt und eine Vielzahl von Eigenschaften und Methoden ändert (beispielsweise kontrolliert man in der Add()-Methode, ob es sich beim hinzuzufügenden Objekt auch um eine Form handelt). Das größte Problem bei dieser Vorgangsweise ist der große Zeitaufwand: Man muss eine Subklasse für Forms entwerfen, eine andere für Buttons, eine weitere für DataSets usw. Bitte bedenken Sie, dass es tausende von verschiedenen Objekt-Typen im .NET-Framework gibt.

Aus diesem Grund wurde in .NET 2.0 das „Generics“-Feature eingeführt. Es ermöglicht Ihnen die generische Definition von Klassen (wie eine Klasse, die ähnlich der ArrayList-Klasse ist), aber wenn sie verwendet wird, kann man ihr einen spezifischen Zweck zuweisen. Im folgenden Beispiel sehen Sie die neue List Class, die wie eine generische ArrayList arbeitet:

List<Form> myForms = new List<Form>();
myForms.Add(new Form());
myForms.Add(new Form());
myForms.Add(new Button()); // Compiler Error!!!

In diesem Fall wird ein neues List-Objekt instanziiert, aber mit der Einschränkung, dass ausschließlich Forms in die Auflistung aufgenommen werden können. Der Objekt-Typ wird hierbei in Größer-Kleiner-Zeichen festgehalten. Anstatt zu sagen: „Wir instanziieren eine ArrayList“ würden wir jetzt „Wir instanziieren eine Liste mit Forms“ sagen.

Das ist ein hervorragendes Feature, denn es verbessert einerseits die Qualität des Codes und andererseits auch die Produktivität.

Ein weiteres Beispiel, wie man Generics außerhalb von Collections nutzen kann: Vor kurzer Zeit habe ich einem Kunden geholfen, seine Business Rules zu erstellen. Der Kunde verwendet unsere Milos Solution Platform (Framework) für die Erstellung seiner Applikationen, und Milos ermöglicht die Definition von Business Rules, als wären sie Klassen (wie die meisten Frameworks). Der Kunde wollte eine allgemeine Regel einrichten, die es ihm ermöglicht, jedes Datenfeld mit einem Wert zu vergleichen. Kein Wert sollte hierbei größer sein, als ein bestimmter Wert „X“.

In .NET 1.1 ist das durch sogenannte “IComparable”-Objekte möglich. Viele Objekte, wie auch Integers, Decimals, Strings usw., führen IComparable aus. Damit ist es möglich, „if (x > 0)" abzufragen, womit X mit 0 verglichen wird und true zurückgib, wenn X größer als 0 ist. Es ist auch möglich, ‚if ("B" > "A")' abzufragen, was true zurückgib, weil A vor dem B im Alphabet vorkommt. Dies funktioniert mit jedem Objekt, das IComparable benützt. Daher kann die folgende Methode verwendet werden (C#):

public class MyRule
    public bool
IsGreater(IComparable val1, IComparable val2)
    {
        if (val1.CompareTo(val2) > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Diese Methode kann nun mit 2 Parametern (Integers / Numbers) aufgerufen warden, da Integers IComporable unterstützen. Der folgende Syntax ist also gültig:

MyRule x = new MyRule();
x.IsGreater(10,5);

Der folgende Syntax ist ebenso gültig, da Strings auch IComparable unterstützen:

MyRule x = new MyRule();
x.IsGreater("Athens","Rome");

So weit so gut. Der Knackpunkt ist jedoch, dass beide Parameter nicht nur IComparable unterstützen müssen, sondern vor allem auch vom selben Typ sein müssen. In anderen Worten: Auch, wenn beide Parameter IComparable unterstützen, würde der folgende Syntax nicht funktionieren:

MyRule x = new MyRule();
x.IsGreater(10,"Rome");

Und genau das kann sehr verwirrend sein. Ein typisches Fehlerszenario tritt auf, wenn zwei verschiedene numerische Parameter übergeben werden (beispielsweise decimal und integer). Wir brauchen also eine Möglichkeit, diese zwei Parameter generisch zu übergeben, aber wenn die Methode verwendet wird, müssen beide Parameter zu einem bestimmten Typ „konvertiert“ werden. Und dies ist der Fall, wenn die selbe Methode mit Hilfe der Generics erstellt wirdAnd this can be a bummer, because sometimes this gets confusing. A typical failure scenario would be one where two different numeric types (decimal and integer for instance) are passed. What we need is a way to implement this as generically as demonstrated here, but when the method is used, it needs to be restricted to a specific type. And once again, this can be done when the same method is implemented through generics:

MyRule<int> x = new MyRule<int>();
x.IsGreater(10,20);
x.IsGreater(10,"Rome"); // Compiler Error!!!

Aus meiner Sicht ist das ein sehr brauchbares Anwendungsgebiet von Generics. Es schützt uns vor hunderten von Fehlern, weil wir Strong-Type-Regeln umgehen wollen oder müssen, und unser Code wird beim Kompilieren bereits auf mögliche Fehler geprüft.

Zwischendurch: vor einiger Zeit hat Markus Egger über die Erstellung eines Length-Datentypen (Englisch) gebloggt. Damals haben eine Leser Diskussionen angefangen, ob es wirklich Vorteile bringt, einen neuen Datentyp zu entwickeln, oder ob bestehende Methoden und Objekte aus VFP nicht für denselben Zweck ausreichend sind. Das folgende Business Roule-Beispiel zeigt die Vorteile von eigenen Datentypen auf. Der Length-Datentyp, den er in diesem Beispiel verwendet, kann in der Business Rule-Klasse wie folgt verwendet werden:

MyRule<Length> x = new MyRule<Length>();
x.IsGreater(new Length("5 foot 6 inch"),new Length("1m 25cm"));

Es gibt somit keinen Unterschied zwischen der Verwendung eines eigenen Datentyps und den wesentlichen, bestehenden Datentypen, solange beide Datentypen IComporable unterstützen.

Wenn Sie an weiteren Informationen über Generics interessiert sind, folgen Sie diesem Link aus dem Code:

http://www.code-magazine.com/SearchResults.aspx?search=Generics 



Posted @ 9:26 AM by Jaros, Gerhard (gerhard@eps-software.com) -
Comments (13)




Comments:

RE: Ein Paradebeispiel für die Verwendung von Generics
Saturday, July 16, 2011 11:48 AM by adult vod

i really like your blog thanks


RE: Ein Paradebeispiel für die Verwendung von Generics
Tuesday, November 08, 2011 7:06 PM by iPhone 3GS to iPhone 4S Transfer - plant2013@gmail.com

iPhone 3GS to iPhone 4S Transfer transfer stored movies/music between iPhones.


RE: Ein Paradebeispiel für die Verwendung von Generics
Wednesday, November 09, 2011 4:18 AM by Wildcard SSL - davis.joseph00@gmail.com

I wana congratulate you for such a wonderful and excellent work keep it up though its awesome


RE: Ein Paradebeispiel für die Verwendung von Generics
Monday, December 26, 2011 3:30 AM by how to become a pilot - skylajhon10@gmail.com

About this topic, I have been lately in your blog once or twice now. I just wanted to say hi and show my thanks for the information provided.


RE: Ein Paradebeispiel für die Verwendung von Generics
Thursday, December 29, 2011 2:45 AM by Gucci Totes - lanweiliger@gmail.com

Ich mag sehr viel Ihre Art der Präsentation. Wir freuen uns auf mehr lesen von dir.


RE: Ein Paradebeispiel für die Verwendung von Generics
Tuesday, April 18, 2017 5:18 AM by britishessaywriters reviews - alikhan@gmail.com

This is a super nice blog and I am very happy to learn about each of these things the german has posted about! I love it and the information which is shared here. You are doing an amazing job!


RE: Ein Paradebeispiel für die Verwendung von Generics
Sunday, September 10, 2017 10:26 AM by Interested in Sex - sirking79@gmail.com

This type of message always inspiring and I prefer to read quality content, so happy to find good place to many here in the post, the writing is just great, thanks for the post.


obat herbal batu ginjal
Sunday, September 17, 2017 9:50 PM by obat herbal batu ginjal

You can certainly see your enthusiasm within the work you write. The arena hopes for more passionate writers like you who aren't afraid to mention how they believe. At all times go after your heart.


obat herbal amazon plus
Sunday, September 17, 2017 9:51 PM by obat herbal amazon plus

I'll right away grasp your rss feed as I can't in finding your e-mail subscription link or newsletter service. Do you've any? Please allow me recognize in order that I may just subscribe. Thanks.


obat herbal kanker prostat
Sunday, September 17, 2017 9:51 PM by obat herbal kanker prostat

Somebody essentially assist to make seriously posts I'd state.


obat darah tinggi herbal alami
Monday, November 06, 2017 8:01 PM by obat darah tinggi herbal alami

Your publish had provided me with another point of view on this topic. I had simply no idea that things can work with this manner as well. Thank you for sharing your opinion.


obat herbal stroke
Monday, November 06, 2017 8:01 PM by obat herbal stroke

I would really like to appreciate your effectively written content its useful and your writing design helped me to this with absolutely no difficulty. Many thanks


obat herbal kanker prostat
Monday, November 06, 2017 8:02 PM by obat herbal kanker prostat

I found useful information on this topic as I'm taking care of an enterprise project. Warm regards posting relative information and it's currently becoming easier to complete this project




Post a Comment:

Comment Title (required)

Your Name (optional)

Your Email (optional)

Your Web Site (optional)

Your Comment (required)

 

 

 

 

 

 

 

Syndication RSS 2.0 RSS 2.0

All My Blogs:
My personal blogs:
Dev and Publishing Dev and Publishing
Travel and Internat. Living Travel and Internat. Living
Other blogs I contribute to:
Milos Blog (US) Milos Blog (US)
VFPConv. Dev Blog (US) VFPConv. Dev Blog (US)
VFPConv. Dev Blog (DE) VFPConv. Dev Blog (DE)

 

Blog Archives
All Blog Posts

2007
    August (1)
    July (1)
    June (2)
    January (1)
2006
    December (1)
    November (2)
    October (1)
    August (1)
    April (3)
    March (3)

 

 

 

This Blog is powered by MilosTM Collaboration Components.