Zum Inhalt springen
  • 0

C# OOP Probleme


Tician

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1
vor 45 Minuten schrieb Tician:

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:

Die Folien sind aus meiner Sicht totale Grütze ...
Die kann man vielleicht in der 7. Klasse verwenden, damit die Schüler ein bisschen Spaß haben können aber für Azubis sollte da schon mehr Niveau sein. Wo ist Vererbung? Polymorphie? Generics?

Sorry, aber ihr lernt nicht mal Ansatzweise Objektorientierung. Geschweige denn richtig mit C# umzugehen. Auch wenn er aus der Java-Welt kommen sollte, hat er dennoch nicht das Zeug dazu, echt das richtig beizubringen. Java unterscheidet sich von C# nicht so sonderlich viel.

vor 52 Minuten schrieb Tician:

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.

Meiner Meinung nach ist das Bullshit. Wenn man die Syntax richtig erklären würde, dann würde man auch das Konzept hinter der Syntax verstehen und dann lösen sich Syntax-Fehler von alleine. Man braucht da nicht irgendwelche Regeln auswendig lernen. Die kommen von alleine, wenn man einmal die Syntax verstanden hat... 

Aber Gut zum Thema:

vor 54 Minuten schrieb Tician:

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.

Ja, das ist richtig. C# verfolgt aber das Ziel Daten grundsätzlich mit einem Zuweisungsoperator zu manipulieren, während Methoden eine Aufgabe darstellt, die mit den Daten arbeitet. Wenn man, wie in der Java-Welt, Getter- und Setter-Methoden schreiben würde, würde man die Manipulation von Daten und Methoden vermischen und somit hätte man kein gleichmäßiges Bild mehr. Darum abstrahiert C# die Getter- und Setter-Methoden. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1
vor einer Stunde schrieb Whiz-zarD:

Die Folien sind aus meiner Sicht totale Grütze ...
Die kann man vielleicht in der 7. Klasse verwenden, damit die Schüler ein bisschen Spaß haben können aber für Azubis sollte da schon mehr Niveau sein. Wo ist Vererbung? Polymorphie? Generics?

Sorry, aber ihr lernt nicht mal Ansatzweise Objektorientierung. Geschweige denn richtig mit C# umzugehen. Auch wenn er aus der Java-Welt kommen sollte, hat er dennoch nicht das Zeug dazu, echt das richtig beizubringen. Java unterscheidet sich von C# nicht so sonderlich viel.

Ich kann echt nur immer wieder den Kopf schütteln.

Beachtest du auch welcher Umfang da überhaupt vermittelt werden soll, über welche (geringe) Dauer und von welchem Startpunkt aus? Soll man auch das Wort Aushilfslehrer mal fett hervorheben?

Die Schüler fangen da bei Null an. Dort sind Folien für 18 Unterrichtseinheiten, die ersten beiden beschäftigen sich mit dem Kennenlernen der Personen und der organisatorischen Gegebenheiten seines Unterrichts.

Dann ist der Abstand zwischen dein einzelnen Einheiten recht groß, da muss der Lehrer die Schüler erst einmal wieder abholen bevor er an der gleichen Stelle vom letzten mal fortsetzen kann - oder er verlässt sich drauf, dass die Schüler alleine weiter gemacht haben oder ein anderer Lehrer seine Ideen fortgesetzt hat, good luck bro.

Es müssen Übungsaufgaben untergebracht werden damit das gelernte ein bisschen gefestigt wird bevor die nächsten Konzepte gelehrt werden.

Ich kapier nicht, wie du scheinbar so unglaublich verständnislos gegenüber den Ausbildern und Lehrern stehst. Weiß du eigentlich, dass da auch die schlechteren Schüler mitgenommen werden sollen? Da kann man einfach nicht so schnell machen.

Ich kann mir übrigens auch nicht vorstellen, dass diese einzelnen Unterrichtseinheiten ganze Tage darstellen, das sind vielleicht 4 Stunden, keine Ahnung. Das heißt der Stoff wird in weniger als 80 Stunden vermittelt und mit Klassenarbeiten, Übungsaufgaben geprüft. Erstmal sind die Klassenarbeiten ein Zeitfresser, andererseits gibt es während des Unterrichts sicher auch langsame Schüler die öfter mal nachfragen, Nervensägen die den Unterricht stören... das verzögert alles.

.... echt, keine Ahnung was du für eine Erwartungshaltung hast. Ich glaube du bist einfach zu lang aus der Schule raus.

 

Um einen Punkt aber nochmal aufzugreifen.

Zitat

Die kann man vielleicht in der 7. Klasse verwenden, damit die Schüler ein bisschen Spaß haben können

Die kann man auch für Anfänger in der Programmierung verwenden, damit diese Anfänger ein bisschen Spaß haben können.

Vielleicht ist es ja mit sein Ziel das Interesse nach mehr zu wecken. Von der 7. Klasse zur Ausbildung ist es übrigens nicht so weit hin wie du vielleicht denkst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1
vor 7 Stunden schrieb PVoss:

Beachtest du auch welcher Umfang da überhaupt vermittelt werden soll, über welche (geringe) Dauer und von welchem Startpunkt aus? Soll man auch das Wort Aushilfslehrer mal fett hervorheben?

Ist doch ganz gleichgültig, ob es ein Aushilfslehrer ist, oder nicht. Er soll die Schüler vernünftig unterrichten. Auch handelt es sich hier nicht um eine 7. Klasse, wo es scheißegal ist, ob sie Objektorientierung verstehen oder nicht, sondern es geht um Azubis, dies dies in ihrem Berufsleben brauchen. Der Lehrer springt aber von den Klassen zu Arrays, ohne überhaupt mal zu erklären, wozu überhaupt Klassen gedacht sind. Er verschiebt den Code nur von einer Klasse zur nächsten ... Ja, wow. Dafür brauche ich kein C#, sondern kann dafür auch eine prozedurale Sprache, wie z.B. Pascal, nehmen. Es hat doch keinen Sinn, eine Objektorientierte Sprache zu wählen, wenn man den Azubis nicht mal erklärt, was Objektorientierung überhaupt ist. Er springt auch mit den Themen kreuz und quer ohne einen roten Faden zu besitzen. z.B. von den erwähnten Klassen zu Arrays oder von der for-Schleife zu Modulo und von Modulo zur Random-Klasse. Was ist mit den anderen Arten von Schleifen? Von WinForms zu Boolesche Algebra. Was ist das denn für ein Unterricht? Man sieht ja, was dabei rauskommt, nämlich nichts ...

vor 7 Stunden schrieb PVoss:

Weiß du eigentlich, dass da auch die schlechteren Schüler mitgenommen werden sollen? Da kann man einfach nicht so schnell machen.

Wenn man aber bei den Themen von Pontius zu Pilatus springt, nimmt man die schwachen Schüler nicht mit. Im Gegenteil. Sie verlieren schneller den Überblick, weil sie den Themen einfach nicht folgen können. Im Unterricht sollte ein roter Faden zu sehen sein und der fehlt hier komplett. Es wird irgendwie alles nur kurz angerissen ohne näher darauf einzugehen. Sorry, aber mit so einem Wissensstand kann man noch keine Programme mit C# schreiben, da einfach das komplette Wissen über Objektorientierung fehlt. Wenn man schon die Objektorientierung weglassen möchte, was bei Anfängern vielleicht durchaus verständlich ist, dann sollte man auch meiner Meinung nicht mit einer OO-Sprache anfangen, weil es sonst für Verwirrung sorgt. Bei meiner Assistenten-Ausbildung wurde auch mit Pascal anfangen aber Pascal ist heute wohl nicht mehr "fancy" genug. Meine damalige Ausbildung habe ich 2008 begonnen und 2011 abgeschlossen. Das Problem sieht man schon in diesem Video von ihm. Er beschreibt den Konstruktor falsch. Er implementiert einen Konstruktor, nur weil er Quelltext sparen möchte. Das ist aber nicht der Sinn und Zweck eines Konstruktors. Der Konstruktor ist dafür da, um ein Objekt zu initialisieren. Parameter reicht man dann in ein Konstruktor rein, wenn das Objekt Daten von außerhalb benötigt. Zwar hat er genau das vor aber er erwähnt es nicht. Seine Intention ist nur, dass er zwei Zeilen Code weniger schreiben möchte. Dies ist einfach unbrauchbar und sorgt auch nicht für ein besseres Verständnis, sondern für mehr Verwirrung.

Je mehr ich mir die Unterlagen anschaue, desto mehr wird mir auch die Probleme von @Tician klar. Der Lehrer versucht zwar die Basics einer imperativen Programmiersprache zu zeigen, versucht aber gleichzeitig prozedural in einer reinen objektorientierten Sprache zu entwickeln. Das kann einfach nicht klappen, ohne dass es verwirrend wird. Da kommen wir wieder zu dem Problem, was ich oben erwähnte. Wenn man einfach nicht die Zeit hat, die Objektorientierung zu erklären, dann sollte man auch nicht mit einer objektorientierten Sprache anfangen, sondern mit einer rein prozeduralen Sprache.

Auch das wichtigste Werkzeug eines Entwicklers, wird nicht mal besprochen: Der Debugger. Ohne den Debugger könnte kein Entwickler überleben aber nirgends wird mal der Debugger erwähnt und das Problem sieht man hier doch auch: Der TE ist nicht in der Lage, seinen eigenen Code zu debuggen. Taucht ein Fehler auf, ist der TE sofort aufgeschmissen. 

vor 7 Stunden schrieb PVoss:

Die kann man auch für Anfänger in der Programmierung verwenden, damit diese Anfänger ein bisschen Spaß haben können.

Vielleicht ist es ja mit sein Ziel das Interesse nach mehr zu wecken. Von der 7. Klasse zur Ausbildung ist es übrigens nicht so weit hin wie du vielleicht denkst.

Mag sein, aber das Problem sieht man doch hier überdeutlich: Der TE hat zwar Interesse nach mehr und möchte in der Firma ein eigenes Programm schreiben aber eckt überall an, weil er/sie überhaupt kein Verständnis für die Objektorientierung oder für C# besitzt. Man kann nicht einfach eine rein objektorientierte Sprache nehmen und die Objektorientierung weglassen. 

Link zu diesem Kommentar
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
Link zu diesem Kommentar
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

Link zu diesem Kommentar
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.

Link zu diesem Kommentar
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?

Link zu diesem Kommentar
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
Link zu diesem Kommentar
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.

Link zu diesem Kommentar
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:

Link zu diesem Kommentar
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.

Link zu diesem Kommentar
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.

Link zu diesem Kommentar
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.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...