vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Frage 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel