Again, what’s in a name? (R)

“But it’s written in the starlight
And every line on your palm
We’re fools to make war
On our brothers in arms

(“Brothers in Arms”, Dire Straits, 1985)

Este post contiene la respuesta a la pregunta del post anterior.

Efectivamente, la respuesta a la pregunta tiene que ver con la interoperabilidad entre lenguajes .NET. El atributo IndexerName que hemos asociado a nuestro indexador de la clase Friend facilita la utilización de aquél desde ensamblados creados con otros lenguajes de la familia .NET en los cuales el acceso a los indexadores se lleve a cabo a través de propiedades comunes y corrientes. Sin la presencia de este atributo, el indexador que hemos añadido a nuestra colección personalizada sería en esos lenguajes prácticamente inaccesible (al menos de manera directa: mediante reflexión, por supuesto, se podría acceder a él; pero no sería, por ejemplo, descubrible mediante Intellisense). Y no es cosa de “hacerle la puñeta” a nuestros “hermanos de armas” que programan otros lenguajes…

Debemos aclarar que cuando decimos “otros lenguajes” *no* estamos incluyendo a Visual Basic, desde el que se podrá acceder al indexador tanto mediante el nombre que hemos definido (Names) como omitiéndolo, ya que esta propiedad se convertirá en la propiedad por defecto en lugar de Item. Curiosamente, si se omite el atributo IndexerName (o se le asocia el valor “Item“), nuestro indexador se verá desde VB como una sobrecarga de la propiedad vectorial por defecto Item.

A continuación se muestra un ejemplo de programa en VB que hace uso del indexador en cuestión:

Imports Demo.Friends

Module Module1

    Sub Main()

        Dim TheList As New FriendsList()
        TheList.Add(New [Friend](“pepe”, #1/1/1980#))
        Console.WriteLine(TheList(“pepe”).Name)   ‘ Names es ahora la propiedad por defecto
        Console.ReadLine()
    End Sub

End Module

Por cierto, ¿sabe por qué el nombre de la clase Friend está entre corchetes en el ejemplo? Pues claro que sí: Friend es una palabra reservada en VB, y con los corchetes le indicamos al compilador que reconozca ese lexema como un identificador cualquiera y no como una palabra reservada. Todo lenguaje .NET que se precie debe ofrecer algún mecanismo similar; pero de eso ya hemos hablado aquí antes.


Pop/Rock tip: Dire Straits ha sido uno de los grupos británicos de más éxito de las últimas décadas, desde que en 1978 tomara por asalto las emisoras de radio de medio mundo con su conocido tema “Sultans of Swing” (yo estaba allí :-). Personalmente, me quedo con sus cuatro primeros discos: “Dire Straits” (1978), “Communiqué” (1979), “Making movies” (1980) y “Love over Gold” (1982), que dieron lugar a temas inolvidables como el ya mencionado “Sultans of Swing“, “Down to the Waterline“, “Once upon a Time in the West“, “Telegraph Road“. “Tunnel of Love” o “Romeo and Juliet” (la conexión entre este post y el anterior :-). “Brothers in Arms” es precisamente el tema que dio título al quinto álbum de la banda, con el que comenzó una etapa más comercial.

Después de la disolución de la banda, su guitarrista, Mark Knopfler (uno de los poquísimos guitarristas de rock que, gracias a su estilo personalísimo, se reconocen a los pocos compases de comenzar a tocar), ha continuado publicando discos y dando giras. En particular, ha estado varias veces en España, país al que menciona en su obra:

“Oh girl it looks so pretty to me / Like it always did
Like that Spanish city The Spanish City to me / When we were kids”
(“Tunnel of Love”, Dire Straits, 1980)

 

Again, what’s in a name?

“What’s in a name? That which we call a rose
By any other name would smell as sweet”
(“Romeo and Juliet”, William Shakespeare, c. 1595)

“A title, unfortunately, is in itself a key to interpretation”
(Postcript to “The Name of the Rose”, Umberto Eco, 1980)

Vuelvo a la carga después de un tiempo de silencio con otro truco sencillo, pero que espero enseñe algo a algunos, no porque sea nada complicado, sino porque tal vez nunca antes lo hayan necesitado. La idea se me ocurrió mientras programaba, sin dudas bajo el influjo de los libros que estoy releyendo últimamente (en inglés), que de un modo u otro tocan el tema de los nombres y su significado.

A continuación se muestra una clase que implementa una lista de amigos (pudo ser una lista de cualquier cosa). La pregunta es: ¿Qué significa el atributo IndexerName aplicado al indexador que hemos definido? ¿Para qué sirve?

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.CompilerServices;

namespace Demo.Friends
{
    public class FriendsList : List<Friend>
    {
        public new void Add(Friend f)
        {
            if (FindByName(f.Name) != null)
                throw new ArgumentException(“Name already in list”);
            base.Add(f);
        }

        [IndexerName(“Names”)]
        public Friend this[string name]
        {
            get
            {
                return FindByName(name);
            }
        }

        private Friend FindByName(string name)
        {
            Debug.Assert(!string.IsNullOrEmpty(name));
            return this.Find(f => f.Name == name.ToUpper());
        }
    }

    public class Friend
    {
        public string Name { get; private set; }
        public DateTime? BirthDate { get; set; }

        private Friend() { }
        public Friend(string name, DateTime? birthDate)
        {
            Debug.Assert(!string.IsNullOrEmpty(name));
            Name = name.ToUpper();
            BirthDate = birthDate;
        }
    }
}

(Jun. 23) Vea la respuesta aquí.


Literary tip: William Shakespeare (1564-1616) no necesita presentación: es sin duda alguna uno de los mayores genios que haya dado la literatura universal. Seguramente un poco menos conocido sea Umberto Eco, semiólogo, filósofo y crítico literario italiano que un buen día decidió, para suerte nuestra, escribir su propia novela: la inolvidable “El nombre de la rosa“, uno de mis libros favoritos. Aunque ya había leído la novela, no conocí de la existencia de las “Apostillas” (comentarios del propio autor sobre el libro y el proceso de su creación) hasta que mi buen amigo José Ramón me prestó una edición que las incluía. JR hoy vive y trabaja en Punta Arenas, Chile (si no sabe dónde está eso, amigo lector, búsquelo en un mapa). Casos como el suyo o el de otro buen amigo, más cubano que las palmas pero con pasaporte de Liechtenstein, me hacen preguntarme a veces si quedará algún punto del planeta en el que no haya un compatriota.