| |
VB.NET - Ein- und UmsteigerFrage zu Parametern | | | Autor: River_S0ng | Datum: 16.01.19 19:18 |
| Hallo zusammen,
zuerst einmal ich bin neu hier und auch noch recht unerfahren mit VB.NET.
Ich arbeite seit ein paar Monaten an einem Projekt, bei dem ich ein Programm von einer Monolith-Struktur (das Programm hat jemand anders geschrieben) in eine vernünftige Architektur umstelle. Das verteilen der Subroutinen/Funktionen habe ich grob so gemacht:
Eine Solution mit den Projekten "Gui", "Logic", "Data" und "Shared". Gui kann auf alles zugreifen, Logic kann auf Data und Shared zugreifen, Data kann nur auf Shared zugreifen und Shared kann auf gar nix zugreifen.
So weit, so gut. Probleme gibt es jetzt aber, wenn Subroutinen in Logic und Data mit Werten arbeiten, die in Gui generiert werden (z.B. will Sub1 aus Data mit einem SelectedListViewItem aus Gui arbeiten).
Ich kann hier ja mit Parametern arbeiten (also Sub1 in Data arbeitet mit Parameter1 und wenn in Gui Sub1 ausgeführt wird, wird der Wert dann dort übergeben), aber das wurde mir jetzt ziemlich schnell ziemlich unübersichtlich. Wenn Sub1 aus Data Parameter1 benutzt, Sub1 aber nur in Sub2 aus Logic benötigt wird und Sub2 dann in Sub3 in Gui benutzt wird muss ich den Parameter1 bis zu Gui mitschleppen. Packt noch ein paar Subs und Parameter dazu und die Fehler werden mehr statt weniger.
Ich hoffe, das hat man jetzt verstanden. Ich möchte wissen, ob ich wirklich den/die Parameter bis zu Gui mit schleppen muss oder ob es eine bessere Lösung gibt.
Dankeschön und Viele Grüße | |
Re: Frage zu Parametern | | | Autor: Manfred X | Datum: 17.01.19 08:13 |
| Hallo!
Beim objektorientierten Progranmmieren hängt alles davon ab,
daß man eine geeignete Klassenstruktur entwirft.
Ein weiterer Gesichtspunkt ist die Gliederung des Programms
in verschiedene Ebenen, z.B.
GUI <- Datenmanagment <- Datenquellen <- externe Datenbasis
Vermutlich ist das von Dir übernommene "Monolith"-Projekt völlig
anders aufgebaut.
Ich vermute, die "untergeordneten" Projekte sind DLLs und
die GUI ist Win.Forms bzw. WPF.
Dein Denken in Subs (sind eigentlich Klassenmethoden) führt tatsächlich
schnell in den "Abgrund". Du solltest bestimmte Verarbeitungsfunktionalitäten
in Klassen zusammenpacken und jeweils innerhalb der Klassen die Verarbeitung
der Daten durchführen.
Ich vermute, Du nutzt überwiegend Standardmodule in DLLs.
Deine Vorgehensweise ist ein erster Schritt, um die Sub-Aufrufe zu entflechten
und um einen Überblick über Abhängigkeiten zu bekommen.
Um eine besser zu wartende Ordnung in den Code zu bekommen,
würde ich jetzt versuchen, die GUI von den Datenquellen
zu trennen und die Datenbindung einzusetzen.
Des weiteren würde ich als Zwischenschritt Datenklassen entwerfen, mit deren
Instanzen bestimmte sachlich zusammengehörige Datenpakete zwischen den Klassen,
die für die Datenverarbeitung eingesetzt sind, transportiert werden können -
eventuell Klassenreferenzen als Parameter von Subs in Standardmodulen.
Übrigens - schlechte Nachricht:
das sukzessive Umbauen eines umgangreichen Projekts erfordert
so viel Aufwand für das wiederholte Testen, daß oft ein völliger
Neuaufbau sinnvoller (effizienter) ist, wobei der vorhandene Code einzelner
Subs zu einer Methode in einer Klasse werden kann.
Beitrag wurde zuletzt am 17.01.19 um 08:20:12 editiert. | |
Re: Frage zu Parametern | | | Autor: River_S0ng | Datum: 17.01.19 17:52 |
| Hallo,
erst einmal danke für die ausführliche Antwort.
Das ursprüngliche Programm war einfach nur eine Solution mit einem Projekt in dem einfach alle Forms und ein paar Klassen reingeschaufelt wurden.
Ich hab daraus jetzt eine Solution mit den Projekten Gui, Logic, Data und Shared gemcht. Gui verfügt über die Forms ohne jegliche Logik und Datenbankaufrufe, also alle was zum Ausbau der Benutzteroberfläche gebraucht wird.
Logic enthält DLLs mit der Logik und Data DLLs mit den Datenbankaufrufen.
Mir ist nicht ganz klar, wie eine Trennung der Gui von den Datenquellen in der Praxis aussehen soll und was du mit Datenbindung meinst.
Wenn eine Klasse in Logic wissen muss, welcher Eintrag in der Liste einer Form in der Gui ausgewählt wurde, damit z.B. ein Eintrag in die Datenbank erstellt wird, dann muss diese Klasse doch irgendwie auf Gui zugreifen oder aber sie arbeitet mit einem "Platzhalter". Hab ich da einen Denkfehler? | |
Re: Frage zu Parametern | | | Autor: Manfred X | Datum: 17.01.19 21:32 |
| Hallo!
Beispiel für Datenbindung
Die Controls der Benutzeroberfläche sollten keine Daten enthalten.
Die Datenbindung erfolgt gewöhnlich durch eine Instanz der Bindingsource-Klasse,
die zwischen Control und Datenquelle geschaltet ist.
Das aktuell aktive Element einer Datenauflistung kann der "Position"-Eigenschaft
entnommen werden.
Packe Deine Daten in geeignete Datenklassen (z.B. Datatable, generische Liste) und
binde sie an Bindingsourcen.
Die Klasse in Logic kann eine Referenz der Bindingsource erhalten (Übergabe an
eine Klassen-Property) und dort z.B. die Position abfragen oder setzen. | |
Re: Frage zu Parametern | | | Autor: River_S0ng | Datum: 17.01.19 23:27 |
| Hallo,
ok das mit den BindingSources leuchtet mir ein aber ich weiß noch nicht, wie ich die Infos, die in den BindingSources gespeichert werden zu Logic transportiert bekomme.
Logic und Data dürfen keinen Verweis zu Gui haben, weil ich sonst Ringabhängigkeiten baue. Und die Datenklassen mit den BindingSources müssen ja wohl in Gui sein, denn da entsteht die Information (aktuelles Element). | |
Re: Frage zu Parametern | | | Autor: Manfred X | Datum: 18.01.19 06:29 |
| Hallo!
Hier ein Beispiel (Konsolenanwendung),
wobei die Standard-Module als Repräsentanten für DLLs stehen.
Module xxxDataModule
Public Class xxxDataClass
'Datenquelle und Bindung
Private _data As New DataSet
Private WithEvents _binding As New BindingSource
'Öffentliches Ereignis bei Positionswechsel in Tabelle
Public Event RowPositionChanged()
Public Sub SelectData(ByVal SelectCommand As String)
'Hier ein Dataset aus der Datenbank füllen
'unter Nutzung des als Parameters übergebenen Select-Kommandos
'.........
'Statt dessen einige Testdaten per Code
_data.Clear()
_data.Tables.Add(New DataTable With {.TableName = "Testdaten"})
With _data.Tables("Testdaten")
.Columns.Add("Key", GetType(Integer))
.Columns.Add("Date", GetType(DateTime))
.Columns.Add("Text", GetType(String))
For i As Integer = 1 To 100
.Rows.Add(i, Now.AddDays(i), "Satz " & i.ToString)
Next i
End With
'Datenbindung
_binding.DataSource = _data.Tables("Testdaten")
End Sub
Private Sub _binding_PositionChanged(sender As Object, e As EventArgs) _
Handles _binding.PositionChanged
RaiseEvent RowPositionChanged() 'Ereignis nach außen weiterreichen
End Sub
Public ReadOnly Property DataBinding() As BindingSource
Get
Return _binding 'Datenbindung abfragen
End Get
End Property
End Class
'Die öffentlich zugreifbare Instanz der Datenklasse
Public Data As New xxxDataClass
End Module
Public Class xxxGUIForm
Inherits System.Windows.Forms.Form
Private Datagrid As New DataGridView
Private Sub InitializeComponent()
Me.SuspendLayout()
'
Me.ClientSize = New System.Drawing.Size(350, 500)
Me.Name = "xxxGUI"
Me.ResumeLayout(False)
Datagrid.Parent = Me
End Sub
Private Sub xxxGUI_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
InitializeComponent()
With Datagrid
.Dock = DockStyle.Fill
'Control an Dateninstanz binden
.DataSource = xxxDataModule.Data.DataBinding
End With
End Sub
End Class
Public Module xxxDataAccessModule
Public Class xxxDataAccess
Public Sub New()
'Ereignishandler zuordnen
AddHandler xxxDataModule.Data.RowPositionChanged,
AddressOf rowpositionchanged
End Sub
Private Sub rowpositionchanged()
Dim pos As Integer = xxxDataModule.Data.DataBinding.Position
Console.WriteLine("Aktuelle Position: " & pos.ToString)
End Sub
End Class
'Hier Datenverarbeitungs-Funktionen einbauen
'......
End Module
Public Module xxxMain
Public Sub main()
'Dateninstanz füllen (Testdaten)
xxxDataModule.Data.SelectData("xxxx")
'Datenzugriffsklasse erstellen
Dim DataAccess As New xxxDataAccess
Using Gui As New xxxGUIForm
Gui.ShowDialog()
End Using
End Sub
End Module | |
Re: Frage zu Parametern | | | Autor: River_S0ng | Datum: 18.01.19 22:08 |
| Wow, vielen Dank für deine Mühe, das hilft mir sehr gut weiter! | |
| 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 |
|
|
Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|