• 0

C# OOP Probleme

Frage

Moin,

Wie versprochen versuche ich mich and er OOP um mir den Spaghetti-Code abzugewöhnen. Tötet mich nicht das ist mein erstes Mal und die Chancen bestehen das ich weit am Ziel vorbei geschossen bin. Folgenden Code mit 2 Klassen habe ich:

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string sourcePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\blabla";
                string searchPattern = "*.csv";
                int spalte = 7;

                //lesen
                DateiEinlesen datei = new DateiEinlesen(sourcePath, searchPattern, spalte);
                Console.WriteLine("Dateien eingelesen");
            }
            catch
            {

            }
        }
    }


class DateiEinlesen
    {
        string sourcePath;
        string searchPattern;
        int spalte;
        public DateiEinlesen(string sourcePath, string searchPattern, int spalte)
        {
            try
            {
                this.sourcePath = sourcePath;
                this.searchPattern = searchPattern;
                this.spalte = spalte;

                string currentLine;
                string[] fileArray = Directory.GetFiles(sourcePath, searchPattern);
                string[] lineData;
                int sourcearrayLength = fileArray.Length;
                Console.WriteLine(sourcearrayLength + " Dateien gefunden!");
                List<string>[,] liste = new List<string>[sourcearrayLength,2]; //liste für jede Datei[NummerDerDatei,Zeilen[1]/AusgewählteSpalte[2]]

                if (sourcearrayLength == 0)
                {
                    Environment.Exit(0);
                }

                for (int x = 1; x <= sourcearrayLength; x++) //jede Datei
                {
                    using (StreamReader sr = new StreamReader(sourcePath))
                    {
                        liste[x - 1, 0].Add(sr.ReadLine());

                        while ((currentLine = sr.ReadLine()) != null)
                        {
                            liste[x - 1, 0].Add(currentLine);
                            lineData = currentLine.Split(';');
                            liste[x - 1, 1].Add(lineData[spalte - 1]);
                        }
                        sr.Close();
                    }
                }                
            }
            catch (Exception ex) 
            {
                //sr.Close(); //Sichtbarkeit?!
                Console.WriteLine(ex);
            }            
        }
    }

Das Programm soll csv-Dateien in einem Ordner einlesen. Pro Datei soll es jeweils 2 Listen geben, eine mit den ganzen zeilen und eine nur mit einer bestimmten Spalte jeder Zeile.

1. Problem: Ich weiß wie ich über den Konstruktor Variablen von meiner Main-Klasse in die andere Klasse zum benutzen weitergeben kann. Ich hab absolut null Ahnung oder Erfahrung wie ich meine 2-dimensionale Liste zurück an meine Main-Klasse geben kann um sie dort für weitere Zwecke zu benutzen (später an eine weitere Klasse zu übergeben).

Ich habe versucht mich zu belesen, aber ich versteh das get/set Zeug ums verrecken nicht.

2. Problem: der StreamReader sollte (wenn ich das richtig verstanden habe) auch bei einer Exception ein Close() bekommen, das ist mir aber hier nicht so möglich wie ich es wollte. Wie machen andere das?

Könnte mir jemand auf die Sprünge helfen?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

40 Antworten auf diese Frage

  • 0

Ich denke ich habe es soweit verstanden, aber wie ich das dann in einer anderen Klasse benutze, also mit set einen Wert übergeben und dann mit get wiederbekomme ist mir ein Rätsel. Würde es dann in Klasse B so aussehen?

class B
{
    A.set_Nummer(15);

    int zahl = A.get_Nummer();
    Console.WriteLine("Meine Zahl ist " + zahl);
  
  	//bzw kürzer wahrscheinlich so oder ähnlich?
  	Console.WriteLine("Meine Zahl ist " + A.get_Nummer())
}

Was anderes:

Console.WriteLine("Nummer gesetzt auf {0}", value)

Ich habe das schon öfter gesehen aber warum benutzt man das? Warum nicht so:

Console.WriteLine("Nummer gesetzt auf " + value)

Was machen die geschweiften Klammern mit der null da?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Oh praktisch mit dem Format! Das neue mit der Interpolation gefällt mir sogar noch besser!

Das Getter und Setter nicht wie normale Methoden aufgerufen werden muss ich mir merken... das verwirrt mich gerade weil ich es anders gefunden habe. Ist das vielleicht ein Unterschied wie ich die Eigenschaften schreibe? Oder was ist der Unterschied zu dem was hier steht? http://wierbicki.de/wp-content/uploads/2016/02/2016-01-20-SAEL-E1FI2-Datenfelder-Getter-Setter.pdf

mensch1.SetName("Ich");

anstatt

mensch1.name = "Ich";

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Das explizite Schreiben von Getter- und Setter-Methoden ist in C# unüblich. Das macht man in der Java-Welt.

Im Allgemeinen finde ich dieses pdf-Dokument sehr schlecht. Ein Variablenname sollte nicht den Datentypen beinhalten. Das schränkt zu sehr ein. Angenommen, du musst aufgrund von Änderungen den Datentypen ändern. Dann musst du auch über den Variablennamen ändern. Den Datentyp im Variablennamen stammt noch aus der Zeit, als es noch keine gescheiten IDEs gab und der Entwickler Hilfskonstrukte benötigte. Außerdem geht man gar nicht darauf ein, wieso die Semikolons falsch sind. Es ist zwar nur eine Wiederholung aber wenn man die Schüler erklären würde, dass ein Semikolon das Ende einer Anweisung darstellt, dann sollte sich das von selbst erübrigen.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Naja so haben wir es gelernt... unser Lehrer im ersten Lehrjahr war Java-Programmierer, die Schüler fanden ihn gut aber er war eben nur ein Jahr lang da und das ist was wir beigebracht bekommen haben.

http://wierbicki.de/programmierung-c/

Der Lehrer selbst musste sich in C# einarbeiten. Das sind unsere Materialien aus dem ersten Lehrjahr nur mittlerweile habe ich so angst zu hören "Habt ihr doch gelernt" und ich kann es einfach nicht anwenden. :unsure:

Das mit dem Datentyp im Namen als Konvention für den Unterricht und Klassenarbeiten konnten wir ihm ausreden, fanden wir auch nicht so dolle - und wie du siehst mache ich es ja auch nicht.

Der Rest mit den typischen Fehlern war für komplette Anfänger sehr hilfreich, in Klassenarbeiten mussten wir Fehler in vorgefertigtem Code finden (auf dem Blatt Papier natürlich). Klammern die gefehlt haben, Semikolon die vergessen wurden, Anführungszeichen bei strings und vieles mehr.

Zurück zum Thema: Wenn ich Getter und Setter explizit schreibe dann rufe ich es wie eine Methode auf? Du hast ja oben slebst ein Beispiel gezeigt wie der Compiler es übersetzen würde, das sieht mir jetzt wie das aus was wir gelernt haben - oder? Im Prinzip werden ich zukünftig wohl sowieso nur noch mit dem {get; set} arbeiten schätze ich.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Ich kann den Lehrer nur verteidigen, im Prinzip würde ich es der Schule in die Schuhe schieben weil sie keinen Lehrer für das 1. Lehrjahr gefunden haben.

Der Mensch ist kein Lehrer, war es nie und hat vermutlich auch nie ausgebildet oder unterrichtet. Er programmiert und hat schätzungsweise versucht das was im Lehrplan steht irgendwie in diese (PVoss liegt richtig) 4 Schulstunden alle 2 Wochen unterzubringen.

Jetzt im 2. Lehrjahr ist es so das wir beim neuen Lehrer auch nur die Themen durchrennen. UML, Struktogramme, State Chart, Vererbung, OOP

Dieses Jahr habe ich erst verstanden was es überhaupt mit dem Konstruktor auf sich hat. Vererbung wurde auch mal kurz angeschnitten als wir unser Programm gemacht haben bei dem die Buttons auf der Form rumspringen.

Klassenarbeit war dieses Jahr gar nichts mit eigenem Programmieren dabei, wir haben ein paar (halb)fertige Programme (Sudoku, bewegende System.Draw-Kreise) vor die Nase geklatscht bekommen und sollten diese entweder durch Verbesserung der Fehler zum laufen bringen oder etwas dazu programmieren/verändern. Das Ergebnis werden wir am Donnerstag erfahren, der Lehrer ist nicht bekannt dafür die schwächeren Schüler "mitzunehmen". Es waren einige Dinge dabei die ich nie gewusst hätte wenn ich nicht selbst mit z.B. dem Paint-Event letztes Jahr experimentiert hätte und nicht wüsste was das rießegroße rote X auf der Form ist. Ein Paint-Event das gegen die Wand rennt schmeißt (habe ich zumindest irgendwie in Erinnerung) kein Exception, stattdessen sieht man dieses rote Kreuz. Das wusste keiner.

Ich behaupte mal frech das von dieser Gruppe aus zusammengewürfelten (1) FIAE und (15) FISI aus 3 verschiedenen Klassen ich noch unter den Top 3-4 bin.

Vielleicht bin ich einfach in der falschen FI-Richtung gelandet, aber ich liebe meinen Betrieb und hauptsächlich wird eben ein Admin hier gebraucht und kein Programmierer (es sei denn ich könnte eine Logistik-Software selbst auf die Beine stellen - hell no)

Ich versuche soviel wie möglich hier mit zu nehmen, ich weiß es ist schwierig über ein Forum zu lernen aber bisher wurde mir immer gut geholfen und ich hoffe das ich mit Geduld und Erfahrung auch irgendwann Code schreibe bei dem euch nicht die Augen aus dem Kopf fallen :)

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Hallo,

Es scheint so als ob bei dir wichtige Grundlagen fehlen, oder du diese noch nicht verstanden hast. Wäre es nicht sinnvoller den Ausbilder mal zur Seite zu ziehen, ihm zu sagen, dass der Unterricht in der Berufsschule nicht so das Wahre ist und mal bisschen Input von ihm benötigst?

Es ist ja schon mal super, dass du selber so motiviert bist und dich damit beschäftigst! Aufgrund dessen, dass du ja jetzt wohl bald im dritten Lehrjahr bist, sollten aber schon mal solche Sachen gefestigt sein. Das dies nicht unbedingt deine Schuld ist, ist vollkommen klar, wenn man die Folien von deinem Lehrer sieht. Diese sind nicht gerade sehr didaktisch aufbereitet, mal abgesehen davon, dass wie schon meine Vorschreiber erwähnt habe, dass Niveau/Hintergrundwissen ein bisschen fehlt.

Immerhin bist du im 3. Lehrjahr bald fertig mit der Ausbildung und kannst du dir jetzt vorstellen mit deinem Wissensstand als professionelle Arbeitskraft in einem Team zu arbeiten?

Ich würde empfehlen, dass du einfach mal ein Buch zur Seite nimmst und durcharbeitest*. Falls da Fragen auftreten, dann schreibe sie auf und stelle sie deinem Ausbilder oder Lehrer. Immerhin bist du in einer Ausbildung und es sollte dir nicht peinlich sein zu fragen, falls du etwas nicht verstehst. Ich selber habe unseren Entwicklungsteam - Chef wohl das eine oder andere mal zur Weißglut getrieben mit meinen Fragen, aber dafür ist eine Ausbildung eben da.

Noch eine Empfehlung die mir auch sehr geholfen hat: Schnapp dir einen Kollegen aus der Berufsschule, am besten einen der mehr Wissen hat als du, vor allem in den Themen die dich interessieren und startet einfach mal ein privates Projekt.  (Schlagwort: GitHub)

Geht das einfach mal komplett von Anfang bis Ende durch, sprich angefangen von der Planung und Konzeption bis zur Abnahme und somit auch Präsentation/Schulung (die man evtl. mit einem Ausbilder nachspielen könnte).

Vorteile von dem Vorgehen wären, dass du dir viele Sachen von deinem Kollegen abschauen kannst und ihr euch untereinander austauschen könnt. Außerdem ist es wesentlich motivierender private Projekte zu realisieren und daran bisschen zu kniffeln, als Projekte die man in der Arbeit vorgeschrieben bekommt, weswegen der Lerneffekt gleich wesentlich größer ist. Zumindest ging/ geht es mir so.

Alternativ schau dir mal paar Youtube - Tutorials an. Empfehlen kann ich hierbei Tom Wendel**. Er selber hat mal für Microsoft als Developer Evangelist gearbeitet und versteht sein Fach. Auch kann er alles schön didaktisch aufbereiten.

Abschließend kann ich nur sagen, dass du nicht verzweifeln solltest. Das wichtigste ist schon mal der Wille zu lernen und sich zu verbessern.

*Falls wäre das etwas: https://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep

**Tom Wendel Youtube: https://www.youtube.com/user/tomwendelger/featured

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Hi @CAEYO

Da du vermutlich recht neu bist würde ich behaupten du hast eine Sache verpasst: Ich mach eine Ausbildung zur FISI (apropo ich bin weiblich Whiz_zard). Mein Ausbilder ist ein Crack was Pearl angeht und in etwa kann er meinen Code auch verstehen, aber wenn es ums eingemachte geht kann er mir nicht weiterhelfen, er weiß auch nur noch das was er vor ~10 Jahren in der Schule gelernt hat. Und mehr Informatiker sind wir hier nicht im Betrieb^^

Da ich zu den etwas älteren (26) in der Klasse gehöre bin ich etwas reifer, ich würde es richtig cool finden jemanden zu haben der IRGENDETWAS mit mir machen würde (Programmieren, Server aufsetzen, vernetzen, irgendwas halt) weil es zusammen mit anderen natürlich viel mehr Spaß macht. Die Zwischenprüfungen stehen an, ich frage herum ob jemand nachmittags bleiben möchte um gemeinsam alte Prüfungen durchzugehen, ich biete an zusammen auf Klassenarbeiten zu lernen aber keiner scheint so "hyped" zu sein wie ich - nicht einmal aus dem engeren Freundeskreis in der Schule.

Ich habe andere Prioritäten wie meine Mitschüler, wenn der Lehrer uns früher gehen lässt heißt es bei anderen "Juhu Freizeit", bei mir ist es eher ein "wir sind doch schon hinterher, wie soll ich so auf die Prüfung vorbereitet werden?"

Ich habe ein Buch in englisch (Head First C#) und habe es auch angefangen durchzuarbeiten aber nachdem ich in gleich am Anfang mit WPF konfrontiert wurde und ums verrecken nichts gefunden habe was mir sagt wie ich eine falsch platzierte Linie in meinem Grid (Gitter) wieder löschen kann war mir nicht mehr danach :angry:

Ich werde es bei Zeiten nochmal versuchen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Also ich hab wieder ein neues Projekt aber das werde ich erst für Verbesserungsvorschläge freigeben wenn es fertig ist <_<

Jetzt habe ich gerade aber eine Frage:

Wann benutze ich das:

Class B
{
A.Nummer = 15;
A.TuEtwas();
}

Class A
{
int Nummer {get;set;}
public void TuEtwas()
{
//mach etwas mit Nummer 
}

und wann das:

Class B
{
int nummer = 15;
A.TuEtwas(nummer)
}

Class A
{
//int nummer;
public void TuEtwas(int nummer)
{
this.nummer = nummer;
  //Tu etwas mit nummer
}
}

Beides schiebt - sofern ich das verstanden habe - den Inhalt einer Variable von einer Klasse in die andere. Bei ersterem einfach nur rein die Variable und bei zweiterem zur direkten Verwendung in einer Methode.

Kann ich also sagen wenn ich eine Variable in mehreren Methoden brauche dann benutze ich ersteres und wenn ich es nur für eine methode brauche zweiteres?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Das kommt ein bisschen darauf an, ob du Nummer nur in der Methode verwenden willst oder ob du darauf noch irgendwann anders darauf zugreifen möchtest.

Ohne jetzt zu tief gehen zu wollen, wenn du Nummer sowieso in der Methode brauchst, übergibst du sie einfach, wenn du sie außerhalb der Methode setzt, muss die Methode erst sicher gehen, dass Nummer auch gesetzt ist.

Weiterhin stellt sich ein bisschen die Frage, was TuEtwas mit der Nummer macht, evtl brauchst du dafür gar keine Separate Methode und ein Setter wäre evlt passender.

Wenn du auf Nummer an mehreren Stellen zu unterschiedlichen Zeitpunkten benötigt, macht es Sinn, Nummer als Property zu hinterlegen, dann solltest du aber Nummer auch nicht über die Methode setzen, sondern solltest du getrennt vom Methodenaufruf tun.

Wenn TuEtwas nichts anderes macht, als Nummer zu setzen (evlt nach bestimmen Bedingungen), wäre dafür ein Setter ratsam, ansonsten solltest du die beiden Aufgaben trennen (d.h. die Eigenschaft nicht aus der Methode heraus setzen und die komplett anderen überlassen).

 

bearbeitet von Kleinrechner

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Die zweite Variante würde ich nicht empfehlen, weil die Methode TuEtwas() zwei Dinge macht: Sie tut etwas und setzt die Eigenschaft. Sie besitzt also einen Seiteneffekt. Das Verhalten der Klasse hätte was "magisches". Beispiel:

A a = new A();
Console.WriteLine(a.Nummer); // würde 0 ausgeben
a.Nummer = 10;
Console.WriteLine(a.Nummer); // würde 10 ausgeben
a.TuEtwas(15);
Console.WriteLine(a.Nummer); // würde plötzlich 15 ausgeben

Jemand, der die Klasse A nur verwendet und nicht weiß, wie sie intern aufgebaut ist, fragt sich, wieso Nummer plötzlich 15 ist.
Außerdem wird es ja einen Grund haben, wieso du die Eigenschaft definiert hast. Sie ist ja offenbar eine Konfiguration für diese Klasse, die von außen beeinflussbar ist. Methoden in Klasse A sollten daher den Wert nicht überschreiben, damit eben nicht dieser "magische Effekt" entsteht. 

Wenn der Parameter hingegen nur in der Methode TuEtwas() benötigt wird, dann kannst du die Eigenschaft ja auch weglassen, und die nummer, wie im zweiten Beispiel, in die Methode reinreichen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Ich dachte ich hätte es verstanden... irgendwie nicht:(

Wenn ich folgendes habe:

class A (Main)
{
   	B.GetSource
     C.DoSomething
}

class B
{
public string source {get;set;}
public void GetSource
	{
	//blabla
	source = //blabla
	}
}

class C
{
public void DoSomething
	{
  	string file = Directory.GetFiles(B.source, "*.csv");
	}
}

Ich dachte das würde so funktionieren, aber ich bekomme nur ein "ArgumentNullException" das sich auf "source" bezieht.

Wenn ich Schritt für Schritt durchgehe bekommt source einen Wert, aber sobald es zu Class C kommt ist der nicht mehr vorhanden. Was mache ich falsch? :unsure:

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Kannst du evlt nochmal ein anderes Beispiel posten, an dem man besser erkennen kann, was du als Klasse und was als Instanz verwendest und wo du static verwendest?

Das kann man aus deinem Beispiel leider nicht erkennen.

Ich geh aber auch davon aus, dass dein Problem daraus resultiert, aus dem Unterschied zwischen Klassen,Instanzen und Static-Properties.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Ich hab morgen Berufssschule, ich bezweifel das ich da zu etwas komme, ich versuch es am Freitag nochmal etwas genauer zu posten.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Es wäre besser, wenn du immer den kompletten Code hier reinschreiben würdest. Mit Schnipseln, die sogar noch unvollständig sind, kann keiner was anfangen. Auch solltest du auf die Formatierung achten. Der Code kann noch so gut sein aber wenn dieser schlecht formatiert ist, ist er quasi unlesbar.

Was mir aber ins Auge sticht, ist die Methode GetSource(). Die hat kein Rückgabewert, obwohl sie mit "Get" anfängt. Das spricht gegen die Erwartungshaltung der Methode. Get deutet immer auf eine Methode hin, die irgendwas zurückliefert aber das tut sie hier nicht.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Mein Lehrer konnte mein Problem identifizieren. Ich hab in meiner Klasse C ein neues Objekt der Klasse B angelegt und das kannte natürlich das "source" nicht mehr das ich in Klasse A zugewiesen habe.

Mein Spaghetti-Code-Programm muss heute fertig werden, danach kann ich mich wieder um das neue Projekt mit der OOP kümmern.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Du kommentierst als Gast. Wenn du bereits einen Account hast kannst du dich hier anmelden.
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoticons maximum are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor