Pierwszą pokusą przy modelowaniu jest użycie struktury danych w stylu drzewa czworokątnego. Każdy atom węgla ma cztery połączenia, każdy tlen dwa i każdy wodór jeden. Nie sądzę jednak, aby to było właściwe rozwiązanie.
Myślę, że właściwe rozwiązanie zostało już wynalezione. Używana struktura danych to ciąg znaków.
Pomyśl o tym. Chemicy modelują związki organiczne już od dłuższego czasu. Jeśli pokażesz chemikowi CH4, natychmiast rozpoznają go jako metan. Pokaż im CH3CH2OH, a rozpoznają to jako etanol. Rozpoznają to, ponieważ identyfikują kombinację CH3CH2 jako związek „etyczny” (co oznacza dwa atomy węgla), a OH jako „anol” lub grupę alkoholową.
Mamy również wcześniej istniejącą metodologię wyszukiwania i identyfikowania podciągów - wyrażeń regularnych.
Aby programowo przedstawić związek organiczny, zdefiniowałbym związek jako zawierający ciąg znaków reprezentujący jego wzór chemiczny i ciąg określający jego nazwę chemiczną. Mogłyby mieć metody, które pozwoliłyby zidentyfikować, jakie „specjalne” właściwości miał związek.
Przykładowa klasa w języku 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);
}
}
Oczywiście musisz napisać klasę nameCalculator, która oblicza nazwę na podstawie formuły. Trzeba by utworzyć regex, który definiuje pierścień benzynowy. Zdefiniuj dodatkowe wyrażenia regularne dla każdej grupy, którą chcesz wyszukać.
Zaletą modelowania związków w ten sposób jest to, że jest to język, który jest dokładnie w domenie biznesowej użytkownika końcowego. Wszystko, co programista musi wiedzieć, to ciągi znaków do wyszukiwania, które mogą być łatwo dostarczone przez podręcznik lub aptekę.
Jeśli wymagane są reprezentacje strukturalne tych chemikaliów, sugeruję zastanowienie się nad utrzymaniem reprezentacji SMILES w formule.
Reprezentacja wzoru chemicznego SMILES