¿Cuáles son los problemas de diseño al devolver una tabla hash de un método público cuando desea devolver varios elementos en lugar de crear una clase y devolver un objeto de eso?
Si tiene problemas, ¿en qué circunstancias tiene sentido hacerlo?
¿Cómo cambia la respuesta a esta pregunta dependiendo de si el lenguaje es dinámico o no?
Editar: Esto es para aclarar que las claves serían constantes y son parte del código, no de los datos. Algo para lo que generalmente creamos una clase. La pregunta es por qué sería un error usar hashtable en su lugar si crear una clase realmente parece ser la opción correcta.
fuente
Uno de los problemas sería que, en muchos casos, la clave para la tabla hash sería una cadena. Por lo tanto, los consumidores del método tendrían que saber de antemano qué teclas utilizar para extraer los datos. Esto daría la posibilidad de errores debido a errores ortográficos al acceder a los datos.
Otro inconveniente es la refactorabilidad. Si luego decides cambiar el nombre de un miembro, entonces tienes un montón de cadenas mágicas que también necesitan cambiar. Es mucho más simple cambiar el nombre de un miembro de la clase utilizando las herramientas de refactorización proporcionadas por la mayoría de los buenos IDE. Con una tabla hash, es probable que tenga que hacer una operación de búsqueda / reemplazo en todos los archivos de origen, lo que podría ser problemático.
Por último, perderá tiempo de compilación comprobando el acceso de los miembros, tanto en términos de nombre como de tipo. Este último no es un problema si su tabla hash solo contiene un tipo de objeto, pero si contiene muchos (incluso en la misma cadena jerárquica) realmente desea aprovechar el sistema de tipos de su idioma y obtener tiempo de compilación comprobando allí. En la mayoría de los IDE, tendrá algún tipo de funciones intellisense / autocompletar: funcionan al observar el sistema de tipos, pero no podrán ayudarlo con las teclas de tabla hash.
En cuanto a los momentos en que sería apropiado devolver una tabla hash (u otra colección de pares de valores de clave), lo usaría cuando no se conocen los valores y las claves en el momento de la compilación. Por ejemplo, si tiene un método que analiza una cadena de consulta y devuelve las claves y los valores correspondientes, una tabla hash sería una buena opción. En este caso, también querrás pensar en devolver algún tipo de tabla hash inmutable o de solo lectura.
Editar : la mayoría de los puntos planteados en esta respuesta dejan de aplicarse cuando se habla de lenguajes dinámicos :)
fuente
El argumento más importante en contra de esto sería que está exponiendo demasiada información al consumidor. El código consumidor solo necesita saber que es una colección de valores clave (diccionario) de algún tipo; si se implementa como un hashmap, una lista de asociación, un trie o lo que sea, es relativamente poco interesante. Por lo tanto, la forma correcta sería regresar por una interfaz adecuada (
IDictionary
o cualquier idioma que elija) en lugar de por tipo real.Todo esto suponiendo que realmente necesita un diccionario para representar sus datos, es decir, sus datos consisten en pares clave / valor, donde las claves son únicas entre el conjunto de datos y no pueden repararse en el momento de la compilación. Si tiene claves previamente conocidas, debe crear un tipo adecuado (o varios, según sea necesario) para sus datos. Se trata de si considera las claves en sí mismas como parte de los datos o como parte del código.
EDITAR :
Para aclarar, estoy usando el término diccionario para referirse al tipo más genérico de estructura de datos clave-valor aquí; No me refiero a ninguna implementación específica del idioma, como Python
dict
o .NETDictionary
.fuente
Una pregunta que me haría es "¿están cambiando las claves en este diccionario?" Si son constantes, debe devolver un objeto u otra estructura de datos adecuada. Si son dinámicos, es posible que desee devolver algún tipo de estructura de estilo de diccionario. Finalmente, si hay algunas claves que van a ser constantes y algún conjunto desconocido de claves dinámicas, es posible que desee devolver una estructura de datos híbrida que incluya algunos valores fijos y algún tipo de diccionario para el desbordamiento.
fuente