klassenlose Methoden vs. Membermethoden



  • Hallo,

    ich habe eine Verständnissfrage zu Methoden.

    Angenommen man hat eine Klasse A (gegeben durch A.h und A.cpp), welche die Methoden public_A, protected_A und private_A bereitstellt (diese sind also public, protected und private).
    Was ist, wenn diese Methoden dann eine Methode hilfsmethode verwenden (welche auch in A.cpp implementiert ist), welche bezüglich ihrer Funktionalität eigentlich nicht direkt der Klasse A zugeschrieben werden kann. Sollte ich diese Hilfsmethode dann auch innerhalb der Klasse A als private, protected oder public deklarieren oder garnicht und einfach in A.cpp implementieren. Finde es intuitiv irgendwie nicht passend die Methode hilfsmethode der Klasse A zuzuschreiben, z.B. würde man ja auch nicht die Funktion maximum(i,j) einer Klasse Auto zuschreiben, nur weil diese in irgendeiner sinnvollen Membermethode (z.B. starte_motor oder was weiß ich) benutzt wird.
    Wie unterscheiden sich klassenlose Methoden von Membermethoden bezüglich der Zugriffsrechte? Ich nehme mal an, dass man auf diese Funktionen nur in dem .cpp file zugreifen kann in welchem auch die Funktion implementiert ist oder?
    Kann ich innerhalb von hilfsmethode (wenn sie nicht zur Klasse A gehört, aber trotzdem in A.cpp implementiert ist) public_A, protected_A oder private_A verwenden?
    Sollte ich hilfemethode trotz der Klassenlosigkeit im Header A.h deklarieren?

    Vielen Dank schonmal für eure Antworten!

    Viele Grüße,
    Sven



  • hilmethode nur in den Header, wenn du außerhalb des Units a.cpp diese verwenden willst.
    soll hilfsmethode auch auf private_A zugreifen können, muss hilfsmethode in class A{...}; als friend deklariert werden.
    Oder eben gleich als private Funktion in der Klasse. Dann besteht aber das Problem, dass alle friends von class A auch darauf Zugriff haben.

    Ansonsten würde ich hilfsmethode nicht global definieren, sondern im anonymen namespace

    namespace {
      void hilfsmethode( A& inst );
    }
    


  • Wenn die Hilfsmethode ihre Aufgabe durch die Benutzung des public Interface der Klasse erledigen kann solltest du sie als non-member implementieren, ansonsten gehört sie in die Klasse.


  • Mod

    DocShoe schrieb:

    Wenn die Hilfsmethode ihre Aufgabe durch die Benutzung des public Interface der Klasse erledigen kann solltest du sie als non-member implementieren, ansonsten gehört sie in die Klasse.

    Ist nicht die Tatsache, ob eine Funktion durch eine andere öffentliche implementiert werden kann, selbst ein Implementationdetail? Wieso also sollte das Maßstab für die Entscheidung zwischen Member- und nicht-Memberfunktionen sein und widerspricht das nicht dem Prinzip der Datenkapselung?



  • Zunächst: private und protected regeln den Zugriff von außen. Wenn du also eine Funktion schreibst, die nicht Teil der Klasse ist (eine "klassenlose Hilfsmethode"), kann diese nicht auf Teile der Klasse zugreifen, die private oder protected sind. Hierzu müsstest du die Funktion als friend deklarieren. Das halte ich für eine ausgesprochen schlechte Idee.

    Falls deine Hilfsfunktion einen Algorithmus implementiert, der noch anderen Klassen nützlich ist (wie dein minimum()), bietet sich eine globale Funktion an. Falls die Hilfsfunktion wahrscheinlich nur für deine Klasse interessant ist, würde ich sie als private Methode implementieren. Möglich ist auch eine Funktion in einem anonymen Namespace, aber die kann dann halt nicht auf Interna der Klasse zugreifen.

    Falls eine Funktion intuitiv zur Schnittstelle der Klasse gehört und falls nicht, wie beispielsweise bei manchen Operatoren, andere Gründe dagegen sprechen, würde ich sich auch im public Interface der Klasse deklarieren. Die Vorgehensweise, das Interface sehr klein zu halten und Funktionalität der Klasse in Form globaler Funktionen zu implementieren, wie es die Evangelisten fordern, ist mE Unsinn und erschwert nur das Verständnis der Klasse.

    Stefan.


  • Mod

    DStefan schrieb:

    Hierzu müsstest du die Funktion als friend deklarieren. Das halte ich für eine ausgesprochen schlechte Idee.

    Warum?



  • camper schrieb:

    DStefan schrieb:

    Hierzu müsstest du die Funktion als friend deklarieren. Das halte ich für eine ausgesprochen schlechte Idee.

    Warum?

    Weil friends alles mit einer Klasse dürfen. Für eine friend-Funktion (oder -Klasse) sind alle Instanzvariablen und alle Methoden quasi public. Das führt die Idee der Kapselung ad absurdum, und Kapselung ist in meinen Augen ein sehr hohes Gut.

    Hinzu kommt, dass friends nach meiner Erfahrung äußerst selten notwendig sind, und etwas zu verwenden, obwohl es gar nicht notwendig ist, halte ich per se schon für eine schlechte Idee.

    Ich weiß, die Evangelisten sehen das (teilweise?) anders. Bloß überzeugen mich halt deren Argumente nicht. Globale Funktionen als Teil der Schnittstelle einer Klassen bringen mE keinen Gewinn, weder für Anwender noch für Implementierer, und machen das Interface nur schwerer verständlich.

    Stefan.



  • DStefan schrieb:

    Falls eine Funktion intuitiv zur Schnittstelle der Klasse gehört und falls nicht, wie beispielsweise bei manchen Operatoren, andere Gründe dagegen sprechen, würde ich sich auch im public Interface der Klasse deklarieren. Die Vorgehensweise, das Interface sehr klein zu halten und Funktionalität der Klasse in Form globaler Funktionen zu implementieren, wie es die Evangelisten fordern, ist mE Unsinn und erschwert nur das Verständnis der Klasse.

    DStefan schrieb:

    Für eine friend-Funktion (oder -Klasse) sind alle Instanzvariablen und alle Methoden quasi public. Das führt die Idee der Kapselung ad absurdum, und Kapselung ist in meinen Augen ein sehr hohes Gut.

    Soso. Kapselung ist dir also sehr wichtig, aber viele Funktionen, die direkt in der Klasse Zugriff haben, sind ja wahnsinnig viel besser als der böse friend -Hack.

    DStefan schrieb:

    Ich weiß, die Evangelisten sehen das (teilweise?) anders. Bloß überzeugen mich halt deren Argumente nicht.

    Bevor du andere als Evangelisten bezeichnest, solltest du dir vielleicht selbst eine etwas solidere Argumentation zulegen.



  • Nexus schrieb:

    DStefan schrieb:

    Falls eine Funktion intuitiv zur Schnittstelle der Klasse gehört und falls nicht, wie beispielsweise bei manchen Operatoren, andere Gründe dagegen sprechen, würde ich sich auch im public Interface der Klasse deklarieren. Die Vorgehensweise, das Interface sehr klein zu halten und Funktionalität der Klasse in Form globaler Funktionen zu implementieren, wie es die Evangelisten fordern, ist mE Unsinn und erschwert nur das Verständnis der Klasse.

    DStefan schrieb:

    Das führt die Idee der Kapselung ad absurdum, und Kapselung ist in meinen Augen ein sehr hohes Gut.

    Soso. Kapselung ist dir also sehr wichtig, aber viele Funktionen, die direkt in der Klasse Zugriff haben, sind ja wahnsinnig viel besser als der böse friend -Hack.

    Bevor du andere als Evangelisten bezeichnest, solltest du vielleicht eine etwas solidere Argumentation vertreten.

    Die Beiträge der meisten Evangelisten stehen in meinem Regal oder liegen auf meiner Platte. Daran magst du ersehen, dass diese Bezeichnung nicht abwertend gemeint ist. Ich beschäftige mich damit, ich denke darüber nach, ich betrachte die Auswirkungen und ich komme zu einem Ergebnis - vielleicht auch nur zu einem vorläufigen. Dieses Ergebnis schreibe ich hier nieder und kennzeichne es deutlich als meine Meinung.

    Was stört dich also? Dass ich Meinungen von Leuten hinterfrage, die allgemein (auch von mir!) für C++-Koryphäen gehalten werden? Dass ich zu einer anderen Meinung komme? Oder dass ich diese Meinung hier vertrete?

    Im Übrigen argumentierst du gar nicht, sondern polemisierst nur. Das bringt doch niemanden weiter.....

    Stefan.



  • DStefan schrieb:

    Was stört dich also? Dass ich Meinungen von Leuten hinterfrage, die allgemein (auch von mir!) für C++-Koryphäen gehalten werden? Dass ich zu einer anderen Meinung komme? Oder dass ich diese Meinung hier vertrete?

    Nein, mich stört nur, dass du andere Leute aus Gründen als Evangelisten bezeichnest (du kannst sicher nachvollziehen, dass das abwertend rüberkommt), während du jene Gründe an anderen Orten selbst missachtest.

    DStefan schrieb:

    Im Übrigen argumentierst du gar nicht, sondern polemisierst nur. Das bringt doch niemanden weiter.....

    Das stimmt nicht. Aus meinem ersten Satz ist herauszulesen, was ich deiner Argumentation entgegenzusetzen habe: Dass sie widersprüchlich ist.

    Aber um es ausdrücklich zu sagen: So sehr dir die Kapselung am Herzen liegt, solltest du bedenken, dass sie sehr wohl auch darunter leidet, wenn zu viele public -Funktionen in der Klasse vorkommen. Bezüglich Kapselung sind öffentliche Memberfunktionen nämlich nicht besser als friend -Funktionen, weil sie die gleichen Zugriffsrechte - möglicherweise ungerechtfertigt - besitzen. Deshalb ist dein einziges Argument gegen friend bisher, dass es unnötig ist; für Memberfunktionen im Gegensatz zu freien Nicht- friend -Funktionen hast du gar keine Begründung geliefert, sondern nur behauptet, dass sie weder für Anwender noch Implementierer Gewinn bringen und das Interface schwerer verständlich machen. Dabei sollte gerade die dir so wichtige Kapselung das Gegenteil aufzeigen.



  • @Nexus: Danke, dass du so antwortest. Wusste ich doch, dass man mit dir ernsthaft diskutieren kann 😉

    Auf das eigentliche Thema kann ich dir aus Zeitgründen jetzt nicht antworten. Ich hole das heute Nacht oder spätestens morgen nach.

    Zu den Evangelisten: Vielleicht habe ich hier allzu sehr den angelsächsischen Sprachgebrauch (oder Sprachgefühl?) übernommen. Mir scheint, dass dort, wenn man im technischen Zusammenhang von "evangelist" spricht keineswegs Herabsetzung sondern eher Hochachtung mitschwingt. So habe ich das Wort verstanden. Vielleicht mit einer kleinen Prise Allwissenheit im Nachgeschmack 😉

    Zu friends, wie gesagt, später.....

    Stefan.



  • Weil friends alles mit einer Klasse dürfen. Für eine friend-Funktion (oder -Klasse) sind alle Instanzvariablen und alle Methoden quasi public. Das führt die Idee der Kapselung ad absurdum, und Kapselung ist in meinen Augen ein sehr hohes Gut.

    No! If they're used properly, they enhance encapsulation.

    http://www.parashift.com/c++-faq-lite/friends.html

    Kapselung

    http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.6 und 7.7



  • Evangelisten sind Boten, Verkünder und dergleichen. Da ist doch nix negatives dran.



  • Tyrdal schrieb:

    Evangelisten sind Boten, Verkünder und dergleichen. Da ist doch nix negatives dran.

    Doch, klar. Evangelisten sind gewöhnlich religiös und damit intolerant, antiwissenschaftlich, dogmatisch und menschenverachtend. Als Technology Evangelist sind sie Marketingfuzzies, die Mist als neue Technologie verkaufen wollen, auch das ist als Beleidigung gut geeignet. Damit wirft man jemandem vor, daß er von der Technik keine Ahnung hat, und nur heftig dran glaubt und verkaufen will. Evangelisten sind aktive Marktschreier, wobei das Schreien der notwendige Bestandteil ist und die Sachkenntnis nicht so notwendig und oft sogar hinderlich. Die Leute, die Ahnung haben, sind die Gurus, oder?



  • Es war so klar, dass Volkard so was schreibt 😃



  • DStefan schrieb:

    @Nexus: Danke, dass du so antwortest. Wusste ich doch, dass man mit dir ernsthaft diskutieren kann 😉

    Danke. Tut mir leid, wenn der erste Post etwas unsachlich rüberkam, ich wollte dich eigentlich zum Nachdenken anregen.

    Was die Evangelisten betrifft, habe ich an etwas Ähnliches wie volkard gedacht, wenn auch nicht so extrem. Ich kann mich auch nicht an Kontexte erinnern, in denen das Wort positiv verwendet wurde... Zusammen mit deiner Beschreibung habe ich das wohl falsch aufgefasst.



  • volkard schrieb:

    Tyrdal schrieb:

    Evangelisten sind Boten, Verkünder und dergleichen. Da ist doch nix negatives dran.

    Doch, klar. Evangelisten sind gewöhnlich religiös und damit intolerant, antiwissenschaftlich, dogmatisch und menschenverachtend. Als Technology Evangelist sind sie Marketingfuzzies, die Mist als neue Technologie verkaufen wollen, auch das ist als Beleidigung gut geeignet. Damit wirft man jemandem vor, daß er von der Technik keine Ahnung hat, und nur heftig dran glaubt und verkaufen will. Evangelisten sind aktive Marktschreier, wobei das Schreien der notwendige Bestandteil ist und die Sachkenntnis nicht so notwendig und oft sogar hinderlich. Die Leute, die Ahnung haben, sind die Gurus, oder?

    Einfach Top! 👍


Anmelden zum Antworten