a veces, las cosas cambian

Esta semana estaré de reunión en Santiago de Chile, preparando la próxima edición de IEEEXtreme, el concurso de programacion de IEEE, pero prometo mandar algun problemilla desde allá en cuanto tenga conexion.

De momento, por dejar algo mas ligero que el ultimo problema que puse, para que no se me queje nadie, os dejo un pequeño puzzler, en el que (como ya comentamos) lo que queremos es adivinar que función realiza un determinado programa pero SIN ejecutarlo. La idea subyacente es que, si lo que pasa no es lo que esperábamos, siempre podemos investigar por qué.

En nuestro caso, sea el siguiente programa:

using System;

public class MusicStar {
string name;
Style style;

protected MusicStar() {
// utilizado solo para las herencias
}

public MusicStar(String name, Style style) {
this.name = name;
this.style = style;
}

public override string ToString() {
return "nombre: " + name + " (estilo:" + style + ")";
}

public class Style {
string stylename;

public Style() {
}

public void SetStyleName(string name) {
this.stylename = name;
}

public override string ToString() {
return stylename;
}
}
}

public class HardRockStar : MusicStar {

public HardRockStar(String name, Style style) : base(name, style) {
if(style.ToString() != "Hard Rock") {
throw new ArgumentException(
"Nada de mariconadas! Solo me gusta el rock!");
}
}
}

public class Changes {

public static void Main(String[] args) {
MusicStar.Style style = new MusicStar.Style();

style.SetStyleName("Hard Rock");
HardRockStar slash = new HardRockStar("Slash", style);

style.SetStyleName("CutrePop");
MusicStar paulina = new MusicStar("Paulina Rubio", style);
MusicStar marta = new MusicStar("Marta Sanchez", style);

Console.WriteLine("nuestras estrellas de esta noche son:");
Console.WriteLine(slash.ToString());
Console.WriteLine(paulina.ToString());
Console.WriteLine(marta.ToString());
}
}

¿Cual seria la salida al ejecutar la funcion principal (Main) de MainProgram? ¿Por que?

NOTA: para el que quiera alguna pista adicional, aqui os dejo dos en forma de videos: Paulina y Marta (para ahorraros el tiempo de ver el resto de la basurilla musical, os recomiendo pasar directamente a los minutos 2:30 y 2:45 respectivamente) 

ACTUALIZACION: me di cuenta tarde que habia pegado la version del codigo que no era! Os he dejado la version actualizada, pero abajo pongo un comentario para los que ya os animasteis a enviar respuestas. Mil perdones! 

9 comentarios en “a veces, las cosas cambian”

  1. Ricardo pufff … me has hecho pasar completamente del problema planteado (sorry); desp de ver de nuevo al gigante de Slash, estoy desempolvando unos CDs donde se desataba junto a Gilby Clark y otros … basta de código por esta semana y a retomar la Gibson 😀

  2. Juraría que:
    nuestras estrellas de esta noche son:
    nombre: Slash (estilo: CutrePop)
    nombre: Paulina Rubio (estilo: CutrePop)
    nombre: Marta Sánchez (estilo: CutrePop)

    Y si no me equivoco se debe a que todos guardan una referencia al mismo objeto style, al cual le has cambiado el nombre…

    Si te soy sincero ahora mismo no sé si tengo razón porque la tengo, o porque estoy que me caigo por los suelos…

  3. Hay trampa?

    Desde aquí parece que las 3 instancias de MusicStar en realidad comparten una sola instancia de Style como su propiedad Style, que es la que se instanció antes de Slash, se le cambió el nombre también antes de Slash, y luego se le volvió a cambiar el nombre antes de paulina y marta.

    En consecuencia, la salida debería ser:

    nuestras estrellas de esta noche son:
    nombre: Slash (estilo:CutrePop)
    nombre: Paulina Rubio (estilo:CutrePop)
    nombre: Marta Sanchez (estilo:CutrePop)

    Eso es lo que pienso. Ahora voy a comprobarlo. Las preguntas son:

    – Tendré Razón?
    – Te perdonará Slash?
    – Cuál es el secreto de Telepizza?

  4. Estamos entonces todos deacuerdo??. No se que implicaciones malevolas tendrá el que la clase Style se encuentre dentro de Music Start. Pero vamos por lo que veo solo se crea una instancia de Style que es referenciada desde las tres instancias de “MusicStar”.

    Me estoy perdiendo algo, pero bueno el compilador dirá.

    SaludOs.

  5. hola pirsonas!

    Ante todo, mil perdones! Como he puesto en el articulo, pegue la version del codigo que no era! (los problemas de tener que exportar a html desde fuera en vez de con la herramienta del community server) }:/

    Lo que pretendia que se viera en este trozo de codigo es un antipatron que he visto en un par de codigos reales: el problema de las referencias externas y las invariantes. Espero que con esta nueva version quede mas claro

    Basicamente, teneis todos razon. Al tener una referencia externa y cambiarla, cambiamos el estado interno de los otros objetos. Esto es un fallo normal en programadores que no recuerdan que al asignar una referencia no COPIAS el objeto, solo apuntas a esa instancia. El problema surge cuando a veces queremos garantizar algun tipo de invariante (como en el caso de ser una HardRockStar, que solo debe gustarte el rock, el alcohol y las malas mujeres). El no guardar el estado despues de chequear la invariante (eg: clonando el objeto) hace que una referencia externa pueda dejarnos en un estado inconsistente (que es como te quedas despues de ver a Slash tocando un solo con Marta Sanchez, inconsistente)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *