OOP Public Property usw...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    OOP Public Property usw...

    Hey

    Ich muss nochmal etwas über die OOP und Public Propertys wissen.
    Wann macht es Sinn oder kein Sinn ( zu viel code oder ähnliches ) in Property zu stecken oder einfach nur auf Public zu setzen.

    Beispiel mein Project ( eine Art von Haushaltsbuch Einnahmen / Ausgaben ), wo Datensätze aus einer Datenbank gelesen und geschrieben werden.
    Ich habe mal etwas code geschrieben um es hoffe ich verständlich zu machen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class AppClass
    2. 'Private Objecte
    3. Private firstload As Integer 'legt fest ob das Programm zum ersten mal gestartet wird
    4. Private saldo As Integer = 0 'legt fest ob Einnahme (1) oder Ausgabe (2)
    5. 'Globale Objecte
    6. Public Kat_ID As Integer 'aus der DB Kategorie, auswahl über Combobox
    7. Public Zahlart_ID As Integer 'aus der DB Zahlungsart, auswahl über Combobox
    8. Public MwSt As Integer 'legt den MwSt Satz fest
    9. Public Property int_Saldo As Integer
    10. Get
    11. getsettings()
    12. Return saldo
    13. End Get
    14. Set(value As Integer)
    15. saldo = value
    16. End Set
    17. End Property
    18. Public Property int_First As Integer
    19. Get
    20. getsettings()
    21. Return firstload
    22. End Get
    23. Set(value As Integer)
    24. firstload = value
    25. savesettings()
    26. End Set
    27. End Property
    28. 'Objecte speichern
    29. Private Sub savesettings()
    30. My.Settings.firstload = firstload
    31. My.Settings.Save()
    32. End Sub
    33. 'Objecte laden
    34. Private Sub getsettings()
    35. My.Settings.Reload()
    36. firstload = My.Settings.firstload
    37. End Sub
    38. End Class


    Das frm_main Form

    VB.NET-Quellcode

    1. 'Einstellungen laden und prüfen ob erster Start
    2. Private Sub settings()
    3. If AppClass.int_First = 0 Then
    4. Using frm As New frm_first()
    5. frm.ShowDialog(Me)
    6. End Using
    7. End If
    8. End Sub
    9. 'Einstellungen speichern (Button ist nur zum testen!
    10. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    11. AppClass.int_First = 1
    12. End Sub

    Bilder
    • datatable-1.jpg

      84,96 kB, 516×201, 14 mal angesehen
    @Amelie Probier mal dies:

    VB.NET-Quellcode

    1. Public Class AppClass
    2. 'Private Objecte
    3. 'Globale Objecte
    4. Public Kat_ID As Integer 'aus der DB Kategorie, auswahl über Combobox
    5. Public Zahlart_ID As Integer 'aus der DB Zahlungsart, auswahl über Combobox
    6. Public MwSt As Integer 'legt den MwSt Satz fest
    7. Public Property int_Saldo As Integer
    8. Public Property int_First As Integer
    9. Public Sub New()
    10. getsettings()
    11. End Sub
    12. 'Objecte speichern
    13. Public Sub savesettings()
    14. ' das passiert eigentlich beim Beenden der exe
    15. My.Settings.Save()
    16. End Sub
    17. 'Objecte laden
    18. Private Sub getsettings()
    19. My.Settings.Reload()
    20. End Sub
    21. End Class
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Nunja in den Programm Settings steht diese firstload drin welche du ja nun entfernt hast
    Danach muss ich alles umbauen um die firstload zu speichern und wieder auszulesen.
    Das hilft mir aber leider nicht bei der Frage "wann" es ausreicht einfach nur Public xxxx As ... zu setzen oder alles als Public Property...

    Welchen Vorteil / Nachteil hat es zum Beispiel:

    Quellcode

    1. Public MwSt As Integer 'legt den MwSt Satz fest

    in ein Public Property zu packen?
    Denke ich gerade wieder zu verquer???

    Amelie schrieb:

    Wann macht es Sinn oder kein Sinn

    Das musst du für jeden Fall entscheiden.

    Bei Verwendung von Reflection gibt es Unterschiede. ob Property oder Variable
    Auf Propertys kann gebunden (DataBinding) werden, auf Variablen nicht
    Später eine Variable zu einem Property zu ändern ist ein "Breaking Change"
    Variablen können nicht "overrided" werden.
    Bei Propertys kann code im Getter oder Setter untergebracht werden und z.b. Prüfungen durchführen zu können.

    Um nur Beispiele zu nennen.

    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. ##

    Ich hätte da mal eine Antwort auf eine Frage, die du gar nicht gestellt hast.
    Nachdem ich kurz über deinen Code geflogen bin, hatte ich schon leichte Schluckbeschwerden bei der Zeile 4.
    Das ist ja nun wirklich kein Saldo, also die Unterscheidung einer Verrechnungs- oder Abrechnungsart.
    Nenn es doch auch so, also zum Beispiel Clearingtype.
    Saldo ist das was sich aus den Wertedifferenz beider T-Konto-Seiten ergibt aber nicht das Unterscheidungsmerkmal auf welche Seite es gehört.

    ErfinderDesRades schrieb:

    Erklär mal, was du mit "Breaking Change" genau meinst

    en.wiktionary.org/wiki/breaking_change

    ErfinderDesRades schrieb:

    Ich glaube nämlich nicht, dass das für Amelie relevant ist.

    Obs relevant ist oder nicht überlassen wir aber schön dem TE oder?
    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. ##

    Amelie schrieb:

    Nunja in den Programm Settings steht diese firstload drin welche du ja nun entfernt hast
    Nein.
    Ich habe eine private Variable firstload entfernt, weil sie nicht benötigt wird.
    Du arbeitest mit der Property int_First.
    Verstehe, was ich getán habe und was passiert ist. ;)
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, langsam.
    Habe ich eine Variable und möchte ich irgendwann eines der Angesprochenen Vorteile eines Properties nutzen gehe ich her und mach ein Property draus. Die Bibliothek hat sich also geändert, jeder entwickler der darauf zugreift muss seinen Code evtl. anpassen. Habe ich ein Property von Anfang an bin ich flexibel genug und es gibt keinen Grund in die andere Richtung zu gehen, also von einem Property zu einer Variable.

    Also riskierst du BrakingChanges nur weil du keine Property um diese Variable hast.

    Logisch irgendwie.

    Und bevor das jetzt kommt, ja ich weis nicht ob der TE etwas für andere Enwickler nach aussen reicht oder ob er das vor hat, du aber auch nicht das er es nicht vor hat. Insofern schreibe ich es mit rein.
    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. ##

    @RodFromGermany und ....

    So klar ist, das bei der einen Version ich direkt mit dem Objekt arbeite aber der anderen Version nur indirekt.
    Jetzt meine Frage, wann ist es "Sinnvoll" oder "unabdingbar" wie zu arbeiten?
    Gibt es da Richtlinien ...???? Vielleicht kann man das mal erklären? ;)


    Die Class
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class AppClass
    2. ' Private Objekte
    3. Private kategorie As Integer 'aus der DB Kategorie, auswahl über Combobox
    4. ' Öffentliche Objekte
    5. Public Property int_First As Integer 'prüfen ob erster start
    6. Public Property int_ZahlID As Integer 'aus der DB Zahlungsart, auswahl über Combobox
    7. Public Property int_KatID As Integer
    8. Get
    9. Return kategorie
    10. End Get
    11. Set(value As Integer)
    12. kategorie = value
    13. End Set
    14. End Property
    15. Public Sub New()
    16. getsettings()
    17. End Sub
    18. 'Objecte speichern
    19. Public Sub savesettings()
    20. My.Settings.firstload = int_First
    21. My.Settings.Save()
    22. End Sub
    23. 'Objecte laden
    24. Private Sub getsettings()
    25. My.Settings.Reload()
    26. int_First = My.Settings.firstload
    27. End Sub
    28. End Class


    Das mainForm

    VB.NET-Quellcode

    1. Dim AppClass As New AppClass
    2. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. check_firstload()
    4. 'Nur zum Testen
    5. Dim list As New List(Of String)
    6. list.Add("Lorem Ipsum-1")
    7. list.Add("Lorem Ipsum-2")
    8. list.Add("Lorem Ipsum-3")
    9. Cob_Kat.DataSource = list
    10. Cob_Kat.Text = "Bitte Auswählen"
    11. 'Nur zum Testen
    12. Dim list2 As New List(Of String)
    13. list2.Add("Lorem Ipsum-1")
    14. list2.Add("Lorem Ipsum-2")
    15. list2.Add("Lorem Ipsum-3")
    16. CoB_Zahl.DataSource = list2
    17. CoB_Zahl.Text = "Bitte Auswählen"
    18. End Sub
    19. ' Kategorieauswahl über ComboBox --- funktioniert
    20. Private Sub Cob_Kat_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cob_Kat.SelectedIndexChanged
    21. Dim k As New AppClass
    22. k.int_KatID = Cob_Kat.SelectedIndex
    23. lbl_katid.Text = CStr(k.int_KatID)
    24. End Sub
    25. ' Zahlungsauswahl über ComboBox --- funktioniert
    26. Private Sub CoB_Zahl_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CoB_Zahl.SelectedIndexChanged
    27. AppClass.int_ZahlID = CoB_Zahl.SelectedIndex
    28. lbl_zahlid.Text = CStr(AppClass.int_ZahlID)
    29. End Sub


    Jo, ich hakte ja nur an diesem pauschal-Satz ein:

    Nofear23m schrieb:

    Später eine Variable zu einem Property zu ändern ist ein "Breaking Change"
    isses eben nicht.
    Ist allenfalls ein Risiko, was zutreffen könnte.
    Wie hoch das Risiko kann allenfalls Amelie abschätzen, wenn sie soweit ist, die Szenarien, von denen wir reden, zu implementieren und zu verstehen.



    Amelie schrieb:

    Jetzt meine Frage, wann ist es "Sinnvoll" oder "unabdingbar" wie zu arbeiten?
    Gibt es da Richtlinien ...???? Vielleicht kann man das mal erklären?
    Nein, es gibt keine Richtlinien.
    Arbeite mit dem einen, wenn du des einen Features benötigst, arbeite mit dem anderen, wenn du des anderen Features benötigst.
    Folglich wäre wichtiger als die Frage nach Richtlinien, die Frage nach den Features, die das eine oder andere oder beide Konstrukte mitbringen.

    Du kannst zu 99% auch mit dem anderen (Property) arbeiten, wenn du nur des einen (Feld) Features benötigst - weil Property hat zum grössten Teil dieselben, nur ein paar Features mehr als Feld.

    An meiner Debatte mit NoFear siehste auch wieder unsere verschiedenen Einstellungen:
    Ich neige dazu, alles möglichst schlicht zu halten, und Probleme erst dann in Angriff zu nehmen, wenn sie da sind.
    NoFear neigt eher dazu, diversen Pattern zu folgen, auch wenn sie Probleme lösen, die garnicht da sind.

    Wie gesagt, es sind Neigungen - stärker oder schwächer ausgeprägt.
    Weil auch ich wende Pattern an, die Features mitbringen, die ich in dem speziellen Kontext vlt. nicht brauche.
    Und auch NoFear wendet nicht alle Pattern an, die's gibt, sondern manchmal löst auch er ein Problem erst dann, wenn es da ist.

    ;)

    Somit, wenn du mich nach Richtlinie zum Thema fragst, erhälst du vmtl. eine andere als von NoFear.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @Amelie Aus

    VB.NET-Quellcode

    1. ' Private Objekte
    2. Private kategorie As Integer 'aus der DB Kategorie, auswahl über Combobox
    3. Public Property int_KatID As Integer
    4. Get
    5. Return kategorie
    6. End Get
    7. Set(value As Integer)
    8. kategorie = value
    9. End Set
    10. End Property
    machst Du

    VB.NET-Quellcode

    1. Public Property int_KatID As Integer
    und feddich.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Kleine Anmerkung noch zu Public Field (Variable) und (ausformulierter, also ungekürzter) Property: Du kannst sehr viel schneller herausfinden, an welcher Stelle der Wert geändert wird. Eine Variable, die Public ist, kann (v.a. bei größeren Projekten) irgendwo versteckt im Code ungewollt geändert werden und Du suchst ewig, bis Du gefunden hast, wo die Änderung stattfindet. Bei ner Property läuft die Wertänderung über den Setter, also an zentraler Stelle. Und da kannst Du z.B. ne Stoppmarke setzen oder ein If-Konstrukt oder wasauchimmer, um den Zugriff und die Manipulation zu überwachen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Und nur als Tipp falls dir das.mehr an Tippaufwand nicht gefällt. VS bieter hierfür ja eine Hilfsfunktion an.

    Tippe "prop" und drücke 2x Tab
    Dann Variable benennen => Tab => Propertie benennen und Enter drücken.

    Fertig.
    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. ##

    Neu

    @VaporiZed
    Danke das war mal sehr hilfreich ;)

    @Nofear23m
    Nein es geht nicht um mehr Tipparbeit sondern darum was nötig ist und ob man Codezeilen sparen kann oder es sich unnütz umständlich macht.

    @ All Danke für die Hilfen und wie schon oft geschrieben; ich lerne noch und weil ich es "richtig" machen möchte, stelle ich oft für Profis blöde Fragen und mein Code ist oft für Euch zum ....
    Jeder hat mal angefangen ;)

    Neu

    Amelie schrieb:

    und ob man Codezeilen sparen kann

    eine Variable ist eine Zeile und ein Property auch. :huh:
    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. ##

    Neu

    Nochmal zum Verständnis im Sinne von OOP usw.

    Gibt es etwas zum ändern / verbessern?

    Spoiler anzeigen


    Im Form

    VB.NET-Quellcode

    1. Dim Money As New Money
    2. Private Sub RB_mwst1_CheckedChanged(sender As Object, e As EventArgs) Handles RB_mwst1.CheckedChanged
    3. Dim m As New Money
    4. m.int_Mwst = 0
    5. End Sub
    6. Private Sub RB_mwst2_CheckedChanged(sender As Object, e As EventArgs) Handles RB_mwst2.CheckedChanged
    7. Dim m As New Money
    8. m.int_Mwst = 7
    9. End Sub
    10. Private Sub RB_mwst3_CheckedChanged(sender As Object, e As EventArgs) Handles RB_mwst3.CheckedChanged
    11. Dim m As New Money
    12. m.int_Mwst = 19
    13. End Sub


    In der Class

    VB.NET-Quellcode

    1. Public Class Money
    2. ' Private Objekte
    3. Private kategorie As Integer 'aus der DB Kategorie, auswahl über Combobox
    4. Private zahlungart As Integer 'aus der DB Zahlungsarten, auswahl über Combobox
    5. Private ea_id As Boolean 'Einnahme True / Ausgabe False
    6. Private mwst As Integer 'Werte 0,7,19
    7. ' Öffentliche Objekte
    8. Public Property int_First As Boolean 'prüfen ob erster start
    9. Public Property int_Mwst As Integer
    10. Get
    11. Return mwst
    12. End Get
    13. Set(value As Integer)
    14. If frm_main.RB_mwst1.Checked = True Then
    15. frm_main.lbl_test.Text = CStr(value)
    16. ElseIf frm_main.RB_mwst2.Checked = True Then
    17. frm_main.lbl_test.Text = CStr(value)
    18. ElseIf frm_main.RB_mwst3.Checked = True Then
    19. frm_main.lbl_test.Text = CStr(value)
    20. Else
    21. 'efehler("mwst")
    22. 'Return
    23. End If
    24. End Set
    25. End Property

    Neu

    Wozu soll die IF Verzweigung im Setter sein wenn du immer wieder dem selben Feld immer das gleiche zuweist?
    Und... du setzt im Setter auch die Variable ​mwst nie, somit wird immer der Initialwert im Getter übergeben.

    Schau dir nochmal den sinn und die Verwendung von Properties an.

    Und warum wird in der Form immer wieder eine neue Instanz von Money erstellt?

    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. ##

    Neu

    @Nofear23m

    OK das mit der Instanz habe ich geändert.
    Money ist ja schon am Begin gesetzt. Das man das so wie ich es vorher hatte so macht, habe ich aus etlichen Tuts usw.

    VB.NET-Quellcode

    1. Private Sub RB_mwst1_CheckedChanged(sender As Object, e As EventArgs) Handles RB_mwst1.CheckedChanged
    2. Money.int_Mwst = 0
    3. End Sub



    EDIT:
    Hab ja etwas vergessen.
    So besser?

    VB.NET-Quellcode

    1. Public Property int_Mwst As Integer
    2. Get
    3. Return mwst
    4. End Get
    5. Set(value As Integer)
    6. mwst = value
    7. End Set
    8. End Property



    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Amelie“ ()