Frage

In dem (sonst) ausgezeichneten Buch C ++ Coding Standards Punkt werden sich die Mitglieder dieser Klasse 44, mit dem Titel „Bevorzugen nonmember nonfriend Funktionen schreiben“ , Sutter und Alexandrescu empfehlen, dass nur Funktionen, die wirklich Zugriff auf die Mitglieder einer Klasse benötigen. Alle anderen Operationen, die unter Verwendung von nur Elementfunktionen geschrieben werden können, sollten nicht Teil der Klasse sein. Sie sollten Nicht-Mitglieder und nonfriends sein. Die Argumente sind folgende:

  • Sie fördert die Verkapselung, weil es weniger Code ist, der Zugriff auf die Interna einer Klasse muss.
  • Es macht Schreibfunktion Vorlagen einfacher, weil Sie, ob eine bestimmte Funktion ein Mitglied nicht jedes Mal erraten müssen, ist oder nicht.
  • Er hält die Klasse klein, was wiederum macht es einfacher zu testen und zu warten.

Auch wenn ich den Wert in dieser Argumentation sehe, sehe ich einen großen Nachteil: meine IDE kann mir nicht helfen, diese Funktionen zu finden Jedes Mal, wenn ich ein Objekt irgendeiner Art haben, und ich möchte, um zu sehen! welche Operationen auf sie verfügbar sind, kann ich nicht einfach „pMysteriousObject->“ und eine Liste der Member-Funktionen mehr bekommen.

ein klares Design zu halten, ist am Ende über Ihre Programmierung des Leben leichter zu machen. Aber das würde meine sehr viel schwieriger tatsächlich machen.

Also ich frage mich, ob es wirklich die Mühe wert. Wie geht man damit um?

War es hilfreich?

Lösung

Ich werde mit Sutter und Alexandrescu auf diesen einen haben, zu widersprechen. Ich denke, wenn das Verhalten der Funktion foo() fällt in dem Bereich der Klasse Bar Verantwortlichkeit, dann sollte foo() Teil bar() sein.

Die Tatsache, dass foo() keinen direkten Zugriff auf Bar Mitgliedsdaten benötigt bedeutet nicht, es begrifflich nicht Teil Bar ist. Es kann auch bedeuten, dass der Code ist gut berücksichtigt. Es ist nicht ungewöhnlich Mitgliederfunktionen zu haben, die ihr Verhalten alle über andere Member-Funktionen ausführen, und ich sehe nicht, warum es sein sollte.

Ich bin vollkommen einverstanden, dass peripher bezogenen Funktionen sollte nicht Teil der Klasse sein, aber wenn etwas Kern die Klasse Verantwortung ist, gibt es keinen Grund, warum es kein Mitglied sein sollte, unabhängig davon, ob es wird direkt mit den Mitgliedsdaten herumschlagen.

Wie für diese spezifischen Punkte:

  

Es fördert die Verkapselung, weil es weniger Code ist, der Zugriff auf die Interna einer Klasse muss.

Tatsächlich, desto weniger Funktionen, die direkt die Interna zugreifen, desto besser. Das bedeutet, dass mit Elementfunktionen wie möglich, so viel zu tun über andere Member-Funktionen ist eine gute Sache. Die Aufteilung gut einkalkuliert Funktionen aus der Klasse läßt Dich nur mit einer halben Klasse, die eine Reihe von externen Funktionen erfordert, nützlich zu sein. Ziehen gut einkalkuliert Funktionen von ihren Klassen scheint auch das Schreiben von gut einkalkuliert Funktionen zu verhindern.

  

Es erleichtert Funktionsschablonen zu schreiben, da Sie, ob eine bestimmte Funktion ein Mitglied nicht jedes Mal erraten müssen, ist oder nicht.

ich das gar nicht verstehen. Wenn Sie eine Reihe von Funktionen aus Klassen ziehen, haben Sie mehr Verantwortung auf Funktionsschablonen gestoßen. Sie sind gezwungen, anzunehmen, dass noch weniger Funktionalität durch ihre Klassenvorlage Argumente zur Verfügung gestellt, es sei denn, wir gehen davon aus, dass die meisten Funktionen aus ihren Klassen gezogen wird in eine Vorlage umgewandelt werden (igitt).

  

Es hält die Klasse klein, was wiederum macht es einfacher zu testen und zu warten.

Um, sicher. Es schafft auch eine Menge zusätzlicher, externer Funktionen zu testen und zu warten. Ich kann nicht den Wert in dem sehen.

Andere Tipps

Scott Meyers eine ähnliche Meinung zu Sutter hat, finden Sie unter hier .

Er hat auch eindeutig fest, wie folgt vor:

"Auf der Grundlage seine Arbeit mit verschiedenen strangartigen Klassen hat Jack Reeves beobachtet, dass einige Funktionen einfach nicht‚fühlen‘Recht, wenn Nicht-Mitglieder, auch wenn sie nicht-Freund Nicht-Mitglieder sein könnte . die „beste“ -Schnittstelle für eine Klasse nur durch den Ausgleich viele konkurrierende Interessen gefunden werden kann, von denen der Grad der Verkapselung, aber man ist. "

Wenn eine Funktion sei etwas, das „nur Sinn macht“ eine Member-Funktion sein, macht es zu einem. Ebenso, wenn es nicht wirklich Teil des Haupt-Schnittstelle ist, und „nur Sinn macht“ ein Nicht-Mitglied sein, das zu tun.

Ein Hinweis ist, dass mit überladenen Versionen von zB operator == (), die Syntax gleich bleibt. Also in diesem Fall haben Sie keinen Grund nicht zu machen, eine Nicht-Mitglied nicht-Freund Floating-Funktion an der gleichen Stelle wie die Klasse erklärte, es sei denn, es ist wirklich Zugriff auf private Mitglieder (nach meiner Erfahrung braucht es selten wird). Und selbst dann können Sie definieren Operator! = () Ein Nicht-Mitglied und in Bezug auf dem Operator == ().

Ich glaube nicht, es wäre falsch zu sagen, dass zwischen ihnen, Sutter, Alexandrescu und Meyers mehr für die Qualität von C ++ getan als jeder andere.

Eine einfache Frage, die sie stellen, ist:

  

Wenn eine Nutzenfunktion zwei unabhängige Klassen als parameteres hat, welche Klasse sollte „besitzen“ die Member-Funktion?

Ein weiteres Problem ist nur Member-Funktionen hinzufügen kann, wo die betreffende Klasse unter Kontrolle ist. Jegliche Hilfsfunktionen, die Sie schreiben für std :: string müssen nicht Mitglieder sein, da Sie nicht die Klassendefinition wieder öffnen.

Für diese beiden Beispiele, Ihre IDE unvollständige Informationen zur Verfügung stellen, und Sie werden die „alte Art und Weise Art und Weise“ verwenden.

Da die einflussreichsten C ++ Experten in der Welt berücksichtigen, dass nicht-Member-Funktionen mit einem Klasse-Parameter Teil der Klassen-Schnittstelle ist, diese eher ein Problem mit Ihrem IDE ist eher als die Art der Programmierung.

Ihre IDE werden wahrscheinlich in einem Release ändern oder zwei, und Sie können sogar in der Lage sein, sie um diese Funktion hinzuzufügen zu bekommen. Wenn Sie Ihren Programmierstil ändern heutige IDE passen gut Sie können feststellen, dass Sie in Zukunft mit nicht dehnbarem / wartbaren Code größere Probleme haben.

Es ist wahr, dass externe Funktionen nicht Teil der Schnittstelle sein sollten. nur in der Theorie sollte Ihre Klasse, die Daten enthalten und die Schnittstelle für entlarven, was es soll, und nicht nützliche Funktionen. Hinzufügen von Hilfsfunktionen an die Schnittstelle wächst nur die Klasse Code-Basis und macht es weniger wartbar. Ich bleibe noch eine Klasse mit rund 50 öffentlichen Methoden, das ist einfach verrückt.

Nun, in Wirklichkeit, ich bin einverstanden, dass dies nicht einfach ist, zu erzwingen. Es ist oft einfacher, nur eine andere Methode Ihrer Klasse hinzufügen, noch mehr, wenn Sie eine IDE verwenden, die wirklich einfach eine neue Methode zu einer vorhandenen Klasse hinzufügen können.

Um meine Klassen einfach zu halten und nach wie vor externe Funktion zentralisieren kann, verwende ich oft Utility-Klasse, die mit meiner Klasse arbeitet, oder auch Namensräume. Ich beginne mit der Klasse zu erstellen, die meine Daten wickeln werden und eine möglichst einfache Schnittstelle aus. Ich erstelle dann eine neue Klasse für jede Aufgabe, die ich mit der Klasse zu tun haben.

. Beispiel: ein Klasse-Punkt erstellen, dann eine Klasse PointDrawer fügen Sie es in eine Bitmap zu zeichnen, PointSerializer sie zu speichern, usw.

Wenn Sie ihnen einen gemeinsamen Präfix geben, dann vielleicht Ihre IDE werden helfen, wenn Sie geben

::prefix

oder

namespace::prefix

In vielen OOP-Sprachen nicht-Freund nicht-Klasse Methoden sind Menschen dritte Klasse, die alles in einem Waisenhaus unverbundene wohnen. Wenn ich eine Methode schreiben, ich mag gute Eltern holen - eine passende Klasse - wo sie die besten Chancen haben, willkommen und helfen fühlen

.

ich die IDE eigentlich hätte gedacht, wurde hilft dir.

Die IDE versteckt die geschützten Funktionen aus der Liste, weil sie nicht für die sind öffentlich wie der Designer der Klasse bestimmt .

Wenn Sie im Rahmen der die Klasse gewesen waren und getippt das. -> dann würden die geschützten Funktionen in der Liste angezeigt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top