BigBastis Blog

VB.NET: Saubere Klassen erstellen mit Properties

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

VB.NET: Saubere Klassen erstellen mit Properties

Posted on .

Heutzutage wird fast nurnoch Objektorientiert programmiert. Das bedeutet, dass ein größeres Projekt schnell mal auf eine Klassenanzahl von 100 und mehr wächst.

Damit man den Überblick behält und den Code, den man schon geschrieben hat möglichst wiederverwenden kann, sollte man ein paar grundlegende Regeln beachten.

In diesem Artikel möchte ich ein Beispiel zeigen, wie man eine Klasse in ein Projekt integriert und dank der benutzten Standardmethoden an ein Datagrid bindet.

Warum schreibe ich diesen Artikel überhaupt? Erst gestern habe wurde in einem Forum die Frage gestellt, warum man eine Liste (Of T) nicht als DataSource für ein DataGridView benutzen kann. Dabei ist das sehr wohl möglich, der User hat seine Klasse aber „unschön“ gestaltet, weswegen sich die anderen Steuerelemente auch quer gestellt haben.

Hier ein Beispiel einer solchen „Unschönen“ Klasse:

Public Class Auto
    Public marke As String
    Public motor As String
    Public geschw As Integer
End Class

        Dim al As New List(Of Auto)
        al.Add(New Auto With {.marke = "VW", .motor = "Diesel", .geschw = 0})

        al(0).geschw += 10

Wie man sieht sind hier alle Klassenvariablen öffentlich zugänglich, und die Klasse hat keinerlei Kontrolle darüber, wie sie befüllt werden. Ein weiterer Nachteil ist auch die Inkompabilität zu anderen Steuerelementen, da diese einen Standardkonformen Aufbau der Klasse erwarten. Finden sie bestimmte Elemente in der Klasse nicht so verweigern diese die Funktionalität!

Wie müsste diese Klasse also umgebaut werden, damit diese kompatibel zu anderen Objekten wird?

Public Class Auto
    Private geschw As Integer

    Public Sub New(ByVal marke As String, ByVal motor As String)
        Me.Marke = marke
        Me.Motor = motor
    End Sub

    Private _marke As String
    Public Property Marke() As String
        Get
            Return _marke
        End Get
        Set(ByVal value As String)
            _marke = value
        End Set
    End Property

    Private _motor As String
    Public Property Motor() As String
        Get
            Return _motor
        End Get
        Set(ByVal value As String)
            _motor = value
        End Set
    End Property

    Public Sub beschleunigen(ByVal a As String)
        geschw += a
    End Sub

    Public Sub bremsen(ByVal a As String)
        geschw -= a
    End Sub
End Class

Wie man sieht ist die Klasse nun natürlich um einiges länger geworden. Leider kann man das zur zeit noch nicht anders machen. Aber Abhilfe kommt in der neuen VB.NET Version, wo man die properties so wie in C# 3.0 erstellen kann.

Die Zugriffe auf die Klassenvariablen werden nun über properties gesteuert, die nun auch zB. überprüfen könnten, ob der übergebene Wert überhaupt passt und gegebenenfalls noch Änderungen daran vornehmen.

Aber was bringt uns nun dieser längere Aufbau der Klasse? Nun, wenn wir unser Objekt, das aus dieser Klasse entsteht an andere Objekte übergeben, erwarten diese, dass sie properties vorfinden, mit denen sie arbeiten können.

Hat die Klasse keine Properties so können wir auch bestimmte Funktionen auch nicht benutzen. Ich möchte das mal an einem DataGridView demonstrieren, da dieses Element von den properties sehr schön Gebrauch macht!

Fügt man folgenden Code einem Form mit einer DataGridView hinzu:

    Private Sub Form1_Load() Handles MyBase.Load
        Dim autos As New List(Of Auto)

        autos.Add(New Auto("VW", "Diesel"))
        autos.Add(New Auto("Audi", "Benziner"))
        autos.Add(New Auto("Mercedes", "Diesel"))
        autos.Add(New Auto("Renault", "Diesel"))
        autos.Add(New Auto("BMW", "Beziner"))

        Dim bs As New BindingSource
        bs.DataSource = autos

        Me.DataGridView1.DataSource = bs
    End Sub

erhält man folgendes Bild:

datagridviewBild 1: Die Datagridview stellt alle Informationen angenehm dar

Wie man sieht konnte man mit nur 3 Zeilen Code (Abgesehen vom Erzeugen der Werte) alle Daten der Liste visualisieren. Man beachte desweiteren, dass sogar die Namen der Properties (Marke und Motor) ausgelesen werden und der richtigen Tabelle zugeordnet werden!

Dies könnte man natürlich auch ohne Properties hinbekommen, doch würde man viel mehr Aufwand betreiben müssen und man denke an die Zukunft, in der unser Modell sehr einfach zu warten wäre.

Hier gibts ein kleines Demoprojekt: Download [VS 2008]

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author bigbasti87

Posted at 10:26 9. Dezember 2009.

Bloggd: VB.NET: Saubere Klassen erstellen mit Propertys – http://blog.bigbasti.com/vb-net-saubere-… #vb #net

user

Author Ramires Shannar

Posted at 23:41 11. Mai 2010.

Der Eintrag ist zwar schon älter, aber ich habe trotzdem ne Frage: Wieso weisst du in der Sub New me._marke den Wert marke zu und nicht der Property Marke, die dann ja _marke setzten würde…denn so wie du das jetzt gemacht hast hättest du dir die Props sparen können.

Also: Marke = marke
und nicht me._marke = marke

Gruß Ramires

user

Author admin

Posted at 08:28 12. Mai 2010.

Hallo Ramires,
du hast vollkommen recht, man sollte die dem Konstruktor übergebenen Werte in jedem Fall über die Properties zuweisen.
Danke für den Hinweis, wurde korrigiert!

user

Author Denix

Posted at 00:11 20. Mai 2010.

Cool! 🙂 …und wie löscht man Einträge aus dem DataGridView und der Klasseninstanz?
Ich komm da echt nich weiter… 🙁

Gruß
Denix

user

Author Jerry

Posted at 15:08 5. September 2011.

Ja?

user

Author Anton

Posted at 22:01 22. März 2012.

Wenn ich eine Klasse erzeuge, die von einem Steuerelement, z.B.: Button, abgeleitet ist, diese mit Propertys erstelle und die Klasse im Designer zu ’ner Form hinzufüge, dann sehe ich in der Eigenschaftenseite/ dem Eigenschaftenfenster, die Propertys, darunter auch meine definierten.
Meine eigenen Propertys stehen dabei aber immer in der Kategorie „Sonstiges“
Kann man das ändern? Kann man auch solche Sachen wie Enabled setzen, dass einige Eigenschaften dann grau hinterlegt sind?
Ist es auch möglich, andere, geerbte Propertys aus der Eigenschaftenseite zu „verbannen“?

user

Author Hermann

Posted at 22:13 17. August 2012.

Du kannst deine eigenen Propertys auch in Kategorien einteilen, indem du vor das „Property …“ einfach (in die vorhergehende Zeile) schreibst:
_

Bei KATEGORIE trägst du halt eine schon vordefinierte Kategorie ein oder gibst einen neuen Namen an, dann erstellt er eine neue Kategorie.
Nur wie das mit dem verbannen geht, weiß ich nicht.
Aber ich denke, es sollte möglich sein, das zu bewerkstelligen 🙂

user

Author Hermann

Posted at 22:15 17. August 2012.

sorry, hier noch mal richtig:
das musst du vor die Property schreiben:
_

Kommentar verfassen

View Comments (8) ...
Navigation