Resumen Exagg'itive (TM)
Tienes algunas cosas.
- Herencia de prototipos y clonación
- Adición dinámica de nuevas propiedades.
- Coexistencia de objetos de diferentes versiones (niveles de especificación) de la misma clase.
- Los objetos que pertenecen a las versiones más recientes (niveles de especificación) tendrán propiedades "opcionales" adicionales.
- Introspección de propiedades, antiguas y nuevas.
- Introspección de las reglas de validación (discutidas a continuación)
Hay un inconveniente fatal.
- El compilador no busca cadenas mal escritas para usted.
- Las herramientas de refactorización automática no cambiarán el nombre de las claves de propiedad por usted, a menos que pague por las elegantes.
La cuestión es que puedes obtener introspección usando, um, introspección. Esto es lo que suele pasar:
- Habilitar la reflexión.
- Agregue una gran biblioteca de introspección a su proyecto.
- Marque varios métodos de objetos y propiedades con atributos o anotaciones.
- Deje que la biblioteca de introspección haga la magia.
En otras palabras, si nunca necesita interactuar con FP, no tiene que seguir el consejo de Rich Hickey.
Por último, pero no menos importante (ni el más bonito), aunque usar String
como clave de propiedad tiene el sentido más directo, no tiene que usar String
s. Muchos sistemas heredados, incluido Android ™, utilizan ID de números enteros ampliamente en todo el marco para referirse a clases, propiedades, recursos, etc.
Android es una marca registrada de Google Inc.
También puedes hacer felices a ambos mundos.
Para el mundo Java, implemente los captadores y establecedores como de costumbre.
Para el mundo FP, implemente el
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
Dentro de estas funciones, sí, código feo, pero hay complementos IDE que lo llenarán por ti, usando ... uh, un complemento inteligente que lee tu código.
El lado de Java de las cosas será tan eficiente como de costumbre. Nunca usarán esa parte fea del código. Es posible que incluso desee ocultarlo de Javadoc.
El lado FP del mundo puede escribir el código "leet" que quieran, y generalmente no te gritan porque el código es lento.
En general, el uso de un mapa (bolsa de propiedades) en lugar del objeto es común en el desarrollo de software. No es exclusivo de la programación funcional ni de ningún tipo particular de lenguajes. Puede que no sea un enfoque idiomático para un idioma determinado, pero hay situaciones que lo requieren.
En particular, la serialización / deserialización a menudo requiere una técnica similar.
Solo algunas ideas generales sobre "mapa como objeto".
- Aún debe proporcionar una función para validar tal "mapa como objeto". La diferencia es que "mapear como objeto" permite criterios de validación más flexibles (menos restrictivos).
- Puede agregar fácilmente campos de adición al "mapa como objeto".
- Para proporcionar una especificación del requisito mínimo de un objeto válido, deberá:
- Enumere el conjunto de claves "mínimo requerido" esperado en el mapa
- Para cada clave cuyo valor necesita ser validado, proporcione una función de validación de valor
- Si hay reglas de validación que necesitan verificar múltiples valores clave, proporcione eso también.
- Cual es el beneficio? Proporcionar la especificación de esta manera es introspectivo: puede escribir un programa para consultar el conjunto de claves mínimamente requerido y obtener la función de validación para cada clave.
- En OOP, todos estos se enrollan en una caja negra, en nombre de "encapsulación". En lugar de la lógica de validación legible por máquina, la persona que llama solo puede leer "documentación API" legible por humanos (si afortunadamente existe).