2010-07-27 9 views
9

Estoy tratando de diseñar un programa que utiliza una API de terceros. La API de terceros describe una entrada con 296 campos y una salida con 179 campos. Obviamente, quiero que las clases representen la entrada y la salida. ¿Hay algún truco para diseñar una clase con tantos campos? ¿Debo tener un getter y setter normal para cada campo?¿Cómo manejar una clase Java con cientos de campos?

Nota: porque piden, la API lleva una cadena con todos los campos en formato de ancho fijo como entrada y devuelve una cadena con la salida también en el formato de ancho fijo. Es muy difícil interpretar una estructura no plana a partir de eso.

+1

Si solo se trata de una clase de contenedor, solo haré públicos sus campos para que pueda modificarlos directamente y evitar tener todos esos métodos repetitivos. –

Respuesta

5

Yikes.

Una opción es simplemente utilizar un mapa o un titular de propiedad similar.

Otra opción: use una serie de clases anidadas para agregar una organización (por ejemplo, Order.Person.ContactInfo.Address.ZipCode, en lugar de simplemente Order.ZipCode). No estoy del todo seguro de que me guste esta, ya que significa complejidad adicional, pero sin ella, encontrar el getter/setter particular que desea (por ejemplo, mediante autocompletado en un IDE) se convierte en una pesadilla.

Sin embargo, otra opción: si lo hace crear una sola clase con muchas propiedades, puede utilizar el patrón de "Generador de expresiones", en el que cada "colocador" devuelve el objeto en sí mismo, lo que le permite a los emisores encadenar:

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

que puede crear una interfaz más rápida y fluida a continuación

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

+1 para la fluidez del patrón del constructor Olvidé lanzar eso en mi respuesta –

2

Consideraría seriamente simplemente usar dos hashtables si el rendimiento final no es el criterio determinante.

+0

'EnumMap' debe ser bastante rápido (la lectura no lineal de enum ordinals probablemente será la peor parte, supongo, pero eso es probablemente mejor que el código diferente para diferentes campos). –

2

¿Se puede utilizar un java.util.Map en lugar de una clase con setters/getters?

+1

¿Y qué? ¿Tiene 296 constantes para nombres de campos? Además, dado que los campos son de tipos semánticos diferentes (texto, numéricos, etc.) tendría que tener algo de abstracción como valor. –

+0

Puede que tenga que crear constantes de todos modos, si necesita hacer comparaciones en el código con los nombres de los campos, por ejemplo. –

+0

@Dane Un punto justo, pero suelo usar el reflejo y, a veces, atributos para eso. –

1

Wow, eso son muchos campos. Independientemente de ...

¿Cómo interactúa la API con esta clase? Si proporciona una implementación de la estructura de clase requerida, definitivamente debe ir con eso.

+0

La API espera una sangrienta cadena con todos esos campos configurados en formato de ancho fijo. No hay ayuda real allí. –

+0

Oh. Lo siento mucho :(Buena suerte ... –

3

Quizás envuelven métodos de la API que tiene el número difícil de manejar de parámetros y aplicar Introduce Parameter Object refactorización repetidamente, agrupando parámetros relacionados lógicamente en objetos de parámetros, especialmente si resultados del mapa en objetos modelo existente en el que adaptor pattern podrían aplicarse.

0

La tercera parte de la API debe declarando algún tipo/clase para el manejo de los datos de salida, ¿verdad? Suponiendo que esta API es una clase Java, obviamente necesitan devolver un solo objeto Output desde su método.

Si este es el caso, para interactuar con esta API me gustaría crear un objeto envoltorio que

  1. el envuelto en los campos de entrada/objeto y la producción de objetos
  2. Sólo tenía métodos de acceso público para los campos mi programa se preocupaba por la interacción con (tengo la sensación de que no es necesario acceder a todos los campos 296)

de esta manera, el resto de su pr ogram solo necesita saber sobre la existencia de los campos que necesita saber, y el resto de los campos (y los propios objetos de terceros) están completamente ocultos/abstraídos.

+0

Ver la edición de la pregunta –

+0

@ C. Ross, ¿su aplicación se preocupa por cada entrada? y el resultado de esta API de terceros? –

+0

95% se utilizan en un lugar u otro, aunque solo sea para grabar para que el usuario pueda verlos. –

2

¿Qué hay de la generación de código? Crea un archivo con los parámetros de entrada y otro con los parámetros de salida. Luego crea las plantillas de código que quieras: getters, setters, constants. Luego multiplica los dos juntos.

Si necesita volver a diseñarlo, simplemente modifique las plantillas y regenere.

Cuestiones relacionadas