La primera tentación con modelar esto es usar una estructura de datos de estilo de cuatro árboles. Cada átomo de carbono tiene cuatro conexiones, cada oxígeno dos y cada uno de hidrógeno. Sin embargo, no creo que esta sea la solución adecuada.
Creo que la solución adecuada ya se ha inventado. La estructura de datos a usar es una cadena.
Piensa sobre esto. Los químicos han estado modelando compuestos orgánicos durante bastante tiempo. Si le muestra a un químico CH4, inmediatamente lo reconocerán como metano. Muéstreles CH3CH2OH y lo reconocerán como etanol. Reconocen esto porque identifican la combinación CH3CH2 como un compuesto "eth" (que significa dos átomos de carbono) y el OH como un grupo "anol" o alcohol.
También tenemos una metodología preexistente para buscar e identificar subcadenas: expresiones regulares.
Entonces, para representar programáticamente un compuesto orgánico, definiría un compuesto como que contiene una cadena que representa su fórmula química y una cadena que define su nombre químico. Podría tener métodos que identificaran qué propiedades "especiales" tenía el compuesto.
Una clase de ejemplo en C #:
public class OrganicCompound
{
private Regex benzineRingRegex;
public OrganicCompound(string formula, NameCalculator nameCalculator, Regex benzineRingRegex)
{
this.Formula = formula;
this.Name = nameCalculator.CalculateName(formula);
this.benzineRingRegex = benzineRingRegex
}
public string Formula { get; private set; }
public string Name { get; private set; }
public bool HasBenzeneRing()
{
return Regex.IsMatch(this.Formula, benzineRingRegex);
}
}
Obviamente, necesitaría escribir la clase nameCalculator, que calcula el nombre a partir de la fórmula. Debería crear la expresión regular que define un anillo de bencina. Defina expresiones regulares adicionales para cada uno de los grupos que desea buscar.
La ventaja de modelar los compuestos de esta manera es que está en el lenguaje que se encuentra exactamente en el dominio comercial del usuario final. Todo lo que usted, como desarrollador, necesita saber son las cadenas que debe buscar, que pueden ser proporcionadas fácilmente por un libro de texto o por un químico.
Si se requieren representaciones estructurales de estos químicos, sugiero buscar mantener representaciones de la fórmula en SONRISA.
Representaciones de la fórmula química de SMILES