Kürzlich bin ich bei einer Codeüberprüfung auf Code gestoßen, der von einem neuen Kollegen geschrieben wurde und ein Muster mit einem Geruch enthält. Ich vermute, dass die Entscheidungen meines Kollegen auf Regeln basieren, die vom berühmten Clean Code-Buch (und vielleicht auch von anderen ähnlichen Büchern) vorgeschlagen wurden.
Nach meinem Verständnis ist der Klassenkonstruktor vollständig für die Erstellung eines gültigen Objekts verantwortlich und seine Hauptaufgabe ist die Zuweisung der (privaten) Eigenschaften eines Objekts. Es kann natürlich vorkommen, dass optionale Eigenschaftswerte von anderen Methoden als dem Klassenkonstruktor festgelegt werden. Solche Situationen sind jedoch eher selten (obwohl dies nicht unbedingt falsch ist, vorausgesetzt, der Rest der Klasse berücksichtigt die Optionalität einer solchen Eigenschaft). Dies ist wichtig, um sicherzustellen, dass sich das Objekt immer in einem gültigen Zustand befindet.
In dem Code, auf den ich gestoßen bin, werden die meisten Eigenschaftswerte jedoch durch andere Methoden als den Konstruktor festgelegt. Werte, die aus Berechnungen resultieren, werden Eigenschaften zugewiesen, die innerhalb mehrerer privater Methoden in der Klasse verwendet werden sollen. Der Autor verwendet scheinbar Klasseneigenschaften, als wären sie globale Variablen, auf die in der gesamten Klasse zugegriffen werden sollte, anstatt diese Werte für die Funktionen zu parametrisieren, die sie benötigen. Außerdem sollten die Methoden der Klasse in einer bestimmten Reihenfolge aufgerufen werden, da die Klasse sonst nicht viel macht.
Ich vermute, dass dieser Code von dem Rat inspiriert wurde, Methoden kurz zu halten (<= 5 Codezeilen), um große Parameterlisten (<3 Parameter) zu vermeiden und dass Konstruktoren keine Arbeit leisten dürfen (z. B. eine Art Berechnung durchführen) Dies ist für die Gültigkeit des Objekts von wesentlicher Bedeutung.
Jetzt könnte ich natürlich gegen dieses Muster vorgehen, wenn ich nachweisen kann, dass alle möglichen undefinierten Fehler auftreten, wenn Methoden nicht in einer bestimmten Reihenfolge aufgerufen werden. Ich gehe jedoch davon aus, dass als Reaktion darauf Überprüfungen hinzugefügt werden, die bestätigen, dass Eigenschaften festgelegt werden müssen, sobald Methoden aufgerufen werden, für die diese Eigenschaften festgelegt werden müssen.
Ich würde jedoch eher vorschlagen, den Code vollständig zu ändern, sodass die Klasse zu einer Blaupause für ein tatsächliches Objekt wird und nicht zu einer Reihe von Methoden, die (prozedural) in einer bestimmten Reihenfolge aufgerufen werden sollten.
Ich habe das Gefühl, dass der Code, dem ich begegnet bin, riecht. Tatsächlich glaube ich, dass es eine ziemlich klare Unterscheidung gibt, wann ein Wert in einer Klasseneigenschaft gespeichert und wann er in einem Parameter für eine andere Methode abgelegt werden muss - ich glaube nicht wirklich, dass sie Alternativen zueinander sein können . Ich suche die Wörter für diese Unterscheidung.