2010-07-27 6 views
9

Ich versuche, ein Programm zu entwerfen, das eine API von Drittanbietern verwendet. Die Drittanbieter-API beschreibt eine Eingabe mit 296 Feldern und eine Ausgabe mit 179 Feldern. Natürlich möchte ich, dass Klassen die Eingabe und Ausgabe darstellen. Gibt es Tricks zum Entwerfen einer Klasse mit so vielen Feldern? Soll ich für jedes Feld einen normalen Getter und Setter haben?Wie behandelt man eine Java-Klasse mit Hunderten von Feldern?

Hinweis: Da Sie fragen, nimmt die API eine Zeichenfolge mit allen Feldern im Format mit fester Breite als Eingabe und gibt eine Zeichenfolge mit der Ausgabe auch im Format mit fester Breite zurück. Es ist sehr schwer, daraus eine nicht-flache Struktur zu interpretieren.

+1

Wenn es nur eine Containerklasse ist, würde ich Ihre Felder nur öffentlich machen, damit Sie sie direkt ändern können und vermeiden Sie alle diese Methoden. –

Antwort

5

Huch.

Eine Möglichkeit besteht darin, einfach eine Map oder einen ähnlichen Eigentümer zu verwenden.

Eine weitere Option: Verwenden Sie eine Reihe von geschachtelten Klassen, um eine Organisation hinzuzufügen (z. B. Order.Person.ContactInfo.Address.ZipCode, statt nur Order.ZipCode). Ich bin mir überhaupt nicht sicher, ob mir das gefällt, da es zusätzliche Komplexität bedeutet, aber ohne sie wird das Finden des gewünschten Getter/Setters (sagen wir über Autovervollständigung in einer IDE) zum Albtraum.

Noch eine andere Option: Wenn Sie erstellen tun eine einzige Klasse mit vielen Eigenschaften, betrachten die „Expression Builder“ Muster verwenden, in dem jeder „Setter“ gibt das Objekt selbst, so dass Sie Kettensetzern zusammen:

myObject.setPropertyA("Foo").setPropertyB("Bar").setPropertyC("Baz")... 

, die eine schnellere und Fluent Interface

myObject.setPropertyA("Foo"); 
myObject.setPropertyB("Bar"); 
myObject.setPropertyC("Baz"); 
... 
+0

+1 für Builder Muster fließend. Vergessen zu werfen, dass in meiner Antwort. –

2

Ich würde ernsthaft in Erwägung ziehen, einfach zwei Hashtables zu verwenden, wenn ultimative Leistung nicht das Mörderkriterium ist.

+0

'EnumMap' sollte ziemlich schnell sein (nicht lineares Lesen von Enum-Ordinalzahlen ist wahrscheinlich der schlimmste Teil, würde ich raten; aber das ist wahrscheinlich besser als anderer Code für verschiedene Felder). –

2

Können Sie eine java.util.Map anstelle einer Klasse mit Setter/Getter verwenden?

+1

Und was, haben 296 Konstanten für Feldnamen? Da die Felder unterschiedliche semantische Typen haben (Text, Zahlen usw.), müsste ich Abstraktion als Wert haben. –

+0

Sie müssen möglicherweise trotzdem Konstanten erstellen, wenn Sie Vergleiche im Code beispielsweise mit den Feldnamen durchführen müssen. –

+0

@Dane Ein schöner Punkt, aber ich verwende normalerweise Reflexion und manchmal Attribute dafür. –

1

Wow, das ist eine Menge Felder. Unabhängig davon ...

Wie funktioniert die API mit dieser Klasse? Wenn es eine Implementierung der erforderlichen Klassenstruktur bietet, sollten Sie definitiv damit fortfahren.

+0

Die API erwartet eine blutige Zeichenfolge mit allen Feldern, die im Format mit fester Breite eingerichtet sind. Keine wirkliche Hilfe dort. –

+0

Oh. Es tut mir leid :(Viel Glück ... –

3

Möglicherweise API-Methoden mit unhandlicher Anzahl von Parametern umhüllen und Introduce Parameter Object Refactoring wiederholt anwenden und logisch verwandte Parameter in Parameterobjekten gruppieren, insbesondere wenn Ergebnisse in bestehende Modellobjekte abgebildet werden, in denen adaptor pattern angewendet werden kann.

0

Die dritte Partei API dann erstellen können, müssen die Ausgangsdaten eine Art/Klasse werden erklärt für den Umgang mit, nicht wahr? Angenommen, diese API ist eine Java-Klasse, dann müssen sie offensichtlich ein einzelnes Output-Objekt von ihrer Methode zurückgeben.

Wenn dies der Fall ist, mit dieser API zu interagieren ich ein Wrapper-Objekt erstellen würde, die

  1. die Eingabefelder Wrapped/Objekt und Ausgangsobjekt
  2. Nur für die Bereiche öffentliche Accessormethoden hatte mein Programm kümmerte sich um die Interaktion mit (ich habe das Gefühl, dass Sie nicht brauchen, um Zugriff auf alle 296 Felder), um den Rest Ihres pr

auf diese Weise, ogram muss nur über die Existenz der Felder wissen, über die es informiert werden muss, und der Rest der Felder (und die 3rd-Party-Objekte selbst) werden vollständig ausgeblendet/abstrahiert.

+0

Siehe die Bearbeitung der Frage. –

+0

@ C. Ross, kümmert sich Ihre Anwendung über jeden einzelnen Eingang und Ausgabe von dieser dritten Partei API? –

+0

95% werden an der einen oder anderen Stelle verwendet, wenn nur aufzeichnen, damit der Benutzer sie sehen kann. –

2

Wie wäre es mit Code-Generierung? Erstellen Sie eine Datei mit den Eingabeparametern und eine weitere mit den Ausgabeparametern. Erstellen Sie dann die gewünschten Code-Vorlagen: Getter, Setter, Konstanten. Dann multiplizieren Sie die beiden zusammen.

Wenn Sie es neu erstellen müssen, ändern Sie einfach die Vorlagen und regenerieren.

Verwandte Themen