Muss ich beim Erstellen einer Bibliothek sicherstellen, dass die privaten Methoden wie erwartet funktionieren, wenn sie nicht von anderen Methoden derselben Klasse, sondern von einer anderen Bibliothek durch Reflektion aufgerufen werden ?
Wenn beispielsweise eine private Methode private DoSomething(int number)
Folgendes erwartet:
number
ist eine positive Ganzzahl ungleich Null und:- Eine private Variable
string abc
ist nicht null und keine leere Zeichenfolge.
und vollständig, hässlich schlägt fehl , wenn diese beiden Bedingungen nicht übereinstimmen, muss ich diese Ausfälle behandeln , auch wenn ich weiß , dass alle Methoden in der Klasse wird always¹ assign eine nicht leere Wert abc
vor dem Aufruf DoSomething
, und übergeben Sie eine positive ganze Zahl ungleich Null auf diese Methode?
Mit anderen Worten, kann der Code, der nicht durch Reflektion vor unsicheren Anrufen geschützt ist, als Code geringer Qualität betrachtet werden , oder gehört er dem Anrufer, der Reflektion verwendet, um sicherzustellen, dass der Anruf nichts unterbricht?
Hinweis: Meine Frage deckt nur einen Standardsatz von Bibliotheken ab. Dies gilt nicht für Code, der sehr sicher sein muss (z. B. wenn jemand Interesse daran hat, Reflektion zu verwenden, damit er sich unerwartet verhält oder abstürzt).
¹ Weil die Klasse korrekt dokumentiert ist, weil es genügend Komponententests gibt, um sicherzustellen, dass kein anderer Entwickler diese Methode durchbricht usw.
quelle
Antworten:
Indem Sie Ihre Methode als privat markieren, haben Sie Ihre Absichten und einen Vertrag festgelegt. Durch die Verwendung von Reflection kann ein Kundencode gegen diesen Vertrag verstoßen und muss folglich die Konsequenzen tragen. Dasselbe passiert mit Protokollen, denn die Regeln für das Funktionieren müssen befolgt werden, sonst werden schlimme Dinge passieren.
Das gleiche Problem kann bei anderen Sprachen wie C ++ auftreten, bei denen ich solche Dinge gesehen habe
Fazit: Sie müssen NICHT mit diesen Situationen umgehen, der Anrufer sollte es besser wissen.
quelle
Wenn jemand Reflection verwendet, um Ihre privaten Methoden aufzurufen, ist dies ein Zeichen dafür, dass jemand etwas falsch macht. Entweder verwendet er den Code auf eine Weise, für die er nicht entwickelt wurde, oder Sie verstecken zu viel von der internen Arbeitsweise und machen die API unsichtbar.
Aber es hört sich so an, als wären Sie noch nicht einmal in diesem Stadium und versuchen nur, vorbeugend vorzugehen. Meine Meinung ist also: Mach dir keine Sorgen. Eine private Methode sollte als tabu angesehen werden. Wenn jemand absichtlich diese Grenzen überschreitet, dann ist es ihr Problem, wenn die Dinge explodieren.
quelle
Nun, es ist immer eine gute Idee, nicht-lokale Variablen zu validieren, bevor Sie sie verwenden, aber ansonsten würde ich mir darüber keine Sorgen machen. Wie die anderen sagten, haben Sie Ihre Absichten begründet, indem Sie die Methode zunächst als privat deklariert haben. Jeder, der von außerhalb Ihrer Klasse anruft, hat keine Garantie. Wenn ich in Java arbeite, schreibe ich nicht einmal Javadoc-Kommentare zu meinen privaten Methoden, weil ich nicht möchte, dass andere Entwickler überhaupt wissen, dass sie da sind.
quelle