C ++ 11'de akorları, ölçekleri ve uyumu analiz edecek bir program yazmaya başladım. Tasarım aşamamda yaşadığım en büyük sorun, 'C' notunun bir not, bir tür akor (Cmaj, Cmin, C7, vb.) Ve bir tür anahtar (Cmajor, Cminor'un anahtarı) olmasıdır. Aynı sorun aralıklarla da ortaya çıkar (küçük 3., büyük 3.).
Programdaki tüm 'semboller' için temel sınıf olan bir temel sınıf olan Token kullanıyorum. Yani mesela:
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;
Gördüğünüz gibi, türetilmiş tüm sınıfları (CMajorTriad, C, CMajorScale, CMajorKey, vb.) Oluşturmak, diğer tüm notları ve enharmonikleri de dahil olmak üzere hızla gülünç bir şekilde karmaşık hale gelecektir. çoklu kalıtım çalışmaz, yani:
class C : public Note, Triad, Key, Scale
C sınıfı, bunların hepsi aynı anda olamaz. Bağlamsaldır, ayrıca bununla polimorflama işe yaramaz (hangi süper yöntemlerin gerçekleştirileceği nasıl belirlenir? Her süper sınıf kurucularını çağırmak burada olmamalı)
İnsanların sunması gereken tasarım fikirleri veya önerileri var mı? Google'da ton uyumunu bir OO perspektifinden modelleme konusunda hiçbir şey bulamadım. Buradaki tüm kavramlar arasında çok fazla ilişki var.