La prima tentazione con la modellazione è quella di utilizzare una struttura di dati in stile quad-tree. Ogni atomo di carbonio ha quattro connessioni, ciascuna di ossigeno due e ciascuna di idrogeno. Non penso che questa sia la soluzione corretta.
Penso che la soluzione corretta sia già stata inventata. La struttura dei dati da utilizzare è una stringa.
Pensaci. I chimici hanno modellato i composti organici per molto tempo ormai. Se mostri un chimico CH4, lo riconosceranno immediatamente come metano. Mostra loro CH3CH2OH e lo riconosceranno come etanolo. Lo riconoscono perché identificano la combinazione CH3CH2 come un composto "eth" (che significa due atomi di carbonio) e l'OH come un "anolo" o gruppo alcolico.
Abbiamo anche una metodologia preesistente per la ricerca e l'identificazione di sottostringhe - espressioni regolari.
Quindi per rappresentare programmaticamente un composto organico, definirei un composto contenente una stringa che rappresenta la sua formula chimica e una stringa che definisce il suo nome chimico. Potrebbe avere metodi che identificano le proprietà "speciali" del composto.
Una classe di esempio in 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);
}
}
Ovviamente dovresti scrivere la classe nameCalculator, che calcola il nome in base alla formula. Dovresti creare la regex che definisce un anello di benzina. Definisci regex extra per ciascuno dei gruppi che desideri cercare.
Il vantaggio di modellare i composti in questo modo è che è nella lingua che è esattamente nel dominio aziendale dell'utente finale. Tutto ciò che lo sviluppatore deve sapere sono le stringhe da cercare, che possono essere facilmente fornite da un libro di testo o da un chimico.
Se sono necessarie rappresentazioni strutturali di questi prodotti chimici, suggerisco di cercare di mantenere le rappresentazioni SMILES della formula.
SMILES rappresentazione della formula chimica