Digamos que tengo la tarea de codificar algún tipo de juego de rol. Esto significa que, por ejemplo, deseo rastrear un Character
GameCharacter
y sus estadísticas, como inteligencia, bonificaciones por daños o puntos de vida.Java: cómo manejar MUCHOS campos y su encapsulación limpiamente?
Tengo mucho miedo de que, al final del proyecto, pueda terminar manejando un gran número de campos, y para cada uno de ellos tendría que asegurarme de que siguen un conjunto muy similar de restricciones y comportamientos (por ejemplo, quiero que estén limitados entre un mínimo y un máximo; quiero ser capaz de distinguir entre un "valor base" y un "bonus temporal"; quiero poder aumentar y disminuir ambos sin pasar por un setters y getters). De repente, para cada campo necesitaría uno (dos?) Getter y cuatro setters y tal vez un par de restablecedores también! Incluso para 10 campos eso significa MUCHOS métodos todos iguales, eek.
para la sequedad que han comenzado encapsular la lógica de jugar con esas estadísticas en Field
clases, por lo que podría escribir código como intelligence.applyBonus(10)
o hitpoints.get()
(que se encarga el valor devuelto es en el rango), etc. Tengo incluso se ha ido a tal longitud para crear clases para agrupar esos campos juntos, pero ese no es el punto en este momento.
Ahora, me tocó en este problema al "conectar" Field
en GameCharacter
: la mayoría de los libros de texto de Java dicen que cada clase debe tener campos privados con getters y setters públicos. Eso suena bien en teoría, y ya he construido una clase completa alrededor de un int
; Sin embargo, la idea no suena tan sólida cuando usted se encuentra llamando a un captador de conseguir ... un captador:
thisCharacter.getIntelligence().get() //eeek
yo preferiría tener acceso al campo directamente. Tal vez sea mi Python/VB [1] "fondo", pero para mí es más limpio, más claro y sencillo:
thisCharacter.intelligence.get()
El problema (teórico) con campos públicos es que estoy dando todo el control sobre el eso; por ejemplo, en algún otro punto en el código base, por desgracia, lo siguiente puede ocurrir:
thisCharacter.intelligence = somethingThatReallyIsNull;
suena como un error sutil ... pero ... quiero decir, realmente debería preocuparse por eso? Yo nunca pensé asignar el Field
directamente [2], he documentado en el Javadoc que esto no es algo que deba hacerse, pero igual soy nuevo aquí, así que estoy un poco desgarrado.
Así que me gustaría saber cuál es su opinión sobre este tema. ¿Son las ventajas de la encapsulación tan masivas que debería seguir adelante y tener get get getters y setter getters y demás ... o debería tomar encapsulación en medidas saludables y dejar el Field
como un campo public
?
[1] Sí, lo sé. He estado tratando de olvidar. Pero recientemente hemos visto también un poco de C# y hombre, no son propiedades dulces. Oh bien.
[2] excepto en constructores! Y un getter no me salvará de un constructor defectuoso.
Estoy de acuerdo con Uri. Tener un mapa es mucho más fácil de mantener y escalar, en lugar de usar campos. –
cf, The Universal Design Pattern: http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.html – jsight
Siempre he pensado que es una expresión bastante directa, pero supongo que cualquier cosa sencilla termina un patrón :) – Uri