Zacząłem pisać program w C ++ 11, który analizowałby akordy, skale i harmonię. Największym problemem, jaki mam w fazie projektowania, jest to, że nuta „C” jest nutą, rodzajem akordu (Cmaj, Cmin, C7 itd.) I rodzajem klucza (klawisz Cmajor, Cminor). Ten sam problem pojawia się w przypadku interwałów (trzeci mniejszy, trzeci większy).
Używam klasy podstawowej, Token, która jest klasą podstawową dla wszystkich „symboli” w programie. na przykład:
class Token {
public:
typedef shared_ptr<Token> pointer_type;
Token() {}
virtual ~Token() {}
};
class Command : public Token {
public:
Command() {}
pointer_type execute();
}
class Note : public Token;
class Triad : public Token; class MajorTriad : public Triad; // CMajorTriad, etc
class Key : public Token; class MinorKey : public Key; // Natural Minor, Harmonic minor,etc
class Scale : public Token;
Jak widać, stworzenie wszystkich pochodnych klas (CMajorTriad, C, CMajorScale, CMajorKey itp.) Szybko stałoby się absurdalnie złożone, w tym wszystkie inne nuty, a także enharmoniki. wielokrotne dziedziczenie nie działałoby, tzn .:
class C : public Note, Triad, Key, Scale
klasa C nie może być jednocześnie tymi wszystkimi rzeczami. Jest kontekstowy, również polimorfizacja z tym nie zadziała (jak ustalić, które super metody wykonać? Wywołanie każdego konstruktora superklasy nie powinno się tutaj zdarzyć)
Czy są jakieś pomysły lub sugestie projektowe, które ludzie mają do zaoferowania? Nie byłem w stanie znaleźć niczego w Google w odniesieniu do modelowania harmonii tonalnej z perspektywy OO. Istnieje zbyt wiele relacji między wszystkimi koncepcjami tutaj.