Parameterübergabe an Funktion oder alle Events zu einem Eventhandler zusammfassen?

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Parameterübergabe an Funktion oder alle Events zu einem Eventhandler zusammfassen?

    Hallo,

    ich möchte bei meinem mit VB.NET programmierten Taschenrechner (Windows 7 Taschenrechner Nachbau in der Standard Ansicht) enthalten alle Zahlen den selben Code.
    Diesen Code möchte ich zusammenfassen, um mich nicht ständig zu wiederholen.
    Ist es besser, hierzu eine Funktion zu schreiben und ihr die jeweilige Zahl zu übergeben oder einen einzigen Eventhandler schreiben, der mehrere Events zusammenfasst?
    Warum das eine oder das andere? Was sind die Vor- und/oder Nachteile?

    Entweder Parameter an die Funktion übergeben:

    VB.NET-Quellcode

    1. ' klick 1
    2. Private Sub cmd1_Click()
    3. clickNr(1)
    4. END Sub
    5. ' klick 2
    6. Private Sub cmd2_Click()
    7. clickNr(2)
    8. END Sub
    9. ' klick 3
    10. Private Sub cmd3_Click()
    11. clickNr(3)
    12. END Sub
    13. ' eine Ziffer hintzufügen
    14. Private Sub clickNr(byval clickedNr As Integer)
    15. If txtDisplay.txt = "0" Then
    16. txtDisplay.Text = clickedNr
    17. Else
    18. txtDisplay.Text = txtDisplay.Text & clickedNr
    19. End If
    20. En Sub


    Oder alle Ereignisse über einen Ereignishandler zusammenfassen:

    VB.NET-Quellcode

    1. Private Sub AllNumbers_Click(ByVal sender As System.Object, _
    2. ByVal e As System.EventArgs) _
    3. Handles cmd1.Click, cmd2.Click, cmd3.Click
    4. Dim OneNumber As Button = CType(sender, Button)
    5. Label1.Text = OneNumber.Text
    6. If txtDisplay.txt = "0" Then
    7. txtDisplay.Text = OneNumber.Text
    8. Else
    9. txtDisplay.Text = txtDisplay.Text & OneNumber.Text
    10. End If
    11. End Sub

    bauerandre007 schrieb:

    einen einzigen Eventhandler schreiben
    ist in der Summe effektiver, insbesondere wenn Du nicht den Sender abfragst, sondern den Button im Designer einen sinnvollen Wert in die Tag-Property gibst und diesen dann verwendest:

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, Button6.Click
    2. Dim ctrl As Control = DirectCast(sender, Control)
    3. Dim tag As String = ""
    4. If ctrl.Tag IsNot Nothing Then
    5. tag = ctrl.Tag.ToString
    6. End If
    7. MessageBox.Show(tag)
    8. End Sub
    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!
    Danke @RodFromGermany .


    - Wie errechnet sich diese Summe, was sind die Summanden?
    - Was meinst du mit effektiver? Könntest du das bitte näher erläutern?
    - Was ist verkehrt daran, den Sender abzufragen?
    - Zum Tag-Property:
    Bevor ich meine Frage gestellt hatte, hatte ich einen Beitrag von dir gelesen, dass Properties der Controls nicht missbraucht werden sollten.
    Du zeigst du mir, wie ich meine Daten im Designer eintrage. Mir scheint die Methode, Daten im Designer festzulegen, nciht die Beste Möglichkeit zu sein. Es ist für mich einfacher (direkt Wert im Code eintragen), schneller(sehe sofort den Wert und kann es direkt im Code Editor bearbeiten, falls Änderungen gewünscht), übersichtlicher(Wer guckt denn schon im Tag-Property nach? Man stelle sich vor, das Programm werde von einer anderen Person gepflegt) und flexibler, Daten selbstbestimmt vom Design zu trennen.
    Zu aller erst empfehle ich dir Visual Studio - Empfohlene Einstellungen

    VB.NET-Quellcode

    1. ' eine Ziffer hintzufügen
    2. Private Sub clickNr(byval clickedNr As Integer)
    3. If txtDisplay.txt = "0" Then
    4. txtDisplay.Text = clickedNr
    5. Else
    6. txtDisplay.Text = txtDisplay.Text & clickedNr
    7. End If
    8. En Sub



    Die .Text-Property ist nicht die .Tag-Property...
    @bauerandre007 Deine Fragen zeigen mir, dass Du einfach drauflos programmierst und dass Du keine Vorstellung hast, worauf das ganze hinläuft.
    Fang an und mach zunächst einen detaillierten Plan.
    1. Ich habe Dir ein effektives Mittel gezeigt, Control-Ereignishandler zusammenzufassen und die Controls dort zu unterscheiden.
      Ob Du damit einen Taschenrechner baust oder die Steuerung eines Wasserkraftwerks, ist egal, in diesem Zustand weiß ich nix von Summanden.
    2. Mit wenigen Zeilen habe ich unabhängig von der Anzahl der Controls diese unterschieden.
    3. Eine andere Möglichkeit wäre, sender abzufragen, da brauchst Du pro Control je ein If.
      Was ist effektiver?
    4. Wie @VB1963 schon sagte: Die Tag-Property hat nix mit der Text-Property zu tun, und bei "mit Controls rechnen" (oder so) bedeutet, die Text-Property eines Controls als String-Repräsentation einer numerischen Variable zu verwenden. Das wäre ein NoGo.

    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 schrieb:

    @bauerandre007 Deine Fragen zeigen mir, dass Du einfach drauflos programmierst und dass Du keine Vorstellung hast, worauf das ganze hinläuft.
    Fang an und mach zunächst einen detaillierten Plan.

    Damit hast du leider Recht! Wie gehe ich es an, einen detaillierten Plan zu machen?
    Hast du ein paar Ratschläge für mich?

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

    naja, ein Teil der Planung könnte grundsätzlicher Natur sein: Ist das wirklich eine gute Idee, mit 10 Buttons Zahlen eingeben zu wollen?
    Da biste irre was am coden, und ein simples NumericUpdown (oder mw. auch eine modifizierte Textbox) ist am Ende einfacher zu benutzen, und kann mehr (nämlich löschen, einfügen, ändern).

    Wenn dir typDataset geläufig wäre, damit könnte man einen sehr effektiven Rechner (aber keien "Taschen") bauen, indem man Datensätze erfindet, die jeweils aus einer Zahl zusammen mit einer Operation bestehen.
    Klammer-Vorränge werden aber schwierig, also vlt einen Rechner, der mit Postfix-Notation rechnet?

    Hmm - auch nicht einfach

    Aber immerhin möglich, und würde zwar nicht aussehen wie ein "Taschen"-Rechner, hätte aber wesentliche Bedienungs-Vorzüge.
    Weil im Grunde ist's ja Quatsch, "Taschen"-Rechner am PC zu machen - krankhafter Fall von Retro-Design - weil: Ein Computer hat keine Tasche 8|

    Kennst du ühaupt die Postfix-Notation?

    bauerandre007 schrieb:

    Ratschläge
    Fang an mit einem Blatt Papier oder einem WORD-Dokument, schreib Dir einfach Stichpunkte auf, die Dir zum Thema einfallen.
    Die sortierst Du dann nach einer Woche oder so nach Funktionalität und Priorität, so kannst Du z.B. die blanke Funktionalität von der GUI trennen, Du kannst Sortieren zwischen Funktionen mit einem und mit zwei Parametern: Du kannst Punkt- und Strichrechnung höher priorisieren als Winkelfunktionen usw.
    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!
    Eigentlich hast du Recht damit, dass es keine gute Idee ist, einen Taschenrechner am PC zu benutzen, so habe ich das noch nie gesehen :D
    Ich selbst benutze lieber Excel zum Rechnen.
    Den Dataset Typ kenne ich nicht.
    Als Postfix-Notation (Dachte, es hieße nur Reverse Polish Notation) kenne ich, aber fand nie eine Verwendung dazu. Es ist gewöhnungsbedürftig.
    Ich möchte den blöden 'Taschen'Rechner (Jetzt regt es mich auf, dass ich einen Taschenrechner auf dem Computer schreibe, na vielen Dank!) fertig stellen, weil ich schon zu viel Zeit investiert habe und ein Erfolg erzielen möchte, wenn es endlich fertig wird.

    bauerandre007 schrieb:

    Es ist gewöhnungsbedürftig
    aber genial.
    Zahl hochschieben Sinus
    Zahl hochschieben Zahl hochschieben Plus
    usw.
    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 schrieb:

    Fang an mit einem Blatt Papier oder einem WORD-Dokument, schreib Dir einfach Stichpunkte auf, die Dir zum Thema einfallen.
    Die sortierst Du dann nach einer Woche oder so nach Funktionalität und Priorität, so kannst Du z.B. die blanke Funktionalität von der GUI trennen, Du kannst Sortieren zwischen Funktionen mit einem und mit zwei Parametern: Du kannst Punkt- und Strichrechnung höher priorisieren als Winkelfunktionen usw.

    Ich habe eine TODO-Liste erstellt und die Funktionalität priorisiert.
    Beispiel:
    Prio 1:
    7+9=
    77+9-=
    Prio 2:
    77*9+*==
    Prio 3:
    Fehlermeldung (Teilen 0) innerhalb der TextBox
    Menü

    und so weiter.

    Meine Liste ist aber nicht das, was du meinst, merke ich gerade: Stichpunkte erfassen und diese nach Funktionalität und Priorität sortieren.
    Danke dir!

    RodFromGermany schrieb:

    nach einer Woche oder so

    bauerandre007 schrieb:

    diese nach Funktionalität und Priorität sortieren
    Lass Dir Zeit.
    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!