Más sobre los parámetros opcionales y nombrados

Comentaba mi buen amigo Luis en respuesta a un post anterior que, a pesar de todo, no le gusta la idea de los parámetros opcionales. Como ya la conversación se estaba haciendo demasiado extensa, he preferido iniciar una nueva aquí.


Indudablemente, las razones que tiene Luis son válidas. Entre ellas muy probablemente estarán las que indicaban los propios miembros del equipo que diseño el lenguaje:



Por la otra parte, no se puede negar que los parámetros opcionales son una característica cómoda y práctica. Por ejemplo, supongamos que queremos escribir un método con cuatro parámetros con “valores por defecto”. Hoy por hoy, podríamos programar CINCO (n + 1) sobrecargas, donde cada una de las ellas (excepto la última) le “pasa la pelota” a alguna otra. Algo bastante mecánico (que no macánico, que diría Cabrera Infante :-), que el compilador podría hacer por nosotros él solito.


Por ejemplo, lo que en C# 4 expresaremos con:


   int Suma(int a = 0, int b = 0, int c = 0, int d = 0) { return a + b + c + d; } 


podríamos codificarlo hoy mediante la siguente “escalera”:


   int Suma() { return Suma(0, 0, 0, 0); } 
   int Suma(int a) { return Suma(a, 0, 0, 0); } 
   int Suma(int a, int b) { return Suma(a, b, 0, 0); } 
   int Suma(int a, int b, int c) { return Suma(a, b, c, 0); } 
   int Suma(int a, int b, int c, int d) { return a + b + c + d; } 


Si C# 4 solo añadiera los parámetros opcionales, esta “generación automática de  sobrecargas” podría ser una manera muy válida de implementarlos. Pero la cosa se complica (en la medida en que se abren nuevas posibilidades) con la incorporación de los parámetros nombrados.


Los parametros nombrados nos permitirán hacer llamadas como la siguiente al método Suma anterior:


   int n = Suma(b:5, c:7); // valores por defecto para parámetros a y d


Gracias a la combinación de los parámetros opcionales y nombrados, ahora no estaremos limitados a n + 1, sino que podremos cubrir todas las posibles combinaciones de argumentos explícitos/implícitos en las llamadas, 2 ^ n (en este nuestro ejemplo DIECISEIS). NOTA: ¿Se da cuenta de las dificultades asociadas a implementar esto mediante sobrecargas?


Sea cual fuera la implementación interna de estas características, es un hecho objetivo que garantizan una comodidad y economía de expresión significativas.


Otras ideas que me vienen a la mente sobre este tema:




  • Aunque seguramente los programadores de C# aplicarán de manera creativa estas nuevas características cuando estén disponibles, pienso que el equipo de C# no se habría decidido a incorporarlas al lenguaje si no fuera por la necesidad de disponer de ellas para facilitar la programación de aplicaciones que utilicen el modelo “de objetos” cuasi-prehistórico de Office, en el que son típicos los métodos con 10 ó más parámetros, muchos de ellos opcionales.


  • Las tablas de metadatos de .NET en los que se almacena la información sobre los parámetros de métodos incluyen la posibilidad de establecer la opcionalidad y asignar valores por defecto a todos y cada uno de ellos (ver Lidin, “Expert .NET 2.0 IL Assembler”, pág. 190). Por lo tanto, no era descabellado pensar que añadieran esta posibilidad a C# en algún momento…

 

Respuesta: ¿Qué hace este programa?

NOTA: Este post se deriva de este otro.


Bueno, ante todo la respuesta: el programa imprime una línea con el texto “01900”. Desde la primera instrucción de Main se llama al método estático mult, pasando el valor 950 para el parámetro n. Como el valor de m no se especifica, se utilizará el valor por defecto indicado en la firma del método, que es 2. Por lo tanto, el método devolverá 950 * 2 = 1900. Este valor, a su vez, se pasa como argumento (valor) del parámetro arg0 de la llamada a una de las tantas sobrecargas de Console.WriteLine. Como formato se indica “D05”, y por eso el resultado visual es el que es.


En este programa se hace uso de dos de las novedades de C# 4.0: los parámetros opcionales y los parámetros nombrados. A continuación describiremos brevemente en qué consisten dichas novedades.


a) Parámetros opcionales


Durante su charla del PDC, parece que Hejlsberg se refirió también a esta característica como “valores por defecto para argumentos”. Me hubiese gustado estar allí y ver qué dijo, pues él fue el gran detractor de esta característica allá por C# 1.0. La idea es clara, y cualquiera que conozca VB, VB.NET, C++ o Delphi (entre otros) sabe de qué estamos hablando: se asocia un valor por defecto a ciertos parámetros de un método (que deben estar situados a la extrema derecha en la declaración), y ese valor es utilizado en caso de que no se suministre explícitamente un argumento en la llamada. Por ejemplo, podríamos definir una función Suma de la siguiente forma (por supuesto, los parámetros no tienen por qué ser del mismo tipo, aunque en este ejemplo lo sean):


   int Suma(int x = 0, int y = 0, int z = 0)
   {
      return x + y + z;
   }


Las siguientes llamadas serán válidas:


   int a = Suma();  // a = 0
   int b = Suma(2);  // b = 2
   int c = Suma(2, 3);  // c = 5
   int d = Suma(2, 3, 4);  // d = 9


Pero, ¿y si quisiéramos pasar valores para x y z, manteniendo el valor por defecto para y? En otros lenguajes con (solo) parámetros opcionales, esto es imposible. En C# 4.0, podrá lograrse gracias a los parámetros nombrados.


b) Parámetros nombrados


Básicamente, se trata de poder indicar explícitamente el nombre del parámetro al que se quiere asignar un argumento en una llamada. Por ejemplo, si quisiéramos generar un número aleatorio entre 1 y 5, además de así:


   int n = rnd.Next(1, 3);  // rnd es de tipo Random


en C# 4.0 podremos hacerlo así:


   int n = rnd.Next(minValue: 1, maxValue: 3);


o también poniendo los argumentos en el orden inverso, si nos apetece. Entre las ventajas que puede aportar esta nueva característica están el aumento de la legibilidad del código, la mayor flexibilidad para colocar los argumentos y la posibilidad de combinarla con los parámetros opcionales para lograr con una mínima cantidad de código cosas que de otra forma serían más complejas de expresar. Por ejemplo, suponga que queremos llamar al método Suma de antes pasando el valor 5 para el parámetro x y 7 para el parámetro z, manteniendo el valor por defecto para y. La solución sería:


   int e = Suma(x:5, z:7);  // e = 12


Por supuesto, este post es solo una primera aproximación a estas novedades: he omitido la mayor parte de los detalles relacionados con las extensiones de la sintaxis de llamada a métodos y de las reglas de resolución de llamadas que aseguran la integración sin fisuras de estas nuevas características dentro del lenguaje.


 

Puzzle: ¿Qué hace este programa?

¿Qué hace el siguiente programa (si es que le parece válido, claro)?


using System;


static class Program
{
    static int mult(int n, int m = 2)  // ???
    {
        return n * m;
    }


    static void Main(string[] args)
    {
        Console.WriteLine(format: “{0:D05}”, arg0: mult(n: 950));  // ???
        Console.ReadLine();
    }
}


SUGERENCIA: Reclínese confortablemente en su máquina del tiempo y avance hasta 2010.


29/09/2008: La respuesta AQUI.


 

Puzzle: What does this program print?

What does the following program print:


using System;


static class Program
{
    static int mult(int n, int m = 2)  // ???
    {
        return n * m;
    }


    static void Main(string[] args)
    {
        Console.WriteLine(format: “{0:D05}”, arg0: mult(n: 950)); // ???
        Console.ReadLine();
    }
}


HINT: Sit comfortably on your time machine and advance to 2010.


09/29/2008: The answer – HERE (you’ll have to practice a little bit Spanish, I fear :-(.


 

CSPL3 is out!

I’ve just received my copy of the Third Edition of “The C# Programming Language” (CSPL3), by Anders Hejlsberg, Mads Torgersen, Scott Wiltamuth y Peter Golde, which I enthusiastically do recommend to anybody who happens to program in C#. Although the book has the succint, terse style common to all reference manuals of programming languages, this new edition embodies full information on the features added to C# in the 3.0 version, and also comes “adorned” with annotations on the different language elements written by such distinguished members of the Microsoft development community as Don Box, Eric Lippert or Bill Wagner. A “detail” I like a lot about this edition is that it is really an integrated reference of the full current C# language: along the document, the features appeared in C# 1.0, 1.1, C# 2.0 and C# 3.0 are intertwined. In the previous edition of the book, the description of the (then new) C# 2.0 features where appended sequentially at the end of the original C# specification.


An additional observation: seems like the amazon.com product description page is wrong (or they just sent me the wrong product?): it indicates a paperback cover, but what I’ve received is hardcover. That after all the discussion we had about this last week!

CSPL3 ya disponible

 Acabo de recibir la tercera edición de “The C# Programming Language“ (CSPL3), de Anders Hejlsberg, Mads Torgersen, Scott Wiltamuth y Peter Golde, que recomiendo entusiásticamente a todos los que programan en C#. Si bien el libro tiene el estilo sucinto y lacónico intrínseco a cualquier manual de referencia de un lenguaje de programación, la presente edición viene adornada con “anotaciones al margen”, comentarios sobre los diferentes elementos del lenguaje hechos por miembros tan destacados de la comunidad de desarrolladores Microsoft como Don Box, Eric Lippert o Bill Wagner. Otro elemento que me gusta mucho de esta edición es que es una referencia realmente integral: a lo largo del documento se entremezclan las características provenientes de C# 1.0 y 1.1, C# 2.0 y C# 3.0. En la edición anterior del libro, la descripción de las características de C# 2.0, en aquel momento novedosas, se adjuntaban de manera independiente al final de la versión original de la especificación.


 Debo advertir que al parecer Amazon.com se equivoca (¿o habrá sido solo en mi caso?). Si bien en la URL de descripción del producto se indica que la encuadernación es de tapa blanda, el libro que he recibido es de tapa dura. ¡Después de la catarsis que provocó el asunto!

[OT] Dedicatoria


Unai:
Para Lucía, centro y significado de mi vida

Octavio:
“I can always find my Cuban skies
In Rosalinda’s eyes”
  (“Rosalinda’s eyes”, from “52nd Street”, BILLY JOEL, 1978)

Para mi esposa Irina, en nuestro 25º aniversario


Como en estos días ando de bodas de plata (no es que sea viejo, es que me casé muy jovencito :-), y Unai también acaba de ser papá, me tomo el atrevimiento de reproducir aquí la dedicatoria de nuestro libro para dejar constancia, ante un público más amplio que quienes lo consigan de cualquier modo, de nuestra gratitud hacia aquellas que nos inspiran el estímulo necesario para intentar dar lo mejor de sí; aquellas que están siempre ahí, cuando estamos, cuando no estamos y cuando “estamos sin estar”, algo bastante frecuente siempre que hay un libro entre manos.



Pop/rock tip (como siempre, con permiso de Pablito): Billy Joel es una de las figuras más sobresalientes de la música popular norteamericana de los últimos 35 años. “Rosalinda’s eyes” (tema con influencias caribeñas y dedicado a sus padres, que vivieron en Cuba antes de nacer él) forma parte del disco “52nd Street“, el primero con el que llegó al nº 1 de las listas, aunque la mayor parte de los críticos coinciden en que es inferior al anterior, “The Stranger“, que lo encumbró. Guardo gratos recuerdos de un concierto de Billy Joel en La Habana (marzo de 1979), el único concierto de pop o rock al que tuve ocasión de ir hasta después de cumplir los 40. Y eso gracias a mi padre, que nos cedió el pase que le correspondía como crítico (la asistencia había sido rigurosamente “seleccionada”) una noche a mí y la otra a mi hermano…


 

[OT] De las similitudes entre música y software

Haciendo mi recorrido periódico en busca de discos en los que ha participado mi hermano, encontré éste de una joven talento (¿o debo decir talenta, como querría nuestra ministra?) llamada Esperanza Spalding, que es contrabajista y cantante, ciertamente una combinación poco común. Me llamó la atención la entrevista que ofrece Amazon en la página del disco, y la reproduje, movido en parte por lo guapa que es la chica y en parte pensando “ésta tiene que ser un cerebrito” (nadie había llegado antes a la edad de 20 años a profesor del prestigioso Berklee College de Boston). Y valió la pena, porque la entrevista me hizo pensar sobre las similitudes entre la música y el software…


Hay momentos de la entrevista (después de pasar los típicos detalles autobiográficos, etc.) en los que me pareció que quien hablaba era un ingeniero de sistemas y no un músico. Por ejemplo: “You have the bass, which is the bottom layer, the meat and the potatoes of the music…” (¿la capa de servicios?), “and the voice at the top, which is delivering the message of the song” (¿la interfaz de usuario?). “It is difficult, but beautiful to live in those two tiers all the time” (por supuesto, la palabra “tier” no podía faltar).


Si le gusta el jazz con tintes latinos, este disco podría interesarle. Yo ya lo he puesto en mi carrito de compra.


 

[OT]: De falacias y encuadernaciones

Un buen amigo me reprende, con toda la razón del mundo, por mi reciente participación en el blog de José M. Alarcón, en la que he incurrido en un cierto tipo de falacia lógica: en vez de aportar razonamientos sobre por qué se ha tomado una decisión, lo que he hecho es apuntar hacia otros que han hecho lo mismo (y que, por ser muy conocidos, “se supone” que no se equivocan).


Esta corta entrada es para hacerme “el harakiri” (la autocrítica), cosa que prefiero cien veces antes que pedirle a Jose que elimine mi comentario del blog. Lo cierto es que mi “ayuda” no hacía ninguna falta, pues ya Jose había explicado perfectamente las razones para elegir una encuadernación de “tapa blanda” en lugar de la de “tapa dura”; razones que por otra parte comparto.


Tomándolo con un poco de humor, la mejor manera que se me ocurre de intentar justificar mi falacia es echando mano de otra: si nuestros políticos las utilizan a diario en el Congreso de los Diputados, ¿por qué no puedo hacerlo yo alguna vez? 🙂