1. #1
    Avatar von AFU
    Registriert seit
    19.11.2011
    Beiträge
    359
    Thanked 75 Times in 61 Posts

    Standard C#: globale Methode

    Hallo,

    ich habe derzeit ein Programm (Code von jemand anders übernommen), welches aus mehreren Windows-Forms besteht.
    Dieses beinhaltet mehrere Textboxen.

    In einer Form gibt es eine (private void) Methode, die zb etwas in textbox1.text schreibt.

    Soweit, so gut.

    Da mehrere Forms vorhanden sind, die Methode eigentlich aber auf das ganze Programm zutrifft, ist meine Frage: wie kann ich diese methode für das gesamte Programm verfügbar machen?`

    Mein Zugang: eine neue Klasse erstellen und dort die Methode definieren. Allerdings, muss ja das Programm wissen, in welche Textbox aus welcher Form es schreiben soll.

    Die Bezeichnung ist zwar mit textbox1.text für alle Forms gleich, die Forms variieren aber.

    Meine Zugang wäre also gewesen: Zu prüfen, ob das element zb form1.textbox1 existiert, wenn nicht, gehe zur nächsten form usw und schreibe es nur dann hinein, wenn es existiert oder aktiv ist.

    Was meint ihr?
    Geändert von AFU (24.02.2018 um 11:56 Uhr)

  2. The Following User Says Thank You to AFU For This Useful Post:

    Negok (25.02.2018)

  3. #2
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    446
    Thanked 361 Times in 236 Posts

    Standard AW: C#: globale Methode

    Es gibt in C# statische Klassen, die nicht instanziierbar sind. Methoden und Attribute, die in einer solchen Klasse definiert werden, werden über ihren Klassennamen aufgerufen.
    Du könntest eine solche Klasse erstellen, und die Methode könnte als formalen Parameter eine Referenz zu der Form (oder direkt zur Textbox) annehmen.


    public static class TextBoxWriter
    {
    public static void WriteToTextBox(Form form)
    {
    // mach was mit form.textbox1.Text
    }
    }



    TextBoxWriter.WriteToTextBox(form1);

  4. The Following User Says Thank You to Nuebel For This Useful Post:

    AFU (24.02.2018)

  5. #3
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 Posts
    Blog Entries
    5

    Standard AW: C#: globale Methode

    Statische Klassen
    Mit statischen Klassen lässt sich das realisieren. Aber ob das hinsichtlich des Entwurfsmusters eine gute Lösung ist, wage ich zu bezweifeln. Statische Klassen sollten in der OOP möglichst vermieden werden. Sie verleiten dazu, in die prozedurale Programmierung abzudriften. Außerdem kann es sehr schwer werden, eine statische Klasse zu testen - man kann ja nicht einfach eine Instanz erzeugen, die sich in einem sauberen, definierten Zustand befindet. Stattdessen kann eine andere Klasse oder auch schon der vorherige Test sie in einen ungültigen Zustand versetzen. Wenn man richtig objektorientiert Programmiert, besteht aber auch kaum mehr Notwendigkeit für statische Klassen. Selbst Klassen wie z.B. Logger, die man früher per statischem Singleton oder gar völlig statisch genutzt hat, lassen sich per Dependency Injection problemlos automatisiert instanzieren und injizieren.

    Was macht der Code?
    Bevor eine konkrete Empfehlung gegeben werden kann, sollte geklärt werden, was der betroffene Code macht. Ist die Anwendung vernünftig aufgeteilt und existiert z.B. eine Trennung zwischen Logik und Darstellung? Der häufigste Fehler ist, beides zusammen zu werfen. Dann hat man riesige WinForms und das Programm wird unwartbar. Werde dir daher zunächst klar, ob dein Code teil der GUI bzw. Business-Logik ist. Oder ediere am besten ein paar Beispielmethoden in deinen Post.

    Zitat Zitat von AFU Beitrag anzeigen
    Meine Zugang wäre also gewesen: Zu prüfen, ob das element zb form1.textbox1 existiert, wenn nicht, gehe zur nächsten form usw und schreibe es nur dann hinein, wenn es existiert oder aktiv ist.
    So was bitte nicht machen, da hast du am Ende eine Komponente, die mit ALLEN Forms zusammenhängt. Im schlimmsten Falle auch noch mit der Businesslogik. Das ist der Albtraum für jeden Test. Über das Thema würde ich je nach Größe der Anwendung btw. auch mal nachdenken. Tests sind für eine vernünftige Softwarequalität unerlässlich - zumindest, wenn das Programm mehr als nur ein paar Zeilen hat und längere Zeit genutzt/gewartet wird. Das Ziel sollte sein, ein Programm modular aufzubauen und die Abhängigkeiten zwischen den einzelnen Modulen so gering wie möglich zu halten. Stell dir einfach vor, du willst eine Komponente austauschen oder erweitern. Wenn dafür das halbe Programm umgeschrieben werden muss, ist die Architektur schlecht.


  6. The Following User Says Thank You to DMW007 For This Useful Post:

    AFU (24.02.2018)

  7. #4
    Avatar von AFU
    Registriert seit
    19.11.2011
    Beiträge
    359
    Thanked 75 Times in 61 Posts

    Standard AW: C#: globale Methode

    @Nuebel: instanziierbar kann ich noch nicht interpretieren.

    Rein fürs Verständnis:
    Du meinst also das ich das so quasi baue, dass man dann die textboxen auf den unterschiedlichen forms so aufrufen kann?

    TextBoxWriter.WriteToTextBox(form1)
    TextBoxWriter.WriteToTextBox(form2)
    TextBoxWriter.WriteToTextBox(form3)
    usw

    @DMW007: Von solcher eine Professionalität bin ich meilenwert entfernt. Der Code muss weder wartbar noch großartig testbar bzw. irgendwelchen Testfällen standhalten.
    Das Programm macht derzeit was es soll. Ich möchte meine Kenntnisse etwas verbessern, daher habe ich mir den Code geben lassen, und versuche diesen schrittweise etwas zu optimieren. Aber ich hab mit OOP noch nicht wirklich viel gemacht.
    Geändert von AFU (24.02.2018 um 13:47 Uhr)

  8. #5
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 Posts
    Blog Entries
    5

    Standard AW: C#: globale Methode

    Das wäre ein Beispiel für den Einsatz einer statischen Klasse. Ob es sinnvoll ist da eine ganze Form zu übergeben, halte ich für fragwürdig. Dadurch wird alles sehr eng miteinander verzahnt und fehleranfällig. Müsste man anhand des konkreten Codes entscheiden. Falls du die Form wie in Beispiel von @Nuebel übergibst, würde ich mindestens ein Interface für eine solche Form definieren. Darin kannst du festlegen, welche Struktur du erwartest. Zum Beispiel eine Textbox namens tbUsername. Alle deine Forms implementieren dieses Interface, sodass du sicher sein kannst, dass die entsprechenden Eigenschaften mit dem jeweils von dir geforderten Zugriffsmodifikator vorliegen.

    Alles andere wäre derart unsauber, dass dir eine stark typisierte Sprache wie C# den Code nicht mal kompilieren lässt. Ein Grund, warum ich von schwach typisierten Sprachen wie rohes JavaScript wenig halte. Da gehst du als Entwickler 1 davon aus, dass alle Forms eine TextBox namens tbUsername haben. Nun erweitert ein anderer Entwickler das Programm und fügt eine vierte Form hinzu. Der weiß das nicht und erstellt keine solche TextBox. Folglich würde dein Programm hinfallen. Im Falle von JavaScript sogar erst zur Laufzeit, d.H. wenn dazu die Testabdeckung schlecht ist im dümmsten Falle erst, wenn der User das Feature nutzt und es knallt.

    Das mag vielleicht für deine anscheinend recht kleine Software overkill klingen. Aber gerade wenn es dir ums lernen geht würde ich mir die Zeit nehmen mich da rein zu denken und das ganze sauber im OOP-Stil lösen. Und ich würde dir an der Stelle auch empfehlen, deine Controls sinnvoll und einheitlich zu benennen. Durchnummerierte Textboxen sind in Ordnung für ein Testprojekt, in dem man nur schnell was ausprobieren möchte. Aber für richtige Projekte nicht empfehlenswert. Nach 5 verschiedenen Textboxen weißt du nicht mehr, ob die Textbox welche du grade suchst Nummer 3 oder doch 4 war. Darüber hinaus wird dein Code schlecht lesbar und damit auch fehleranfällig, wenn der Leser rätseln muss, was wohl in Textbox5 steht. Ich empfehle bei Controls ein Suffix für den Typ (tb für TextBox, btn für Button usw) und anschließend einen sprechenden Namen, was drin ist: tbUsername, tbPassword, tbDestinationPath usw.


Ähnliche Themen

  1. Eigene Login Methode für Windows 10
    Von Testgamer100 im Forum Windows
    Antworten: 3
    Letzter Beitrag: 18.12.2016, 14:17
  2. Globale Variable ohne Kapselung
    Von Jokuu im Forum PHP
    Antworten: 2
    Letzter Beitrag: 18.07.2014, 15:02
  3. Paysafekarte Auscash Methode!
    Von Jack DanieLs im Forum Internet und Technik
    Antworten: 11
    Letzter Beitrag: 07.10.2012, 10:17
  4. .htpasswd Methode
    Von Kuchenmaster im Forum Internet und Technik
    Antworten: 1
    Letzter Beitrag: 15.02.2012, 12:12
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.