En cada proyecto que comencé en idiomas sin sistemas de tipo, eventualmente comencé a inventar un sistema tipo runtime. Tal vez el término "sistema de tipo" es demasiado fuerte; como mínimo, creo un conjunto de validadores de tipo/rango de valores cuando estoy trabajando con tipos de datos complejos, y luego siento la necesidad de ser paranoico sobre dónde se pueden crear y modificar los tipos de datos.¿Cómo se puede evitar crear un sistema de tipo ad-hoc en lenguajes de tipado dinámico?
No lo había pensado dos veces hasta ahora. Como desarrollador independiente, mis métodos han estado funcionando en la práctica en una serie de pequeños proyectos, y no hay ninguna razón por la que dejen de trabajar ahora.
No obstante, esto debe ser incorrecto. Siento como si no estuviera utilizando los lenguajes de tipo dinámico "correctamente". Si debo inventar un sistema de tipo y aplicarlo por mi cuenta, también puedo usar un lenguaje que tenga tipos para empezar.
Por lo tanto, mis preguntas son:
- ¿Hay paradigmas de programación existentes (idiomas sin tipos) que evitan la necesidad de utilizar o inventar sistemas de tipo?
- ¿Hay otras recomendaciones comunes sobre cómo resolver los problemas que resuelve el tipado estático en los lenguajes de tipo dinámico (sin reinventar tímidamente los tipos)?
Aquí está un ejemplo concreto para que usted considere. Estoy trabajando con datetimes y zonas horarias en erlang (un lenguaje dinámico fuertemente tipado). Este es un tipo de datos común que trabajo:
{{Y,M,D},{tztime, {time, HH,MM,SS}, Flag}}
... {Y,M,D}
donde es una tupla que representa una fecha válida (todas las entradas son enteros), y tztime
time
son átomos, HH,MM,SS
son números enteros que representan un cuerdo de 24 horas time, y Flag
es uno de los átomos u,d,z,s,w
.
Este tipo de datos se analiza comúnmente desde la entrada, por lo que para garantizar la entrada válida y un analizador correcto, los valores deben verificarse para la corrección de tipo y para los rangos válidos. Más adelante, las instancias de este tipo de datos se comparan entre sí, lo que hace que el tipo de sus valores sea aún más importante, ya que todos los términos se pueden comparar. Desde el erlang reference manual
number < atom < reference < fun < port < pid < tuple < list < bit string
habiendo pasado de mucho java a mucho groovy, resuelve el problema con pruebas unitarias, y solo acepta el hecho de que no sabe hasta el momento de ejecución el verdadero tipo de objeto. De hecho, el tipo verdadero de un objeto no importa si estás escribiendo patos. – dstarh
Parece que está combinando tipos dinámicamente y con tipos débiles. Existe una distinción entre tipo fuertemente contra tipo débil y tipo estático frente a tipo dinámico. –
Me interesaría ver un ejemplo del tipo de código que condujo a esta pregunta. –