Número 31
26 de outubro de 2022

Patacas e cebolas

Imos comezar esta Folla cun “flashback” á aula de Física da miña escola.

— Un tren percorre mil metros en cincuenta segundos. Cal é a súa velocidade?
— Vinte.
— Vinte? Vinte que? Vinte cebolas? Vinte patacas?

O noso mestre tiña unha batalla diaria connosco para que especificaramos as dimensións dos nosos números. Nós diciamos cinco, nove ou dezasete cando tiñamos que dicir cinco metros, nove newtons ou dezasete amperios. Por sorte, co paso do tempo e a base de levar patacas e cebolas, acabamos por aprender.

Un tren corre botando patacas e cebolas pola cheminea no canto de fume.

Os programadores tamén precisamos de aprender esa lección. Moitas veces empregamos tipos de datos primitivos, que non teñen unidades nin significado, cando debiamos usar tipos e clases específicos para as nosas necesidades.

Pensade, por exemplo, en todas as veces que vistes ou escribistes “long timestamp” e, durante a revisión do código, ninguén vos preguntou se iso eran segundos ou milisegundos ou patacas ou cebolas.

O uso indiscriminado de tipos primitivos pode levar a confusións. Xa me pasou algunha vez de comparar un “timestamp” denominado en segundos con outro en milisegundos e non decatarme diso ata que o sistema fallou en produción. Como o compilador non ten nin idea das unidades que estamos a empregar, ou de como comparalas correctamente, traga co que lle digamos e despois leva as culpas.

A solución para este problema pasa por darlle esa información ao compilador. No canto de usar un tipo primitivo como “long” para almacenar un valor que representa un instante no tempo ou un intervalo, usade clases axeitadas que representen eses valores e encapsulen as operacións que se poden realizar neles (por exemplo, se programades en Java, usade as clases “Instant” e “Duration”).

Usade a mesma táctica con outros tipos de datos que poidan producir confusións. Por exemplo, se escribides un programa para controlar impresoras 3D, non gardedes todas as distancias, velocidades e temperaturas en variables de tipo “double”. Se o facedes e un día sumades centímetros e graos Celsius, o compilador non vos vai dicir nada. No seu lugar, usade clases “Distancia”, “Velocidade” e “Temperatura”, e así o compilador xa sabe que todas esas cousas teñen tipos distintos.

Outro beneficio de usar clases propias no canto de tipos primitivos é evitar mesturar unidades. Un “double” terma do que lle poñan: non sabe se contén metros ou pés ou quilómetros e dá lugar a erros. Unha clase “Distancia” ben feita ten a súa propia representación interna e permítenos usar a unidade que máis nos conveña en cada momento.

Na escola dixéronnos que non se poden sumar dúas peras con tres laranxas, pero é que daquela non tiñamos ordenadores. Agora abonda con poñelas todas en variables de tipo “int” para que o resultado sexa cinco. Iso si: non imos saber se son cinco peras, cinco laranxas, cinco patacas ou cinco newtons metro.

(Esta é unha versión ultracondensada dun artigo que escribín o ano pasado na miña páxina web. Está escrito en castelán pero ten bo ledoiro.)

A ilustración desta Folla está baseada nunha litografía de Charles Parsons.