Situación de análisis
Analice el segmento de código siguiente
{
...
Estudiante e = new Estudiante(...);
e.AdicionarNota(5);
...
}
Caso de estudio: clase Traductor de palabras Ejemplo: Definir una clase que
permita “traducir” palabras de Español a Inglés y Portugués (idea original en [24])
El elemento principal en la solución de este ejemplo es la determinación de la
organización en memoria del “diccionario” que permitirá realizar la traducción. Aún
cuando existen Estructuras de Datos (Parte III) o tipos de dato específicos para la
representación de este tipo de información, en esta solución se aborda una
representación muy simple para ejemplificar una aplicación interesante de los
arreglos e indexers. En la siguiente figura se muestra un ejemplo de la
representación en memoria de la propuesta de diccionario que se desea
implementar:
Del análisis de la figura se concluye que las palabras podrían ser representadas
en arreglos por idiomas, donde en la i-ésima posición de cada arreglo se
encuentra una palabra en cada uno de los respectivos idiomas. En un primer
refinamiento la clase Traductor quedaría como se muestra en la siguiente figura.
Sugerimos definir las instancias de esta clase con un máximo de palabras
predeterminado a través del constructor. A partir de una instancia traducir de
Traductor, En términos de funcionalidades sugerimos insertar las palabras de la
siguiente forma: Traducir[“palabra“] = “word“; o Traducir[“palabra“, Inglés] =
“word“;
En el caso de las palabras en portugués se tiene una única opción:
Traducir[“palabra“, Portugués] = “palavra“; Esto quiere decir que inglés es la
traducción por defecto por lo que puede o no especificarse. Análogamente la
traducción de las palabras podría realizarse de la siguiente forma:
Console.WriteLine(Traducir[“palabra“]);
Console.WriteLine(Traducir[“palabra“, Inglés);
Console.WriteLine(Traducir[“palabra“, Portugués);
El análisis de las especificaciones anteriores conlleva a la necesidad de utilizar
enumeraciones (para los idiomas) e indexers como se muestra en la variante de
implementación que se muestra a continuación:
Public enum Idioma
{
Inglés, Portugués
}
public class Traductor
{
string[] español; string[] inglés; string[] portugués;
int cantPalabras;
public Traductor(uint maxPalabras)
{
español = new string[maxPalabras]; inglés = new string[maxPalabras];
portugués = new string[maxPalabras];
}
public bool DiccionarioLLeno()
{
...
} public string this[string palabra]
{
get
{
return this[palabra, Idioma.Inglés];
}
set
{
this[palabra, Idioma.Inglés] = value;
}
}
public string this[string palabra, Idioma idioma]
{
get
{
...
}
set
{
...
}
}
Corresponde ahora la implementación de las secciones get y set definidas con
anterioridad. En el caso de set se necesita determinar la ubicación de la palabra
en español (algoritmo de búsqueda, método posición) y posteriormente con el
índice obtenido se puede retornar la traducción. Note que existen casos
excepcionales cuando no existe la palabra a traducir o no existe traducción hasta
entonces en el diccionario. El caso de la sección set aumenta la complejidad
porque de forma similar a get primero hay que determinar si existe la palabra en
español y luego si ya existe entonces la traducción. Seguidamente se muestran
variantes de implementaciones de las secciones get y set definidas con
anterioridad.
get
{
string tempStr = null;
int i = Posición(palabra);
if (i != -1)
switch (idioma)
{
case Idioma.Inglés: tempStr = inglés[i]; break;
default: tempStr = portugués[i]; break;
}
else
throw new Exception("Palabra no encontrada");
if (tempStr == null) throw new Exception("No existe traducción");
else
return tempStr;
}
Set
{
int i = Posición(palabra); if (i == -1)
{
if (DiccionarioLLeno())
throw new Exception("Diccionario lleno ...");
i = cantPalabras++;
español[i] = palabra.ToUpper();
}
switch (idioma)
{
case Idioma.Inglés:
if (inglés[i] != null) throw new Exception("Ya existe traducción al inglés de " +
palabra);
else
inglés[i] = value.ToUpper();
break;
default:
if (portugués[i] != null) throw new Exception("Ya existe traducción al
portugués " + palabra);
else
portugués[i] = value.ToUpper(); break;
}
}