| |
VB.NET - Ein- und UmsteigerRe: Property mit Rückgabewert möglich? | | | Autor: FZelle (Moderator) | Datum: 31.08.12 09:45 |
| Naja, du musst den DLL Code selber ja nicht verstehen.
99% des Frameworks ist auch in C# geschrieben und z.b. WindowsForms Code würdest Du dann auch noch nicht verstehen, benutzt ihn aber.
Insofern ist doch das reine benutzen der DLL nicht schwieriger. | |
Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 23.08.12 15:52 |
| Nehmen wir einmal an, ich möchte eine Anwendung programmieren, die u.a. Artikeldaten speichert und bearbeitet... Dann müssten die eingegebenen Artikeldaten ja auch irgendwie verifiziert werden. Daher dachte ich mir, es sei eine gute Idee eine eigene Klasse "Artikel" anzulegen und die übergebenen Werte mittels Propertys zu prüfen.
Herausgekommen ist dabei folgende Klasse (stark gekürzt):
Public Class cArtikel
Private cArtNummer As Integer
Private cArtGruppe As Integer
' Hier kämen dann noch weitere Daten hinzu
Public Property ArtNummer As Integer
Get
Return cArtNummer
End Get
Set(value As Integer)
If value = 0 Or value > 999999 Then
' Fehlerhafter Wert
MsgBox("Artikelnummer fehlerhaft. Gültige Werte 1 - 999999", _
MsgBoxStyle.Critical, "Fehler")
cArtNummer = 0
Else
cArtNummer = value
End If
End Set
End Property
End Class Im Hauptprogramm hätte ich dann folgenden Code:
Dim myArtikel As New cArtikel
myArtikel.ArtNummer = 1234567 ' später natürlich kein fester Wert
' sondern aus Eingabefeld Das Ganze führt jetzt wie gewollt dazu, dass die in der Klasse definierte Fehlermeldung erscheint. Allerdings "merkt" das aufrufende Programm ja nichts davon, da es keine Rückmeldung gibt, dass im Set ein Problem bemerkt wurde.
Natürlich könnte ich anschließend prüfen, ob myArtikel.Artnummer = 0 ist, aber das erscheint mir irgendwie wenig elegant.
Die Prüfung aus der Klasse in die jeweilige Form zu verlagern allerdings auch nicht - zumal es dieses Prüfung später an diversen Stellen in diversen Forms geben wird.
Statt Propertys könnte man natürlich auch eine Function "checkArtNummer" die True oder False zurück gibt in die Klasse aufnehmen, aber deren Aufruf kann dann ja auch schon mal vergessen werden, wohingegen die Property auf jeden Fall ausgeführt wird und mir damit als der sicherere Weg erscheint.
Gibt es hier einen allgemeinen und eleganten Weg? Wie macht ihr als Profis das? | |
Re: Property mit Rückgabewert möglich? | | | Autor: keco | Datum: 23.08.12 17:25 |
| Der allgemeine und elegante Weg liegt im Ausnahmemechanismus. Das heißt, dass du in der Property eine Ausnahme auslöst, wenn der Wert ungültig ist. Du solltest übrigens auch prüfen, ob der Wert kleiner 0 ist, da Integer auch negative Zahlen haben darf.
Wenn der Wert zu klein oder zu groß ist, dann löst du eine ArgumentOutOfRangeException aus. Die Aufgabe besteht dann darin im Hauptprogramm auf die ungültigen Werte vor der Zuweisung zu prüfen. Damit erzwingst du sozusagen, dass nur richtige und gültige Werte übergeben werden dürfen. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 23.08.12 17:56 |
| Hallo Keco,
vielen Dank für Deine Antwort.
"Damit erzwingst du sozusagen, dass nur richtige und gültige Werte übergeben werden dürfen."
Genau das war mein Ziel - das wollte ich mit der Property erreichen.
Wenn Du mir jetzt noch sagst, wie man eine solche Exeption auslöst bin ich glücklich | |
Re: Property mit Rückgabewert möglich? | | | Autor: keco | Datum: 23.08.12 18:06 |
| Dafür gibt es die Throw-Anweisung. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 23.08.12 19:28 |
| Abermals Merci. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 23.08.12 20:16 |
| Ich stolpere gerade über folgenden Absatz von dir: "Die Aufgabe besteht dann darin im Hauptprogramm auf die ungültigen Werte vor der Zuweisung zu prüfen."
Also das mit der Exeption habe ich verstanden. Das scheint mir wirklich der eleganteste Weg zu sein.
Aber die Prüfung auf ungültige Werte wollte ich ja gerade durch die Property erledigen, da sie sicherlich an dutzenden von Stellen des fertigen Programms vorkommen wird. Wenn ich vorher, z.B. per Function, prüfe, dürfte es ja nie mehr zu der Exeption kommen... | |
Re: Property mit Rückgabewert möglich? | | | Autor: keco | Datum: 23.08.12 20:32 |
| Du kannst natürlich eine Methode schreiben, die die Daten validiert und entsprechend einen Boolean zurückgibt. Ob du das in der Klasse oder im Hauptprogramm erledigst steht dir im Grunde frei.
Dann müsstest du jedoch vor jeder Zuweisung zumindest diese Methode aufrufen und den Wert zuweisen, wenn die Daten richtig sind. | |
Re: Property mit Rückgabewert möglich? | | | Autor: keco | Datum: 23.08.12 21:31 |
| Wieso sind die Ausnahmen unelegant und trügerisch? | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 23.08.12 21:44 |
| Hallo und erst einmal Danke FZelle,
mit IDataErrorInfo und INotifyPropertyChanged habe ich mich noch nicht befasst, aber das werde ich morgen nachholen. Vielen Dank für den Denkanstoss. | |
Re: Property mit Rückgabewert möglich? | | | Autor: FZelle (Moderator) | Datum: 23.08.12 23:16 |
| Exceptions in Properties werden beim DataBinding häufig geschluckt.
Was machst du z.b. wenn die Daten durch einen ORMapper besetzt werden?
Willst du das der sofort aufhört, oder willst du dann über weitere Schalter das Auslösen der Exception verhindern.
Und o.g. Interfaces werden von vielen UI Elementen ( DGV z.b. ) von Haus aus unterstützt, auch unter WPF und Silverlight. | |
Re: Property mit Rückgabewert möglich? | | | Autor: FZelle (Moderator) | Datum: 23.08.12 23:17 |
| Ist ja in dem Link von dem Link ein simples Beispiel das zeigt wie einfach das ist. | |
Re: Property mit Rückgabewert möglich? | | | Autor: keco | Datum: 23.08.12 23:32 |
| Von DataBinding war keine Rede (oder ich habs überlesen). Ausnahmen für Properties sind auch im Framework (zumindest bei Controls) gängige Praxis. Aber hier gehts ja um eine Datenklasse - da hast du wohl recht. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 24.08.12 07:54 |
| Ja, habe ich gesehen und auch schon runter geladen. Gleich gehts mit frischem Kopf und ebensolchem Kaffee dran. Danke für die Hilfe. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 30.08.12 17:13 |
| Hallo FZelle,
leider konnte ich dein Beispiel nicht nachvollziehen, da es trotz Installation der notwendigen Controlls beim automatischen Konvertieren auf VB2010 zu Fehlern kommt, da sich die Version der Controls geändert hat.
Es wäre traumhaft, wenn Du Dein Beispiel noch einmal auf VB2010 (und mit Standard-Controls) anpassen könntest, denn ich würde das natürlich gerne verstehen, wie IDataErrorInfo und INotifyPropertyChanged arbeiten.
Zwischenzeitlich habe ich mir eine Alternative mit dem ErrorProvider erarbeitet und ich wüsste gerne was Du bzw. die anderen hier von dieser Varainte der Datenvalidierung halten.
In meiner Artikelklasse habe ich eine öffentliche Sub erstellt, der ich das aktuelle Control und den Errorprovider der aufrufenden Form übergebe...
Public Shared Sub ValidateArtName(ByVal ArtName As String, ctrl As Control, _
erp As ErrorProvider)
If ArtName = "" Or ArtName.Length > 30 Then
erp.SetError(ctrl, "Name fehlt oder ist zu lang")
Else
erp.SetError(ctrl, "")
End If
End Sub In meiner Hauptform habe ich folgenden Code:
Private Sub tbxName2_TextChanged(sender As System.Object, e As _
System.EventArgs) Handles tbxName2.TextChanged
cArtikel.ValidateArtName(tbxName2.Text, Me.ActiveControl, _
ErrorProvider1)
End Sub Vorteil der Sub in der Klasse ist aus meiner Sicht, dass ich diese Validierung von jeder Form und aus jedem Control heraus anspringen könnte. Sollte ich den Wert also später an sagen wir 5 verschiedenen Stellen eingeben können, könnte ich von jeder Stelle aus auf die Sub zugreifen und so immer mit demselben Code die Eingabe validieren. Doppelter Code wird vermieden, Die Validierung erfolgt immer gleich und der Errorprovider weist den Anwender auf den fehlerhaften Wert hin.
Oder freue ich mich völlig zu Unrecht und übersehe etwas grundlegendes? | |
Re: Property mit Rückgabewert möglich? | | | Autor: FZelle (Moderator) | Datum: 30.08.12 19:54 |
| Anhang: ValidationDemo.ZIP (26k) |
| Von shared Funktionen halte ich zur Validierung persönlich nichts.
Und es ist dann ja auch so das du das immer alles von Hand machen musst. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 30.08.12 20:50 |
| Klasse, vielen Dank für das Muster-Projekt. So langsam formt sich das Bild wie das funktioniert.
Aber wie heißt es so schön bei in der Sesamstrasse: Wer nicht fragt....
Daher frage ich mich was genau die Validation.DLL macht. Die kommt ja scheinbar von einem Dritthersteller und wird für die Validationrules benötigt...
Ist die Open Source? Darf ich bzw. jemand anders die verwenden? Gibt es eine Dokumentation dazu? | |
Re: Property mit Rückgabewert möglich? | | | Autor: FZelle (Moderator) | Datum: 30.08.12 21:13 |
| Anhang: Validation.ZIP (20k) |
| Ist mal vor Jahren aus einer sehr frühen Version von CSLA heraus entstanden, ist aber in C#. | |
Re: Property mit Rückgabewert möglich? | | | Autor: Schudi | Datum: 30.08.12 21:41 |
| Oh je...jetzt dachte ich, ich seh Licht am Ende des Tunnels, aber ich muss zugeben, dass ich bei dem Code aus der Validation.zip nur Bahnhof verstehe. Das ist noch 3 Nummern zu groß für mich.
Gibt es vielleicht auch eine "einfachere" Möglichkeit ohne die "Fremd-dll" die Prüfungen zu implementieren? Im Prinzip geht es ja immer nur um einfache Regeln, wie "darf nicht leer sein" "größer oder kleiner als" "email-adresse" "Telefonnummer" oder ähnliches.
Vielen Dank für Deine Hilfe. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|