(Lo que viene…) Variables Inline
Se van descubriendo algunas de las características que tendrá la próxima versión de RAD Studio; Sobre una de ellas voy a hablar hoy y a medida que vayan saliendo comentaré algunas más a medida que las pueda ir probando en la beta. En la versión 10.3 de Delphi se introduce la característica de poder definir variables y constantes «inline».
INTRODUCCIÓN
Utilizando la definición Inline de variables y constantes podemos definir una variable, asignarle un tipo e inicializarla, todo ello en una misma línea y además en el punto donde la necesitemos. Ahora podemos utilizar un código como este que en versiones anteriores nos hubiera dado errores en compilación.
begin var str := 'Hola mundo!'; var i:integer := 10; var numVersion:double := 10.3; var dFecha:TDateTime := Now; var b:boolean := True; ShowMessage ('Variable string: ' + str + sLineBreak + 'Variable integer: ' + IntToStr(i) + sLineBreak + 'Variable double: ' + FloatToStr(numVersion) + sLineBreak + 'Variable Date: ' + DateToStr(dFecha) + sLineBreak + 'Variable boolean: ' + BoolToStr(b, True) + sLineBreak ); |
También podemos hacer algo similar con las constantes. De forma que podemos escribir un código como este:
procedure TForm2.Button3Click(Sender: TObject); begin const iVersion:integer = 10; const sMensaje:string = 'Hola mundo!'; ShowMessage(sMensaje + sLineBreak + 'Versión: ' + IntToStr(iVersion)); end; |
INFERENCIA DE TIPOS
En el ejemplo anterior, he añadido a las variables la definición del tipo de cada una. No sería necesario, ya que el compilador puede inferir el tipo de cada variable (en algunas circunstancias), a partir de la utilización que se hace de ellas. Así que también podríamos utilizar el siguiente código sin problemas:
var str := 'Hola mundo!'; var i := 10; var numVersion := 10.3; var dFecha := Now; var b := True; ShowMessage ('Var. string: ' + str + sLineBreak + 'Var. integer: ' + IntToStr(i) + sLineBreak + 'Var. double: ' + FloatToStr(numVersion) + sLineBreak + 'Var. TDateTime: ' + DateToStr(dFecha) + sLineBreak + 'Var. boolean: ' + BoolToStr(b, True) + sLineBreak ); |
El siguiente código generaría un resultado como el que se ve en la imagen.
Y no sólo funciona con tipos simple, sino que podremos usarlo también con tipos genéricos.
Por ejemplo, en el código siguiente vemos cómo estamos definiendo una variable de tipo TStack<T>, sin añadir el tipo a la variable, y sin embargo en la línea siguiente cuando vamos a utilizarla, podemos pulsar [CTRL]+[SPACE] (code completion) y nos aparecen los métodos propios de la clase TStack.
Un sitio donde puede ser especialmente útil y ágil para algunos programadores la definición «inline» es en la utilización de bucles y bloques repetitivos. Siguiendo la misma estructura anterior, podemos utilizar un código como el siguiente:
procedure TForm2.Button2Click(Sender: TObject); begin var Lista := TList.Create(); Lista.AddRange([1,2,3,4,5,6,7,8,9,0]); var str := String.Empty; -- *NOTA1* for var i in Lista do begin -- *NOTA2* str := str + IntToStr(i) + sLineBreak; end; ShowMessage('Valores: ' + sLineBreak + str); -- *NOTA3* end; |
En este ejemplo hay varias cosas a comentar (NOTAS).
Si nos fijamos en la estructura FOR, podemos ver que se usa el índice [i] para recorrer la lista utilizando la definición inline (*NOTA2*). En este caso tampoco se añade tipo para la variable.
Hay un detalle en esta porción de código que nos sirve para mostrar que las variables que se definen «inline» tienen un ámbito diferente a las que están definidas en la sección var (o para decirlo mejor, tienen un ámbito más reducido -dependiendo de dónde las hemos definido-).
Si en el ejemplo anterior, hubiéramos definido la variable [str] (*NOTA1*) dentro del FOR, al compilar hubiéramos obtenido un error en la línea del ShowMessage (*NOTA3*), ya que el ámbito de la variable definida dentro del FOR se restringe únicamente a ese bloque. Igual pasa con varibles definidas dentro de un IF, WHILE,…
Finalmente si ejecutamos este código obtendremos un resultado como este:
CONCLUSIÓN
Es posible que algunos de nosotros no veamos mucha utilidad en estas nuevas características (personalmente tal vez soy algo «cuadriculado» y me gusta tener las cosas definidas en un lugar específico para ello) y en cambio es posible que programadores acostumbrados a otros lenguajes le vean mucha utilidad. Independientemente de la percepción de cada uno, creo que realmente lo importante está en que podamos disponer de estas nuevas características. Que tengamos la posibilidad de escoger si deseamos o no utilizarlas.
Un saludo y hasta la próxima.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Vaya, esas características hace muchos años que están disponibles en otros lenguajes. Ya era hora.
Saludos.
Bueno, se que otros lenguajes ya tienen esto, pero no me convence ya que veo como que el código queda sucio. Además para mi sería tener todo desprolijo y desordenado al crear variables en medio de todo el código.
Por lo menos eso es lo que veo yo en otros lenguajes. ¿Cual sería la ventaja real de crear variables por cualquier parte del código?
En C# que es otro de los lenguajes que utilizo veo que todo el tiempo se crean variables por cualquier lado y eso hace que el código quede desprolijo y si tiene muchas líneas te pierdas lo que se está leyendo.
Saludos
@casimiro
Si. Y siempre decimos que las cosas buenas haty que copiarlas. También a veces piensas que no hay que copiarlo todo, no?? ;-)
@Alejandro
En parte (personalmente) estoy de acuerdo contigo Alejandro. No creo que lo use mucho, pero tal y como he comentado en el artículo, creo que lo importante es tener la opción de usarlo o no. Nosotros es probable que no lo utilicemos, pero tal vez otros programadores si lo vean útil.
Yo tuve que cambiar a visual basic.net y alli es asi, anárquico, mezclando todo. Te creas variables donde quieras, objetos que no liberas nunca y cosas por el estilo . Como echo de menos Delphi ii!!
@Fernando
Yo en su día trabajé con Visual Basic y esto me daba mucha rabia. Veías código de gente que programaba sin órden ni control, definiendo cosas en cualquier sitio. Supongo que al final también depende de cómo es cada programador.
Hay quien utiliza estas características y sigue siendo ordenado y estructurado y hay quien es un desastre y cuando programa tenga o no tenga estas características sigue generando un código «desastroso».
Es una adición importante.
El mayor uso que le veo es en variables locales que sean manajadas, para evitar que se creen o destruyan siempre. Así mejoramos la velocidad evitando que código que inicializa y destruye las variables se ejecute siempre, y sólo sea ejecutado en caso de que se pase por ese trozo del código.
Si sólo entramos en esa parte un 1% de las veces, nos ahorramos ciclos de ejecución.
Para optimizar, en algunos sitios de la RTL, en este momento no recuerdo los sitios concretos, se ha usado una pseudooptimización que es meter dentro de un procedimiento/función local el trozo de código que se usa raramente, junto con las variables locales manejadas que son necesarias.