Número 6
6 de abril de 2022
|
Eu son un fan do tipado estrito nas linguaxes de programación: non quero mesturar números e texto, listas e booleanos, tuplas e estruturas de datos. Góstame saber que tal variable pertence a tal tipo, e quero que o compilador me avise se me engano. Polo tanto, non son un fan desas linguaxes nas que os tipos de datos se relacionan con máis promiscuidade.
Poñamos Javascript por exemplo. A actitude desa linguaxe é: “precisas dun número pero tés texto? Non hai problema! Ah, que tiñas un array, non pasa nada; xa argallaremos algo”. A linguaxe convirte os valores dun tipo a outro como se lle pagaran por iso, ata o punto de que a xente tivo que elaborar táboas para saberen que conversións fai a linguaxe ao comparar dous valores de distintos tipos.
Hai xente que non ten ningún problema con isto, e que incluso vai máis lonxe e emprega cadeas de texto cando non son axeitadas.
Un día pedinlle a alguén que escribira unha función para descodificar texto UTF-8. Nesta codificación, un carácter de texto pode ocupar varios bytes; polo tanto, é preciso manipular os bits de cada byte para podelos agrupar e descodificar. Sabedes o primeiro que fixo esa persoa? Escribiu unha función para convertir bytes nunha cadea de texto que contiña a súa representación binaria. Non sei como pretendía seguir porque o parei aí, pero supoño que pretendía recortar esas cadeas de texto, unilas para compoñer unha cadea coa representación binaria dun número grande e despois convertela no número correspondente.
Para os que non teñan experiencia dabondo para saber cal era o problema: non é para nada necesario xerar ou manipular unha representación binaria en forma de cadea de texto. Os ordenadores están deseñados para manipular bits directamente, así que o mellor tipo de datos para unha secuencia de bits é, directamente, un número.
Os programadores non somos os únicos que teñen problemas cos textos.
Para os que si temos esa experiencia, o que esa persoa fixo era obviamente incorrecto. Pero aínda así, con máis ou menos experiencia, moitas veces case todos cometemos erros semellantes sen nos decatar; por exemplo cando usamos cadeas de texto para representar URIs.
No “mundo real” estamos afeitos a tratar con texto. Para nós, unha frase é un texto, pero tamén o é un número, ou unha lista, ou unha táboa, a matrícula dun coche, un número de teléfono, un enderezo de e-mail. Para nós todo iso é texto, e por iso, moitas veces botamos man dunha simple cadea de texto (que terma do que lle poñan) para operar con esas cousas no canto de buscar representacións e tipos de datos máis axeitados: un enteiro, un array, unha matriz, unha clase “Matrícula”, unha clase “Teléfono”, unha clase “Email”.
Algunhas desas clases empregan cadeas de texto internamente, así que un podería preguntarse se non sería máis eficiente usar a cadea de texto directamente. Pois non: en moitas linguaxes as dúas opcións compilan exactamente ao mesmo código máquina, así que o programa non vai usar máis memoria ou correr máis lento.
Adicionalmente, esas clases axúdannos a manter os distintos tipos de datos separados na nosa cabeza e evitan que fagamos operacións non válidas con eles. Dúas cadeas de texto pódense concatenar para facer outra cadea de texto, pero non dous enderezos de e-mail, así que non ten sentido tratalos como cadeas de texto.
Polo tanto, recoméndovos que, cada vez que vaiades usar unha cadea de texto nun programa, paredes un pouco para pensar en se non haberá outro tipo de datos máis axeitado. Iso havos axudar a producir un programa mellor e con menos erros.
A ilustración desta Folla procede dun gravado de Gustave Doré.
Anterior: “Non podo vivir sen ti” | Índice | Seguinte: “Paradoxo temporal” |
Coding Sheet has an English version of this article: “A character string is a character string is a character string”. |
1 comentario