Frage zu selbstgeschriebenen Klassen



  • Hallo,

    Ich vermute dass man üblicherweise für jede selbstgeschriebende Klasse eine neue Datei anlegt. Sehe ich das richtig? Wenn man nun die Klasse nicht in eine neue Datei schreiben möchte -- beispielsweise weil die Klasse sehr klein ist -- wo sollte man sie dann hinschreiben? Im folgenden Beispiel habe ich drei Stellen markiert, wo die Klasse stehen könnte. Alle drei funktionieren.
    Frage: Ist eine von den drei Stellen besser geeignet als die anderen, und wenn ja warum?

    Gruß
    Michael

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    // man könnte die Klasse hier hinschreiben (1)
    
    namespace Test_1
    {
        // man könnte die Klasse auch hier hinschreiben (2)
    
        public partial class Form1 : Form
        {
            // man könnte die Klasse auch hier stehenlassen wo sie jetzt steht: (3)
            class MyClass
            {
                public int zahl = 0;
                public static bool ok = false;
                public MyClass() 
                {
                    System.Console.Out.WriteLine("Konstruktor wurde ausgeführt");
                }
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                System.Console.Out.WriteLine("Programm wurde gestartet");
                MyClass objekt1 = new MyClass();     // Erzeuge zwei Instanzen von MyClass       
                MyClass objekt2 = new MyClass();
                System.Console.Out.WriteLine("Zahl1 vorher: " + objekt1.zahl.ToString());
                System.Console.Out.WriteLine("Zahl2 vorher: " + objekt2.zahl.ToString());
                objekt1.zahl = 15;
                System.Console.Out.WriteLine("Zahl1 hinterher: " + objekt1.zahl.ToString());
                System.Console.Out.WriteLine("Zahl2 hinterher: " + objekt2.zahl.ToString());
                System.Console.Out.WriteLine("ok vorher: " + MyClass.ok.ToString());
                MyClass.ok = true;
                System.Console.Out.WriteLine("ok hinterher: " + MyClass.ok.ToString());      
            }
        }
    }
    


  • micha7 schrieb:

    Ich vermute dass man üblicherweise für jede selbstgeschriebende Klasse eine neue Datei anlegt.

    Ja.

    micha7 schrieb:

    Wenn man nun die Klasse nicht in eine neue Datei schreiben möchte -- beispielsweise weil die Klasse sehr klein ist -- wo sollte man sie dann hinschreiben?

    Ich würde sie dennoch in eine eigene Datei schreiben, einzige Ausnahme wäre für mich eine "Inner Class" die weder eigenständig noch sonderlich groß ist (und dieses Element würde ich nur nach sorgfältiger Überlegung einsetzen).

    • Klassen neigen dazu mit der Zeit größer zu werden (Selbst unter strikter Einhaltung von SOLID können Sie eine Größe erreichen, die eine eigene Datei rechtfertigt).
    • Jede Codeeinheit sollte genau eine Aufgabe erledigen. Eine Datei mit mehreren Klassen erfüllt nur selten diese Bedingung.
    • Die Suche nach einer Klasse fällt leichter (Und ich kenne aus der Praxis Projekte wo mehrere Entwickler regelmäßig am Suchen waren, weil jemand viele Klassen in eine Datei gestopft hat).


  • asc schrieb:

    • Klassen neigen dazu mit der Zeit größer zu werden (Selbst unter strikter Einhaltung von SOLID können Sie eine Größe erreichen, die eine eigene Datei rechtfertigt).
    • Jede Codeeinheit sollte genau eine Aufgabe erledigen. Eine Datei mit mehreren Klassen erfüllt nur selten diese Bedingung.
    • Die Suche nach einer Klasse fällt leichter (Und ich kenne aus der Praxis Projekte wo mehrere Entwickler regelmäßig am Suchen waren, weil jemand viele Klassen in eine Datei gestopft hat).

    Gut, diese Argumente sind alle nachvollziehbar, und normalerweise werde ich jede Klasse in eine eigene Datei schreiben.

    Trotzdem würde ich gerne verstehen, wie sich die Klasse an den drei unterschiedlichen Stellen auswirken würde. Im gezeigten Beispiel ist es offensichtlich egal wo die Klasse steht.

    Die Stelle (3) liegt innerhalb von Form1. Wenn ich noch eine Form2 hätte, dann wäre MyClass innerhalb von Form2 nicht bekannt, richtig?
    Wenn ich MyClass sowohl in Form 1 wie auch in Form2 verwenden wollte, dann müsste MyClass also an den Stellen (1) oder (2) stehen.
    Unklar ist mir allerdings, wie sich die Stellen (1) und (2) unterscheiden würden.

    Gruß
    Michael



  • micha7 schrieb:

    Die Stelle (3) liegt innerhalb von Form1. Wenn ich noch eine Form2 hätte, dann wäre MyClass innerhalb von Form2 nicht bekannt, richtig?

    Nur wenn die Klasse private ist. Ansonsten ist sie als Form1.MyClass auch außerhalb bekannt.

    micha7 schrieb:

    Unklar ist mir allerdings, wie sich die Stellen (1) und (2) unterscheiden würden.

    Der Unterschied ist ob die Klasse im Namespace Test_1 landet oder im globalen. Der Verwender der Klasse muss sich im gleichen oder tieferen Namespace befinden um die Klasse zu verwenden, oder das entsprechende using angeben. Im globalen Namespace fällt das weg, ist da stark von abzuraten, da man so sehr schnell in Namenskonflikte kommen kann.



  • Danke für eure Antworten!

    Michael


Log in to reply