Best Practices für die Verwendung von öffentlichen, geschützten, privaten?

12

Ist es fair zu sagen, dass es eine gute Praxis ist, privatebeim Codieren alles nach vorne zu verschieben?

Und aktualisieren Sie es dann nur, protectedwenn eine Unterklasse es benötigt oder publicwenn eine andere Klasse es benötigt?

AJJ
quelle
2
Wenn Sie eine API erstellen, müssen Sie die Funktionen vorwegnehmen, die ein Aufrufer möglicherweise benötigt. Daher müssen Sie Ihre Zugriffsmodifikatoren genauer betrachten. Es hängt davon ab, wer den Code verwendet, den Sie schreiben.
user2023861

Antworten:

10

Kurze Antwort: Ja

Längere Antwort:

Ja, aber das sollte nicht als Vorschlag interpretiert werden, zunächst Ihre Klassen mit allem Privaten zu schreiben. Dieser Ansatz impliziert Klassenentwurf, indem Sie sich auf die Implementierungsdetails konzentrieren, bevor Sie sich für eine Schnittstelle entschieden haben.

Einer der wichtigsten Aspekte, die beim Entwerfen einer Klasse berücksichtigt werden müssen, ist die Art und Weise, wie sie verwendet wird. Dazu müssen Sie über Ihre öffentlichen Methoden nachdenken, bevor Sie sich Gedanken über Details zu Private / Implementierung machen.

Außerdem verpasst dieser Ansatz normalerweise die Chance, sich zu fragen: "Wie würde ich einen Komponententest für diese Klasse schreiben?" - Dies ist eine wichtige Frage, auch wenn Sie keine Unit-Tests schreiben. (Siehe auch: "Welche Gestaltungsprinzipien fördern testbaren Code?" )

Sobald Sie die öffentliche Schnittstelle definiert haben, ist es eine gute Idee, den Rest auf privat zurückzusetzen, da die meisten Details der Implementierung normalerweise grobkörnig sind und für nichts außerhalb der Klasse von Belang sind.

Ben Cottrell
quelle
Wenn ich also versuchen möchte, zusammenzufassen, was Sie zu Ihnen zurücksagen (um zu sehen, ob ich es verstehe), ist es eine gute Idee, zuerst an die öffentlich zugängliche Schnittstelle zu denken (dh wie wird diese Klasse tatsächlich von der verwendet?) draussen anfangen?) und dann alles andere privat machen?
AJJ
1
@ArukaJ Ein guter Ansatz besteht darin, Code zu schreiben, der Ihre Klassen verwendet, bevor Sie die Implementierung erstellen. Dies kann ein Problem mit Hühnern oder Eiern sein, bis Sie anfangen, Komponententests zu schreiben.
JimmyJames
1
@ArukaJ Im Großen und Ganzen ja; Das scheint auf den ersten Blick schwieriger zu sein, obwohl es sich, wie JimmyJames erwähnt, viel intuitiver anfühlt, wenn Sie Komponententests schreiben. Es mag eine etwas andere Denkweise beinhalten, aber das Ziel ist es, genauer darüber nachzudenken, was Ihre Klasse darstellt und wie Ihre Ein- / Ausgaben aussehen - insgesamt ist dies nur eine viel "OO" -Methode, um über Design nachzudenken. eher zu ordentlich gekapselten Klassen mit hoher Kohäsion führen.
Ben Cottrell
Ich bin misstrauisch, Unit-Tests zum Entwerfen Ihrer Klasse zu verwenden, da Unit-Tests nicht diejenigen sind, die sie wirklich verwenden werden. Sie sind jedoch definitiv besser als alles andere, wenn es darum geht, wie die Klasse verwendet wird.
user949300
8

"Und aktualisieren Sie es dann nur auf protected, wenn eine Unterklasse es benötigt, oder public, wenn eine andere Klasse es benötigt?"

Das ist der falsche Ansatz. Zur Entwurfszeit sollten Sie wissen, welchen öffentlichen Zugriff Sie gewähren möchten . Normalerweise gewähren Sie öffentlichen Zugang, weil das der ganze Zweck Ihrer Klasse ist. Und Sie geben geschützten Zugang , weil Sie wollen Subklassen Zugang Dinge. Und Sie verwenden privat für Dinge, die niemand anderes zu tun hat.

Wenn jemand Zugang zu Dingen benötigt, auf die er nicht zugreifen kann, sollten Sie sich wirklich Gedanken über diese Notwendigkeit machen . Sie sollten diesen Zugang nicht benötigen , oder Ihr Design ist falsch. Vielleicht ist Ihr Design ist falsch, und etwas ist nicht öffentlich , die öffentlich sein sollten, so können Sie das ändern. Aber wenn Ihr Design stimmt, stimmt etwas mit dem Bedarf nicht . Sie beheben dies , anstatt Ihr Design zu beschädigen.

gnasher729
quelle
Angenommen, Sie haben eine Klasse, die Sie zu diesem Zeitpunkt nicht unterordnen möchten (und möglicherweise auch nicht müssen), und eine Methode, die für die Unterklasse nützlich / erforderlich wäre , wenn Sie Ihre Klasse unterordnen würden. Würden Sie diese Methode machen privateoder protected?
lfk
Sollte die akzeptierte Antwort sein, alles privat zu machen klingt auf den ersten Blick so, als würde ich nicht denken / gestalten wollen.
Niing
2

Der Schlüssel zum Verständnis dieses Aspekts der objektorientierten Programmierung ist das Konzept der Datenkapselung . Die Idee ist, eine Klasse verständlicher zu machen, indem die Implementierungsdetails ausgeblendet werden. Dies wird als Ausblenden von Daten bezeichnet . Daher möchten wir nur die Funktionen verfügbar machen, die für die Verwendung der Klasse erforderlich sind. Diese Funktionen sind die Schnittstelle zur Klasse.

Stellen Sie sich eine Schnittstelle wie das Rad eines Autos vor. Sie entscheiden, in welche Richtung das Auto fährt, indem Sie das Rad drehen. Unter den Abdeckungen befinden sich jedoch Drehventile, Hydraulik und Riemenscheiben, die die Drehung Ihrer Räder ändern. Sie müssen jedoch kein Maschinenbauingenieur sein, um ein Auto zu fahren.

Die Antwort auf Ihre Frage lautet also ja. Sie möchten so viele Details zu einer Klasse wie möglich vor anderen Klassen verbergen. Zu verstehen, wann etwas öffentlich, privat oder geschützt sein sollte, ist leicht zu lernen, aber schwer zu meistern.

Chris Ghyzel
quelle