SalmorejoTech 2024 - Spring Boot <3 Testcontainers
Chequeo de tipos
1. Chequeo de tipos
Miguel Ángel Alarcos Torrecillas
Ingeniero Técnico en Informática
miguel.alarcos@gmail.com
Chequeo de tipos en
la programación estática y dinámica.
2. Tipos de los parámetros en una
función
Dada la función f que llama a g:
debe cumplirse que el tipo de los parámetros
en la llamada coincide con el tipo de los
parámetros esperados a la entrada de g.
Argumento: el chequeo de tipos alerta de
errores, eso es bueno.
3. Tipos de los parámetros en una
función
Respuesta: Si la unit-test de f se cumple, se
cumple la coincidencia de tipos, ya que está
subsumida. Pero dado que no somos
perfectos haciendo unit-tests, es bueno
como ayuda auxiliar.
Más formalmente: si para que B se cumpla
debe cumplirse A, eso no significa que
verificando que se cumple A nos acercamos
a que se cumpla B, ya que hay casos en los
que se cumple A y no B.
4. Un ejemplo
def g(float a, float b): # se suele decir que g acepta un flotante como primer parámetro.
# Lo correcto es decir qué objetos son los que acepta: por ejemplo, la velocidad
# de los cuerpos con masa mayor a 1 tonelada.
return a - b
def f():
a, b = 8, 4
return g(b, a) # queremos hacer g(a,b), pero nos equivocamos en el orden de los parámetros
Coinciden tipos, pero hemos invertido el
orden de los parámetros, lo que producirá un
error que se descubrirá pasado bastante
tiempo de ejecución y sin posible pista de
dónde viene el error.
5. Un experimento psico-
informático
Detectar el error de tipos sí, corregir el error
de tipos no.
Experimento psico-informático: funciones
con llamadas a otras funciones en las que
hay errores de tipo en las llamadas.
¿Corrigen los tipos solamente o el correcto
funcionamiento de las funciones?
6. La inferencia no cubre el 100%
Argumento: La inferencia no cubre el 100%
en un código dinámico sin dar algunas
pistas, mientras que en un código estático
tenemos toda la información de tipos, y
hemos dicho que eso es algo bueno.
Respuesta:
podemos dar algunas pistas (Python function
annotations): def f(x: int) -> int:
no estamos hablando del mismo código. En
el caso dinámico hay más expresividad
7. Pero, ¿qué información de tipos
tenemos realmente en el caso
estático?
En el mundo ideal sabemos a priori todos
los tipos que vamos a utilizar, pero en el
mundo real el algoritmo va cambiando y con
ello la declaración de tipos. Es decir, la
información de declaración de tipos se
extrae del algoritmo a posteriori y no al
revés, luego no tiene sentido utilizarla para
verificar el algoritmo.
Lo que si necesitamos es inferencia de tipos
(recorriendo todos las ramas) para saber que
el algoritmo es coherente a nivel de tipos.
8. Un paralelismo
Si sobre una línea tenemos trazadas las
siguientes distancias: 2m, 5m, 9m.
No tiene sentido verificar las marcas
atendiendo a la mitad de la medida de la
primera marca.
Tiene sentido tener un metro certificado
externamente y utilizarlo para verificar las
medidas.