Fragestellung zur Variablenoptimierung

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Fragestellung zur Variablenoptimierung

    Moin!

    ich habe die Tage wieder etwas mit einem Dialog gearbeitet und irgendwie ist mir so, als wenn ich etwas Suboptimal mit den Variablen gearbeitet habe.

    Deshalb frage ich Euch heute mal: "Wie macht man das eleganter?"

    Ich stricke meinen Beispiel-Code einfach einmal etwas aus der Erinnerung - ohne groß eine IDE hier zur Hand zu haben.

    Fange ich einfach mal an.

    Ich habe eine Klasse mit einigen Variablen die ich im weiteren verarbeiten will. Nun komme ich an die Stelle wo einen Dialog aufrufe und meine Werte an die Form übergebe.

    VB.NET-Quellcode

    1. Sub Main()
    2. AutoTyp wird als ENUM angelegt.
    3. Produktname ist ein Textfeld
    4. 'Ausstattungsmerkmale
    5. Mit_Sitzheizung as Boolean=false
    6. Mit_GPS as Boolean=false
    7. Mit_Anhängerkupplung=false
    8. 'dann wird der Dialog aufgerufen
    9. Dim f as frm_Fahrzeugparameter
    10. with f
    11. ' jetzt übergebe ich die Parameter alle an die globalen Variablen, die ich in der Form hinterlegt habe.
    12. ' hier kann ich mit globalen Parameter in der Form arbeiten und diese setzen / auslesen bis irgendwann der dialog mit dispose wieder zerstört wird.
    13. ' ...
    14. f.showdialog
    15. ' wenn der Dialog geschlossen wird, dann lese ich die globalen Variablen aus der Form wieder aus und weise diese meinen Variablen in der Klasse wieder zu
    16. end with



    In der Form werden dann mit dem Load-Event erst einmal alle Variablen den Steuerelementen zugewiesen.

    Wenn sich Werteänderungen ergeben, dann werde die aktuellen Steuerelementwerte wieder den globalen Variablen oder den Properties zugewiesen.

    Alternativ werden irgendwann dann bei einem Dialogabschluss die aktuellen Steuerelementwerte wieder den globalen Werten zugewiesen - auch zum Beispiel noch nach einer logischen Prüfung.


    Alles das was ich jetzt einfach einmal so hingeschrieben habe sieht nicht nur wirr aus - es macht für mich auch einen gleichen Eindruck und birgt eine Menge von möglichen Fehlern. Insbesondere was die Verarbeitung von Werten in Verbindung mit Klapplisten, Radiobutton und Checkboxen.

    Wie geht es besser und optimaler - das ist eigentlich meine Frage?

    Gruß Jan

    PS: bin gespannt, ob sich überhaupt einer mit dem Text auseinander setzt und mich nicht gleich auf den Index. :cursing:
    Hallo

    jan99 schrieb:

    Wie geht es besser und optimaler - das ist eigentlich meine Frage?

    Lege dir eine Klasse an.

    VB.NET-Quellcode

    1. 'Code aus dem Kopf
    2. Public Class Vehicle
    3. Public Property VehicleName as String
    4. Public Property VehicleType as EnumVehicleType
    5. Public Property HasHeatedSeats as Boolean
    6. Public Property HasGps as Boolean
    7. End Class


    Dann erstellst du eine Instanz eines Fahrzeugs und übergibst diese an den Dialog.

    VB.NET-Quellcode

    1. dim v as new Vehicle() With {.VehicleName = "Golf",.VehicleType = EnumVehicleType.Combi}
    2. Dim f as New frm_Fahrzeugparameter(v)
    3. f.showDialog()


    So würde ich es machen, aber ich würde Ausstattungen auch in einer List(Of Equipments) führen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    erst einmal vielen Dank.

    Soll die Klasse Vehicle auch die weitere Programmlogik enthalten oder nur für die Parameter sein?

    Für die Ausstattungen meinst Du List(of String, Boolean) - Bezeichung , Ja oder Nein ??

    Und dann wie machst Du das mit den Variable-Zuweisung? Erst wenn Aktion ist, dann werden die Controls ausgelesen und den Variablen wieder zugewiesen oder bei jedem Radiobutton wechsel etc.?

    Zum Schluss noch ...

    Muss v nicht als Referenz übergeben werden?

    Gruß Jan

    jan99 schrieb:

    Soll die Klasse Vehicle auch die weitere Programmlogik enthalten oder nur für die Parameter sein?

    Wenn es für ein Vehicle Logik gibt wäre das Ideal.

    jan99 schrieb:

    Für die Ausstattungen meinst Du List(of String, Boolean) - Bezeichung , Ja oder Nein ??

    Ne, ich würde ne List(Of Equipment) machen. Also wieder eine Klasse. Und diese kann dann Properties enthalten. Boolean ist nicht notwendig. Da kommen dann (ich würde es so machen) sowieso nur Ausstattungen rein welche das Auto hat. Also brauchst du kein True oder False ob es die Ausstattung hat. Wenn du ein Prospekt von einem Auto in der Hand hast stehen dort auch nicht ALLE Ausstattungen drinnen die es so auf dieser Welt gibt, sondern nur die, die das Model hat.

    Aber das kannst du Handhaben wie du willst. Der Vorteil eine "Equipment" Klasse ist das du dort jederzeit Eigenschaften hinzufügen kannst. Wert der Ausstattung, zus. Gewicht, Attribute usw.

    jan99 schrieb:

    Und dann wie machst Du das mit den Variable-Zuweisung?

    Wie sonst auch, ich Arbeite unter WPF, dort kann ich einfach alles Binden, du musst unter WinForms eben dann die Eigenschaften auf die Controls übertragen.

    jan99 schrieb:

    Muss v nicht als Referenz übergeben werden?

    Ist unter Vb.Net sowieso der Default.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    List(Of Equipment)


    das verstehe und kenne ich bisher gar nicht! Finde ich direkt auch bei google nicht! :(

    Byval - Werte werden als Parameter an eine Sub gegeben und in der aufrufenden Funktion NICHT geändert, wenn diese in der Sub geändert werden.

    Byref - Werte werden als Parameter an eine Sub gegeben und in der
    aufrufenden Funktion MIT geändert, wenn diese in der Sub geändert
    werden.

    So habe ich das bisher verstanden und war der Meinung byval ist default.

    Bestätigung finde ich in ByVal und ByRef - was macht jetzt genau was

    mit

    ByVal

    Info: Wenn ihr bei einem Parameter weder ByVal noch ByRef angebt, so wird automatisch ByVal angenommen.

    Bei ByVal wird der übergebene Wert "By Value" übergeben, das heißt er wird kopiert. Schauen wir uns an, was das für Wertetypen und für
    Referenztypen zur Folge hat.

    Gruß Jan

    jan99 schrieb:

    das verstehe und kenne ich bisher gar nicht! Finde ich direkt auch bei google nicht!

    Eine List(Of T) findest du nicht?
    docs.microsoft.com/en-us/dotne…t-1?view=netframework-4.8

    Equipment ist einfach das Englische Wort für Ausstattung. Das stellt die Klasse dar welche ICH erstellen würde. Und ein Vehicle (Auto) hat eine Liste von Equipment (Ausstattung).

    Dein verständnis zwischen ByVal und ByRef ist soweit richtig. Ich bin aber der Meinung das der Compiler ByRef nimmt wenn nichts angegeben wird.
    Zumindest in diesem Fall. Da hier Klasseninstanzen verwendet werden.

    Habe auch gerade einen schnellen Screenshot für dich:



    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Ich bin aber der Meinung das der Compiler ByRef nimmt wenn nichts angegeben wird.
    Nee. Ist ByVal

    Objekte werden aber trotzdem mit ByVal modifizierbar, weil keine Objektkopie erstellt wird, sondern nur eine Kopie auf die Instanzenreferenz, also quasi auf den Zeiger, um es in C-Manier zu sagen - so ungefähr -> das Objekt wird auch in der Sub abänderbar. Ein überraschendes Ding dazu hatte Gonger96 in meinem Thread gefunden, dass man manchmal auch Objekte explizit per ByRef übergeben muss.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ja bin ich jetzt doof.

    Ich verwende Klasseninstanzen immer so und verändere diese.
    OK, ich arbeite nicht unter WinForm sondern WPF und Binding, aber wenn ich eine Instanz einer Klasse an eine andere übergebe ändern sich immer an beiden Stellen die Properties. Das meinte ich.

    Also bei Klasseninstanzen war ich immer der Meinung das ByRef genommen wird. Ich habe mich wohl falsch ausgedrückt, Sorry. Aber wie man sieht am Screenshot ist es wohl so.

    Wenn ich eine Klasseninstanz in ein anderes ViewModel reinreiche und im zweiten ViewModel Werte darin ändere, ändern sich diese an beiden Stellen geändert, und ich muss hier nich explizit ByRef angeben.

    Bin ich heute komplett doof, ok war ein harter Tag aber dennoch. ?(

    @VaporiZed
    Sorry, gerade nochmals den Satz darunter gelesen. OK. Sprich, ich habe es immer so angesehen was Klasseninstanzen betrifft weil es ja im Grunde das selbe ist wie wenn ich ByRef übergeben. I know - ist nicht das selbe, es wirkt sich im Endeffekt aber gleich aus.
    Ich dachte aber ehrlich das bei Klasseninstanzen immer ByRef der Default ist. Sonst nicht, aber bei Klasseninstanzen schon. Nun weis ich auch warum :thumbsup:
    Da sieht man wieder - wenn mans nicht lernt gell. Aber es wirkt sich eben so aus, und deshalb hatte ich es immer so im Kopf.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()

    Nofear23m schrieb:

    wenn ich eine Instanz einer Klasse an eine andere übergebe ändern sich immer an beiden Stellen die Properties
    Passt ja auch. Liegt aber nicht an dem vermeintlichen default-ByRef, sondern daran, dass Du ne Klasseninstanz übergibst. Wie gesagt, da wird dann nicht die Klasseninstanz als Parameter in die aufgerufene Sub eingefügt (das wär ja nur ne Kopie, die 1. viel Overhead erzeugen würde und 2. die bei Änderungen das Original unbeeindruckt lässt), sondern es wird der Zeiger auf die Klasseninstanz übergeben und somit kopiert. Aber egal ob Originalzeiger oder Kopie des Zeigers, der zeigt ja immer noch auf die Originalobjektinstanz. Und daher kann mithilfe des Kopiezeigers das Original manipuliert werden. Alles gut also. Nur bei primitiven Typen sieht man eben die Wahrheit, dass ByVal default ist.

    ##########

    Ah, die Erklärung hätte es gar nicht gebraucht, sehe ich gerade in Deinem Edit.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Nur bei primitiven Typen sieht man eben die Wahrheit, dass ByVal default ist.

    Genau, das wusste ich auch.

    Ich dachte nur der hier dann der Unterschied liegt.
    Ist aber natürlich logisch mit dem Zeiger. Mir war schon klar das bei Primitiven Typen ByVal als Default gilt (wie gesagt, ich hatte mir oben falsch ausgedrück mit dem was Standard ist).
    Dachte aber eben das bei Klasseninstanzen dann ByRef als Default gilt weil ich es eben so kenne. Jetzt weis ich es besser. Jetzt klingt es SEHR logisch, wusste ich aber bis Dato wirklich nicht (bitte nicht steinigen).

    Vor vielen Jahren (an den anfängen der OOP) ist es mir einfach mal aufgefallen und ich hab das in meinem Hirn einfach so gespeichert das hier wohl ByRef gilt. Fertisch. Fehler wie man sieht. :D
    Juhuuu, wieder was gelernt.

    Aber das Fazit ist. Mein ursprünglicher Code passt trotzdem. Man muss nicht ByRef schreiben. Basta! ;)

    Grüße und Danke nochmals fürs aufklären @VaporiZed
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Ich bin aber der Meinung das der Compiler ByRef nimmt wenn nichts angegeben wird.
    Das war in Nicht-Net-Basic-Dialekten (VB x) BASIC PDS unter DOS üblich.
    Bei .NET wurde dann vieles an C++ angeglichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Von den Programmiersprachen, die ByRef als Standard verwenden, sind nur noch VBS und VBA übrig geblieben.
    Und das auch noch abhängig vom Aufruf.
    msxfaq.de/code/byval.htm

    Selbst VB6 hat meines Wissens schon ByVal als Standard. Falsch (s.u.)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Habe schon ewig nichts mehr mit VB6 gemacht.
    Hab's nochmals nachgelesen.
    Du hast recht: ByVal wurde erst mit VB.Net zum Standard.

    Bei der Gelegenheit stellte ich fest, dass ich 2008 mein letztes VB6-Projekt auf VB.Net redesigned hatte und die virtuelle Maschine mit der VB6-Entwicklungsumgebung gar nicht mehr existiert.
    Auch gut. Werd's wohl nie wieder brauchen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --