Try fast search NHibernate

17 June 2009

Spanish Inflector.Net

Después del recibir feedback sobre el post anterior (gracias a Jorge y Hadi) he hecho algunos cambios a la implementación del Inflector.Net.

El primer cambio fue el volver atrás con la implementación del Tablize o sea que ahora trabaja pluralizando solo la última palabra (así como prevé la convetion de RubyOnRails). Este cambio hace que el SpanishInflector cubra más del 70% de las traducciones desde el nombre de la clase al nombre de la tabla.

Fue interesante probar la implementación sobre sistemas existentes. Este es el código que usé:

public void Naming()
{
var si = new SpanishInflector();
var cfg = new Configuration().Configure();
foreach(var pc in cfg.ClassMappings)
{
var tn = pc.Table.Name;
var en = StringHelper.UnqualifyEntityName(pc.EntityName);
var tableize = si.Tableize(en);
if (!tableize.Equals(tn))
{
Console.WriteLine("{0} - {1} [{2}]", en, tn, tableize);
}
}
}

Lo que resultó interesante fue el hecho que al usar el Inflector nos hubiéramos dado cuenta que algunos nombres de tablas están equivocados y hasta saltaron algunos nombres de clase equivocados.

Llegar al 100% de cobertura, y traducción exacta, es un poco difícil ya que se interponen nombres compuestos por dos, tres o más palabras y pluralizar solo la ultima, a veces, no es suficiente y a veces es equivocado (así como pluralizar todas). Hago algunos ejemplos:


Clase



Tabla


OrdenCliente OrdenesClientes
TipoDocumento TiposDocumento
FormaPago FormasPago
PagoForma PagosFormas
DocumentoTipoProducto DocumentoTiposProductos

A parte el hecho que, en algunos casos, se entra en la no opinable “cuestión de gustos” (léase formas distintas de llamar la misma asociación) no he encontrado un patrón que permita definir exactamente cuáles son las palabras que hay que pluralizar, ni hablar de cuando la clase está compuesta en cocoliche (palabras en Español y palabras en Inglés).

Ya que queda claro que una convención o se aplica siempre, aunque no nos guste, o jamás puede cubrir el 100% de los casos agregué la posibilidad de un data-dictionary o agregar reglas propias a la convención de default (solo la última palabra es la que se pluraliza).

Agregar una entrada en el data-dictionary es así:

AddDataDictionary("UsuarioRol", "UsuariosRoles");

o si quieren

inflector.AddDataDictionary("UsuarioRol", "UsuariosRoles");

En los días a venir encontraré el tiempo de “postear” sobre el uso del spanish-inflector para el INamingStrategy de NH (quien piensa usarlo en FNH es probable que ya sepa cómo usarlo).

No comments:

Post a Comment