Laden...

Unterschiedliche Methoden, gleiches Ergebnis (Entscheidungshilfe)

Erstellt von Skydanith vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.913 Views
S
Skydanith Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren
Unterschiedliche Methoden, gleiches Ergebnis (Entscheidungshilfe)

Hallo,

aktuell absolviere ich ein Video-Tutorial.

Bei einer Aufgabe ging es darum, dass eine Begrüßung mit meinem Namen ausgegeben wird.

Ich konnte die Aufgabe lösen, allerdings auf einen anderen Weg wie der Dozent.

Was mich jetzt interessieren würde wäre, welche Methode Ihr besser findet.
Ich schreibe mal nicht dazu, welche von mir ist sondern nur Methode 1 & 2.

Methode 1:


   class Program
    {
        static void Main(string[] args)
        {
            Begrüßung("Daniel");
            Console.ReadKey();

        }
        static string Begrüßung(string name)
        {
            string name1 = name;
            Console.WriteLine("Hallo " + name1 + "! Wie geht es dir heute?");

            return name1;

        }
     

Methode 2


   class Program
    {
        static void Main(string[] args)
        {
         
            Console.WriteLine(Begrüßung("Daniel"));

       
            Console.ReadKey();
        }

      
        static string Begrüßung(string name)
        {
      
            return "Hallo " + name + ". Wie geht es dir?";
        }

Danke im Voraus

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Skydanith,

es kommt darauf an was die Methode "Begrüßung" konzeptionell machen soll:* auf der Konsole die Begrüßung mit Namen ausgeben -> Methode 1

  • den Begrüßungs-Text erstellen und zurückgeben -> Methode 2, allerdings wäre dann ein Name wie "ErzeugeBegrüßungsText" passender

Demnach wohl eher Methode 1 als passender.

Die Methode 1 kann aber auch einfacher geschrieben werden.


        static string Begrüßung(string name)
        {
            Console.WriteLine($"Hallo {name}! Wie geht es dir heute?");

            return name;

        }

Wobei hier ein Rückgabewert eher überflüssig ist und die Methode void sein sollte.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Skydanith Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren

Hallo gfoidl,

es freut mich zu lesen, da Methode 1 auf meinem Mist gewachsen ist.

Vom Grundsatz ging es aber nur darum, was Methoden sind und wie/wo man sie einsetzt.

Danke noch für den Vorschlag. Das verkürzt das ganze nochmal zusätzlich.

16.806 Beiträge seit 2008
vor 6 Jahren

Auch wenn es Visual Studio und der Compiler kann: bitte vermeide Sonderzeichen in Methodennamen.
Andere Editoren und Co können das nämlich nicht unbedingt, und dann knallt es.

Noch besser: englische Bezeichnungen.

[Artikel] C#: Richtlinien für die Namensvergabe

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Skydanith,

was Methoden sind und wie/wo man sie einsetzt.

Methoden sind ein Konzept der objektorientierten Programmierung (OOP). Sie sind ähnlich einem Funktionsaufruf, aber dennoch nicht damit zu verwechseln. Ein Methodenaufruf ist das Senden einer Nachricht an ein Objekt und die Implementierung einer Methode ist die Vorschrift, wie ein Objekt auf ein solche Nachricht zu reagieren hat.

Nehmen wir z.B. ein Objekt "Motor" her, so kann dieses Objekt die Methode "Starten" haben. Wird nun die Nachricht "Starten" and das Objekt "Motor" gesendet, so wird der Motor durch die entsprechende Implentierung der Methode gestartet. Wie das genau passiert kann dem Sender der Nachricht egal sein, denn das ist ein Implementierungsdetail von "Motor".

Schau dir für das Verständnis von Methoden am besten ganz allgemein die Grundlagen der OOP an (Identität, Zustand, Verhalten und Eigenschaften, Methoden).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Skydanith Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren

Danke für die Tipps. An den Methoden sitze ich gerade.
Hab aber noch eine Verständnisfrage:

Im groben gibt es ja Methoden mit und ohne Rückgabewert.

Wenn ich aber einen String über eine Void Methode ausgeben lasse, ist es doch streng genommen auch ein Rückgabewert, oder?

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

nein - eine Ausgabe hat nichts mit der Rückgabe zu tun vom Konzept.

Bei der Rückgabe will ja der Aufrufer irgendwas zurück haben - bei der Ausgabe interessiert es den Aufrufer nicht was dort genau passiert, solange es nur passiert.

Die selbe Methode würde ja im Fall eine Desktop-Anwendung irgendwas auf den Bildschirm malen - das ist und bleibt dem Aufrufer hier allerdings egal.

LG

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Skydanith,

bleib gedanklich beim Senden einer Nachricht an ein Objekt.

Willst du eine Antwort auf die Nachricht haben -> Rückgabewert.
Willst du keine Antwort und nur dass etwas entsprechend Nachricht passiert -> void

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Skydanith Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren

Ok.

Also quasi wie eine leblose Hülle die nur was darstellt aber keine Substanz hat.

Bei einer Methode mit Rückgabe wert, findet ein Prozess statt. Beispielsweise eine Multiplikation die in der Methode berechnet werden soll und das Ergebnis ausgegeben werden soll.

Danke.

3.003 Beiträge seit 2006
vor 6 Jahren

Ein bisschen spät, aber mal ein anderer Gedankengang:

Ich finde Methode 1 deutlich schlechter, und zwar, weil "von außen", also in der Main-Methode, nicht erkennbar ist, dass Console-Output generiert werden wird. Nach dem Prinzip der geringsten Überraschung bevorzuge ich daher ganz klar Methode 2. Mit einer besseren Benennung wiederum werden die Vor- und Nachteile diesbezüglich allerdings nahezu aufgehoben. Ich würde vorschlagen:

Methode 1: PrintWelcomeText(string username)
Methode 2: GetWelcomeText(string username)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Skydanith,

wie eine leblose Hülle die nur was darstellt aber keine Substanz hat.

Würde ich so nicht sagen. Am Beispiel Motor oben ist die void-Methode Starten die Nachricht. Dir, als Sender der Nachricht, ist nur wie wichtig dass der Motor dann gestartet ist (od. per Fehlermeldung quittiert). Wie der Start passiert ist dir egal bzw. kann dir egal sein -- das ist das Schöne an OOP, dass du die Details vom Motor nicht kennen musst.


public class Motor
{
    public void Starten() 
    {
        // ...
    }
}

Ein Auto könnte z.B. folgende Methode haben:


public class Auto
{
    private readonly Motor _motor;
    private double _istGeschwindigkeit;

    public Auto(Motor motor) => _motor = motor;

    public double Beschleunige(double sollGeschwindigkeit)
    {
        _motor.GasGeben(...);

        return _istGeschwindigkeit;
    }
}

Hier wird beim Beschleunigen der Sollwert vorgegeben und der Istwert zurückgegeben, da dieser ja durchaus interessant ist (für das regeln vom Auto).

In beiden Fällen ist es keine leblose Hülle, sondern bei void ist kein Rückgabewert interessant, daher gibt es auch keinen.

PS: LaTino hat da schon recht, anhand der Bezeichner soll sofort klar sein worum es geht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
79 Beiträge seit 2011
vor 6 Jahren

Besseres Beispiel:

Eine Methode mit Rückgabewert ist wie die Freundin, die man anbrüllt. Die brüllt was zurück.

Eine void-Methode ist die Katze: Die kann man zwar auch anbrüllen, aber die Katze schaut nur gelangweilt bis verwirrt. Zurück kommt aber akustisch nix.

1.040 Beiträge seit 2007
vor 6 Jahren

Sorry für Off-Topic: you made my day! 😄

S
Skydanith Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren

Vielen Dank für die ganzen antworten. Dass mit dem Motor und der Freundin war ein gutes Beispiel.
Ich hab es auf jedenfalls verstanden. In dem Tutorial war das vielleicht auch nur ein blödes Beispiel um es zu veranschaulichen.

Muss glatt einen Sekt rausholen und einen ausgeben.
Zum ersten mal wurde der Threadtitel eines Threads den ich erstellt habe NICHT abgeändert.
😁 8)

C
2.121 Beiträge seit 2010
vor 6 Jahren

Worauf komischerweise keiner eingegangen ist...


            string name1 = name;

Warum denn das?

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo chilic,

komischerweise keiner eingegangen ist...

naja, siehe mein Beispiel oben, da fehlt das schon (und das mit Absicht und der Hoffnung dass der OT das bemerkt).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Skydanith Themenstarter:in
20 Beiträge seit 2017
vor 6 Jahren

Äh.. Ja. Die Zeile ist überflüssig.

Demnach ist auch der Inhalt des printbefehls falsch.

Hab es schon geändert.

Das stammt noch aus der Zeit, als ich kein Bewusstsein dafür hatte.