Erstens stimmt nicht jeder mit diesem Ratschlag überein. Ich glaube nicht, dass ich irgendjemanden außer Meyers gesehen habe (edit: und Herb Sutter) diesen Rat geben, und ich habe es nur im Zusammenhang mit C++ gesehen.Beispielsweise ist das Erstellen von Nichtmitglied-Nicht-Freund-Funktionen in Java oder C# nicht wirklich möglich, da Java und C# keine freien Funktionen haben und Ruby-Entwickler beispielsweise "humane interfaces" bevorzugen, die absichtlich Memberfunktionen erzeugen, die dasselbe tun was Nicht-Mitglieder tun könnten, um den Anrufern dieser Funktionen das Leben zu erleichtern. Wenn Sie den Rat von Meyers akzeptieren, sollten Sie Nicht-Mitglied-Nicht-Freund-Funktionen den Mitgliedsfunktionen vorziehen (und ich denke, es ist ein guter Rat, hat mir sicherlich geholfen, Kapselung besser anzuwenden, um die Implementierung einer Klasse zu kapseln.) sogar von seinen Mitgliedsfunktionen), das ist nur eine Designachse zu berücksichtigen. Das Schlüsselkonzept des objektorientierten Designs ist, dass Objekte etwas tun. Ein Objekt ist nicht einfach eine Tasche von Settern und Gettern, zu denen anderer Code stößt. Stattdessen sollte es ein angehängtes Verhalten haben - das heißt, es sollte Methoden haben, die Dinge tun - und es sollte die Details darüber kapseln, wie es diese Dinge macht. Wenn Sie diesen Ansatz bei OO befolgen, dann schmerzt der Rat von Meyers so sehr, wie Sie es getan haben, die Verkapselung, anstatt ihr zu helfen: Sie setzen schließlich alle internen Implementierungsvariablen der Klasse über Getter und Setter frei, anstatt sie so zu verstecken, dass nur die Klasse Methoden (der Code, der für Sachen im Namen der Klasse verantwortlich ist, der der einzige Grund ist, warum Sie eine Klasse haben, um damit zu beginnen), kann dazu kommen.
So Ihre Frage zu beantworten, wie weit Meyers Rat zu nehmen: Nicht unnötig wiederum Funktionen in Elementfunktionen, wenn sie vernünftigerweise als Nicht-Freund nicht-Member-Funktionen mit einer Klasse öffentliche Schnittstelle implementiert werden könnte, aber beschädige die öffentliche Schnittstelle einer Klasse nicht und verletze ihre Kapselung, indem du die Implementierung einfach der aussetzt, um etwas zu einem Mitglied zu machen. Und stellen Sie sicher, dass Sie die Kapselung gegen andere Bedenken und andere Ansätze ausbalancieren (einschließlich, wenn Ihr Team beschließt, diesen Weg zu gehen, die Vor- und Nachteile einer ausgewachsenen humanen Schnittstelle).
Für diejenigen ohne eine Kopie von Effektiv C++, Meyers präsentiert ein ähnliches Argument unter http://www.ddj.com/cpp/184401197. –