Der Standardzugriff macht den Modifikator für den privaten Zugriff nicht überflüssig.
Die Position der Sprachdesigner dazu spiegelt sich im offiziellen Tutorial - Kontrolle des Zugangs zu Mitgliedern einer Klasse - wider und ist ziemlich klar (für Ihre Bequemlichkeit relevante Aussage in dem fett gedruckten Zitat ):
Tipps zur Auswahl einer Zugriffsebene:
Wenn andere Programmierer Ihre Klasse verwenden, möchten Sie sicherstellen, dass keine Fehler aufgrund von Missbrauch auftreten können. Zugriffsebenen können Ihnen dabei helfen.
- Verwenden Sie die restriktivste Zugriffsebene, die für ein bestimmtes Mitglied sinnvoll ist. Verwenden Sie privat, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.
- Vermeiden Sie öffentliche Felder mit Ausnahme von Konstanten. (In vielen Beispielen des Lernprogramms werden öffentliche Felder verwendet. Dies kann zur Veranschaulichung einiger Punkte hilfreich sein, wird jedoch für Produktionscode nicht empfohlen.) Öffentliche Felder verlinken Sie in der Regel mit einer bestimmten Implementierung und schränken Ihre Flexibilität beim Ändern Ihres Codes ein.
Ihr Appell an die Testbarkeit als Rechtfertigung für den vollständigen Wegfall des Modifikators "Private" ist falsch, wie z. B. die Antworten in " Neu bei TDD" belegen . Sollte ich jetzt private Methoden meiden?
Natürlich können Sie private Methoden haben und natürlich können Sie sie testen.
Entweder gibt es eine Möglichkeit, die private Methode zum Laufen zu bringen. In diesem Fall können Sie sie auf diese Weise testen, oder es gibt keine Möglichkeit , die private Methode zum Laufen zu bringen. In diesem Fall: Warum zum Teufel versuchen Sie es nur zu testen? lösche das verdammte Ding ...
Die Position der Sprachentwickler in Bezug auf den Zweck und die Verwendung des Zugriffs auf Paketebene wird in einem anderen offiziellen Tutorial, Erstellen und Verwenden von Paketen, erläutert. Es hat nichts mit der Idee zu tun, private Modifikatoren zu löschen (für Ihre Bequemlichkeit relevante Aussage im fett gedruckten Zitat ). :
Sie sollten diese Klassen und die Schnittstelle aus verschiedenen Gründen in einem Paket bündeln, unter anderem aus folgenden Gründen:
- Sie und andere Programmierer können leicht feststellen, dass diese Typen verwandt sind ...
- Sie können zulassen, dass Typen innerhalb des Pakets uneingeschränkten Zugriff aufeinander haben und dennoch den Zugriff für Typen außerhalb des Pakets einschränken ...
<rant> Ich glaube, ich habe genug Gejammer gehört. Schätze, es ist an der Zeit, laut und deutlich zu sagen ... </ rant>
Private Methoden sind für Unit-Tests von Vorteil.
Der folgende Hinweis setzt voraus, dass Sie mit der Codeabdeckung vertraut sind . Wenn nicht, nehmen Sie sich Zeit zum Lernen, da dies für diejenigen, die an Unit-Tests interessiert sind und überhaupt testen möchten, sehr nützlich ist.
Also gut, ich habe diese privaten Methoden- und Unit-Tests und die Coverage-Analyse, die mir sagt, dass es eine Lücke gibt, meine private Methode wird nicht durch Tests abgedeckt. Jetzt...
Was verdiene ich, wenn ich es privat halte?
Da die Methode privat ist, müssen Sie nur den Code untersuchen, um zu erfahren, wie er über die nicht-private API verwendet wird. Typischerweise zeigt eine solche Studie, dass der Grund für die Lücke darin liegt, dass in Tests ein bestimmtes Nutzungsszenario fehlt.
void nonPrivateMethod(boolean condition) {
if (condition) {
privateMethod();
}
// other code...
}
// unit tests don't invoke nonPrivateMethod(true)
// => privateMethod isn't covered.
Der Vollständigkeit halber könnten andere (weniger häufige) Gründe für solche Abdeckungslücken Fehler in der Spezifikation / Konstruktion sein. Ich werde hier nicht weiter darauf eingehen, um die Dinge einfach zu halten. Es reicht zu sagen, dass Sie die Chance verpassen werden, zu erfahren, dass diese Fehler überhaupt existieren, wenn Sie die Zugriffsbeschränkung "nur um die Methode testbar zu machen" schwächen.
Gut, um die Lücke zu schließen, füge ich einen Komponententest für das fehlende Szenario hinzu, wiederhole die Abdeckungsanalyse und stelle sicher, dass die Lücke weg ist. Was habe ich jetzt? Ich habe als Neuheit einen Unit-Test für die spezifische Nutzung der nicht-privaten API.
Ein neuer Test stellt sicher, dass sich das erwartete Verhalten für diese Verwendung nicht ohne Vorankündigung ändert, da der Test fehlschlägt, wenn er sich ändert.
Ein externer Leser kann sich diesen Test ansehen und lernen, wie er verwendet werden soll und wie er sich verhält (hier schließt der externe Leser mein zukünftiges Ich ein, da ich den Code ein oder zwei Monate, nachdem ich damit fertig bin, vergesse).
Neuer Test ist tolerant gegenüber Refactoring (refactor ich private Methoden? Wetten Sie!) Was auch immer ich tue privateMethod
, ich werde immer testen wollen nonPrivateMethod(true)
. Unabhängig davon, was ich tue privateMethod
, muss der Test nicht geändert werden, da die Methode nicht direkt aufgerufen wird.
Nicht schlecht? Wetten Sie?
Was verliere ich durch die Schwächung der Zugriffsbeschränkung?
Stellen Sie sich nun vor, dass ich statt der oben genannten lediglich die Zugriffsbeschränkung abschwäche. Ich überspringe das Studium des Codes, der die Methode verwendet, und fahre direkt mit dem Test fort, der my aufruft exPrivateMethod
. Groß? Nicht!
Erhalte ich einen Test für die spezifische Nutzung der oben genannten nicht-privaten API? Nein, es gab nonPrivateMethod(true)
vorher keinen Test , und jetzt gibt es keinen solchen Test.
Erhalten externe Leser die Möglichkeit, die Verwendung der Klasse besser zu verstehen? Nein. "- Hey, was ist der Zweck der hier getesteten Methode? - Vergiss es, sie ist ausschließlich für den internen Gebrauch bestimmt. - Ups."
Ist es tolerant für Refactoring? Auf keinen Fall: Was auch immer ich ändere exPrivateMethod
, wird den Test wahrscheinlich brechen. Benennen Sie um, führen Sie sie in eine andere Methode ein, ändern Sie die Argumente, und der Test hört einfach auf zu kompilieren. Kopfschmerzen? Wetten Sie?
Zusammenfassend kann ich sagen , dass das Festhalten an der privaten Methode eine nützliche und zuverlässige Verbesserung bei Unit-Tests darstellt. Im Gegensatz dazu gibt mir die Schwächung der Zugriffsbeschränkungen "für die Testbarkeit" nur einen undurchsichtigen, schwer verständlichen Teil des Testcodes, der außerdem permanent durch geringfügiges Refactoring beschädigt werden kann. ehrlich gesagt, was ich bekomme, sieht verdächtig nach technischer Verschuldung aus .
</ rant>