Ist es ein Codegeruch, eine öffentliche Methode in einer privaten Methode derselben Objektinstanz aufzurufen?
Ist es ein Codegeruch, eine öffentliche Methode in einer privaten Methode derselben Objektinstanz aufzurufen?
Antworten:
Nein, kein schlechter Geruch. Dies könnte erforderlich sein. Warum vermuten Sie, dass es falsch ist? Eine Methode auf atomarer Ebene ist eine unabhängige Einheit, die eine Aufgabe ausführt. Solange eine Aufgabe erledigt wird, kann jeder, der Zugriff darauf hat, diese aufrufen, um die Aufgabe zu erledigen.
Code riechen? Ja, nicht wirklich schlecht, aber ein guter Indikator dafür, dass die Klasse möglicherweise zu viele Verantwortlichkeiten hat.
Nehmen Sie es als Zeichen dafür, dass die Klasse möglicherweise in verschiedene Objekte aufgeteilt werden muss. Private Methoden sollten nicht unbedingt öffentliche Methoden desselben Objekts aufrufen müssen, jedenfalls nicht in einem sauberen OO-Design.
Wenn Sie die Klasse überprüft haben und die Gründe für den Methodenaufruf klar sind, kann dies natürlich durchaus sinnvoll sein. Im Allgemeinen würden Sie erwarten, dass Dienstprogrammmethoden für die Klasse privat sind, aber wenn eine nützlich genug ist Wenn sie öffentlich sind und von anderen Methoden verwendet werden, würde ich allgemein erwarten, dass diese Methoden auch öffentlich sind.
Wie bei allen Code-Gerüchen ist dies eine Motivation für weitere Code-Inspektion, Rationalisierung und vielleicht Umgestaltung, aber kein Grund zur Beunruhigung.
Es kann zu unangenehmen Überraschungen führen, wenn jemand, der den Quellcode dieser Klasse nicht gelesen hat, versucht, eine Unterklasse zu erstellen, und die öffentliche Methode überschreibt. Ob das wirklich ein Problem ist, hängt natürlich von Ihrer Situation ab. Vielleicht solltest du überlegen, die öffentliche Methode oder sogar die Klasse endgültig zu machen.
Was sollte in diesem Fall noch getan werden? Machen Sie die private Methode öffentlich oder die öffentliche Methode privat? Kopieren Sie den Code aus der öffentlichen Methode in die private Methode.
NEIN , kein übler Geruch hier.
Wenn wir die Schnittstelle einer Warteschlange mit List implementieren, ist es ein schlechter Geruch, nur die richtigen List-Funktionen aufzurufen, um die Implementierung der Warteschlange einfach zu erreichen?
Wenn Sie etwas haben und es in etwas anderes umwandeln möchten (wie einen Wrapper), dann ist es kein schlechter Geruch. Die Wiederverwendbarkeit des Codes mit dem Entwurfsmuster erfolgt auf Funktionsebene. (Ist eine Funktion ein Objekt?)
Ich weiß, dass dies ein alter Beitrag ist, aber darüber habe ich bei der Arbeit diskutiert. Ich halte dies für einen Codegeruch und kann nicht verstehen, warum Sie dies jemals tun möchten. Wenn eine private Methode eine öffentliche Methode aufrufen muss, sollte der Inhalt der öffentlichen Methode entnommen und in eine private Methode gestellt werden, die dann beide Methoden aufrufen können. Warum?
Die öffentliche Methode enthält möglicherweise Tests, die nicht mehr erforderlich sind, wenn Sie Code intern ausführen. Möglicherweise wird ein UserObj empfangen, und Sie möchten beispielsweise die Benutzerberechtigungen testen.
Nach einem öffentlichen Aufruf müssen Sie das Objekt möglicherweise sperren, wenn Sie Threading verwenden. Sie möchten also intern nicht zu einer öffentlichen Methode zurückkehren.
Meiner Meinung nach ist es wahrscheinlicher, Zirkelfehler und Endlosschleifen sowie Ausnahmen einzuführen.
Schlicht und einfach, schlechtes Design und "faul". Öffentliche Methoden ermöglichen den Zugang zur Außenwelt. Es gibt keinen Grund, wieder nach draußen zu gehen, wenn Sie schon drinnen sind.
Stellen Sie sich das Gegenteil vor. Sie befinden sich in einer privaten Methode und benötigen Funktionen in einer öffentlichen Methode. Was wäre, wenn Sie diese öffentliche Methode nicht von der privaten Methode aus aufrufen könnten ? Was würdest du tun?
Die Antwort ist eindeutig, dass Sie, wenn Sie die Funktionalität in einer öffentlichen Methode wünschen, diese Methode aus Methoden dieser Klasse oder aus anderen Klassen aufrufen können sollten.
In meinem Code erstelle ich häufig verzögerte Ladevorgänge, dh, das Objekt wird beim ersten Anfordern initialisiert und verwendet anschließend dasselbe instanziierte Objekt erneut. Ein Objekt, das mit einer verzögerten Last instanziiert wird, impliziert jedoch, dass es nicht unbedingt an einem bestimmten Punkt instanziiert werden muss. Anstatt mich mit der Sequenz von Aufrufen zu beschäftigen, sodass ich weiß, dass dieses Objekt bereits instanziiert ist, oder den gleichen Code einer verzögerten Ladung innerhalb einer anderen Methode zu wiederholen, rufe ich einfach den verzögerten Lader auf, wann immer ich das Objekt benötige.
So wie Sie öffentliche Methoden intelligent einsetzen können, können Sie sie auch falsch anwenden. Ein Beispiel hierfür ist eine öffentliche Methode, die ihre Parameter verarbeitet, bevor eine andere private Methode aufgerufen wird. Es wäre ein Fehler, diese öffentliche Methode nur deshalb beiläufig aufzurufen, weil Sie dieselben Parameter haben. Der Fehler ist subtil, aber er ist mehr als alles andere ein Entwurfsfehler und erfordert, dass Sie lernen, mit den Parametern der internen Methode und nicht mit den Parametern der öffentlichen Methode umzugehen.
Um Ihre Frage zu beantworten, ist es sicherlich kein schlechter Code, wenn Sie ihn richtig verwenden.
Die Frage, die Sie sich stellen müssen, ist, warum Ihre Klasse dieselben Bedürfnisse hat wie die Kunden Ihrer Klasse. Normalerweise hat eine Klasse ganz andere Bedürfnisse als ihre Kunden. Also ja, das ist ein Hinweis darauf, dass Sie entweder haben
(a) etwas öffentlich zugänglich machen, das privat sein sollte; oder
(b) Das Verhalten der Klasse ist nicht eng genug (Prinzip der Einzelverantwortung).