Laden...

Felder als Parameter an Methode in der gleichen Klasse übergeben oder nicht?

Erstellt von AtzeX vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.731 Views
A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 12 Jahren
Felder als Parameter an Methode in der gleichen Klasse übergeben oder nicht?

Hallo zusammen.

Ich habe eine recht allgemeine Frage in Bezug auf zwei alternative Möglichkeiten zur Verwendung von / zum Zugriff auf Felder innerhalb von privaten Methoden der selben Klasse.

Lektüre, die das behandelt finde ich leider keine.

Von daher frage ich hier mal in die Runde und habe dazu ein 'doofes' Beispiel gemacht.

Entweder ich nutze in der privaten Methode direkt das Feld:

class FooBar
{
    private string _filename;

    .
    .
    .

    public string Foo()
    {
        Bar(5);
    }

    private string Bar(int amount)
    {
        DoSomethingWithFile(_filename, amount);
    }

    .
    .
    .

}

Oder ich übergebe das Feld als Parameter an die Methode:

class FooBar
{
    private string _filename;

    .
    .
    .

    public string Foo()
    {
        Bar(_filename, 5);
    }

    private string Bar(string filename, int amount)
    {
        DoSomethingWithFile(filename, amount);
    }

    .
    .
    .

}

Wie verfahrt ihr? Was seht ihr für Vor- und Nachteile in den beiden Ansätzen?

Und wie ist das in Anbetracht von Feldern abgeleiteter Klassen zu bewerten?

Danke im Voraus,
AtzeX

296 Beiträge seit 2007
vor 12 Jahren

Hallo AtzeX,

in dem Fall würde ich DoSomethingWithFile(...) direkt aus Bar(...) aufrufen.

Ansonsten einfach die Methode überladen, so wie es sich gerade anbietet.
Das erhöht die Wiederverwendbarkeit deines Codes.

Grüße

C
2.121 Beiträge seit 2010
vor 12 Jahren

Das kommt drauf an was für ein Feld das ist, wie es verwendet wird und es kommt auch auf die Methode an. Soll die auch mal mit einem anderen Filename arbeiten, oder ists gerade Sinn der Sache dass sie die private Variable der Klasse verwendet.
Eine allgemeine Antwort auf die Frage kann man so eigentlich nicht geben.

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo AtzeX,

Bei privaten Methoden ist es eh völlig egal, da niemand es aufrufen kann außer der Klasse selbst.
Bei nicht privaten Methoden würde ich entweder den Wert als parameter übergeben oder das Feld nicht direkt verwenden, sondern über das/ein Property darauf zugreifen, welches virtuel sein sollte.

Gruß
Juy Juka

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 12 Jahren

Hallo und danke für die Antworten!

@myUnderTakeR:
Mir geht es nicht um den konstruierten Fall, also den Sinn des Beispiels, sondern um den Vergleich dieser beiden angesprochenen Praktiken. 😉

@chilic:
Ja, da hast du Recht, es kommt sicherlich auf den Fall an.
Aber kann man sagen, welche Vorteile/Nachteile sich ergeben?

Wenn ich den Member z.B. als Parameter übergebe, sehe ich im aufrufenden Code direkt, dass die aufgerufene Methode damit etwas anstellt.
Wenn sie jedoch direkt das Feld verwendet, sehe ich das nicht so leicht.
Es könnten ja u.U. auch mehrere Felder sein, die die Methode intern verarbeitet.
Da sieht man nicht direkt dass dem so ist. Als Parameter hingegen schon.
Andererseits wären, sagen wir mal 10 Parameter, auch nicht gerade elegant, oder?

Vielleicht gibt es ja noch mehr Vor- oder Nachteile, an die man so direkt nicht denkt?

@JuyJuka:
So egal ist mir das bei privaten Methoden auch nicht, da ich mir Gedanken über einen Programmierstil mache. Deshalb ja die Frage. Funktionieren tut ja beides. 😃

Warum würdest du das Feld über eine Property verwenden?
Und warum sollte diese virtuell sein?

Ich merke jetzt, dass meine Frage eher philisophisch ist, aber guter Stil ist mir halt wichtig. Da arbeite ich gerne dran.
Und schlimmer ist's noch, wenn ich Nachteile einer verwendeten Implementierung übersehe.
Geht das nur mir so? 😃

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo AtzeX,

Warum würdest du das Feld über eine Property verwenden?

Weil so alle Zugriffe gekapselt sind und kontrolliert werden, auch aus der Klasse selbst heraus. Das kostet zwar ein bischen Performance, wegen Methoden-Overheadd, aber das ist meiner Meinung nach die gewonnene Kontrolle mehr als wert (nicht nachgemessen).

Und warum sollte diese virtuell sein?

Da war ich etwas ungenau. Wenn das Property nicht private ist, sollte es virtual sein, damit erbende Klassen die Zugriffe auf das Feld/Property anpassen kann.

Gruß
Juy Juka

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo AtzeX,

so pauschal, wie die Frage gestellt ist, kann man sie kaum abschließend beantworten. Es hängt wie fast immer von den Umständen ab. Wenn die Methode mit exakt diesem einen Feld arbeiten muss, sollte man das Feld nicht als Parameter übergeben, sondern es im Methodenrumpf direkt ansprechen. Wenn die Methode dagegen mit beliebigen Werten funktioniert und an einer Aufrufstelle der Inhalt des Felds verwendet werden soll, dann sollte man das Feld per Parameter übergeben.

Innerhalb einer Klasse ist es schon ok, direkt die Felder anszusprechen. Man muss dafür keine Properties definieren. Es kann zwar Fälle geben, in denen private Properties Sinn machen, aber im allgemeinen würde ich wie gesagt die Felder direkt ansprechen. Immerhin kann hier sowieso nur der Implementierer der Klasse selbst zugreifen und der sollte wissen, was er tut.

Nach der reinen Lehre der Objektorientierung sollten immer alle Methode und Properties virtuell sein. Nur so ist sichergestellt, dass der Implementierer einer Unterklasse bei Vererbung alle nötigen Anpassungen vornehmen kann und beim späteren Aufrufen immer die jeweils passende/adäquate Implementierung verwendet wird. Allerdings gibt es auch Gründe, die dagegen sprechen alles virtuell zu machen, insbesondere die Wartbarbeit von Klassenbibliotheken. Das wurde aber im Forum schon mehrfach besprochen. Siehe z.B. Forumssuche nach breaking change*.

herbivore

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 12 Jahren

Danke euch!

Sonst noch Meinungen oder Bekundungen angewandter Praxen?
Bin nach wie vor neugierig! 😉

Gruß,
AtzeX