In einigen unserer Projekte gibt es eine Klassenhierarchie, die im Laufe der Kette weitere Parameter hinzufügt. Im unteren Bereich können einige Klassen bis zu 30 Parameter haben, von denen 28 nur an den Superkonstruktor übergeben werden.
Ich werde anerkennen, dass die Verwendung von automatisiertem DI über etwas wie Guice nett wäre, aber aus technischen Gründen sind diese spezifischen Projekte auf Java beschränkt.
Eine Konvention zum alphabetischen Ordnen der Argumente nach Typ funktioniert nicht, da ein Typ, der überarbeitet wurde (der Kreis, den Sie für Argument 2 übergeben haben, ist jetzt eine Form), plötzlich außer Betrieb sein kann.
Diese Frage ist möglicherweise zu spezifisch und voller Kritikpunkte: "Wenn das Ihr Problem ist, machen Sie es auf Designebene falsch", aber ich suche nur nach Gesichtspunkten.
buildStudent()
Methode die Ausnahme auslösen lassen.Können Sie verwandte Parameter in ein Objekt einkapseln?
zB wenn Parameter wie sind
dann könnten Sie stattdessen haben:
quelle
Was Sie wahrscheinlich tun möchten, ist eine Builder-Klasse. Dann würden Sie so etwas tun:
Siehe Seite 8 und folgende dieser Josh Bloch-Präsentation (PDF) oder dieser Überprüfung von Effective Java
quelle
Nun, die Verwendung des Builder-Musters könnte eines sein Lösung sein.
Aber wenn Sie zu 20 bis 30 Parametern kommen, würde ich vermuten, dass es eine hohe Beziehung zwischen den Parametern gibt. Daher ist es (wie vorgeschlagen) wahrscheinlich am sinnvollsten, sie in logisch vernünftige Datenobjekte zu verpacken. Auf diese Weise kann das Datenobjekt bereits die Gültigkeit von Einschränkungen zwischen den Parametern überprüfen.
Bei all meinen Projekten in der Vergangenheit konnte ich den Code bereinigen, indem ich ein besseres Datenmodell erstellte, als ich zu viele Parameter hatte (und das waren 8, nicht 28!).
quelle
Da Sie auf Java 1.4 beschränkt sind, wäre Spring eine sehr anständige Option , wenn Sie DI möchten . DI ist nur an Stellen hilfreich, an denen die Konstruktorparameter Dienste sind oder sich zur Laufzeit nicht ändern.
Wenn Sie all diese verschiedenen Konstruktoren haben, weil Sie variable Optionen zum Erstellen eines Objekts wünschen, sollten Sie ernsthaft die Verwendung des Builder-Musters in Betracht ziehen.
quelle
Die beste Lösung besteht darin, nicht zu viele Parameter im Konstruktor zu haben. Nur Parameter, die im Konstruktor wirklich benötigt werden, sind Parameter, die zum korrekten Initialisieren des Objekts erforderlich sind. Sie können Konstruktoren mit mehreren Parametern haben, aber auch einen Konstruktor mit nur den minimalen Parametern. Die zusätzlichen Konstruktoren rufen diesen einfachen Konstruktor auf und setzen danach die anderen Parameter. Auf diese Weise können Sie das Kettenproblem mit immer mehr Parametern vermeiden, haben aber auch einige Convenience-Konstruktoren.
quelle
Ich kann die Verwendung von Immutables oder POJOBuilder bei Verwendung des Builder-Musters wirklich empfehlen .
quelle
Refactoring, um die Anzahl der Parameter und die Tiefe Ihrer Vererbungshierarchie zu reduzieren, ist so ziemlich alles, was ich mir vorstellen kann, denn nichts wird wirklich dazu beitragen, 20 Parameter gerade zu halten. Sie müssen nur jeden einzelnen Anruf tätigen, während Sie sich die Dokumentation ansehen.
Eine Sache, die Sie tun könnten, ist, einige logisch gruppierte Parameter in einem eigenen übergeordneten Objekt zu gruppieren, aber das hat seine eigenen Probleme.
quelle