Hi!
Ich möchte eine Verwaltung von Musikinstrumenten programmieren. Jedes Instrument beinhaltet eine Reihe von Klangfarben/Sounds (ich nenne sie presets). Ich hab also eine Klasse Instrument und eine Klasse Preset. In meinem App-Modell hab ich also ein Array instruments: [Instrument]. Die Klasse Instrument beinhaltet wiederum ein Array presets: [Preset] ... in etwa so:
class Instrument {
var name: String
var UUID: String
var presets: Preset[] = []
var selectedPreset: Preset? = nil
}
class Preset {
var name: String
var UUID: String
var category: Int? = nil
var linkedPresets: [Preset] = []
var button: UIButton? = nil
}
Nun verschiedene Fragen zur Umsetzung:
1.) Ein Preset gehört ja zu einem Instrument. Angenommen, ich übergebe einer Funktion/Methode ein Preset. Diese Funktion weiß dann aber nicht, zu welchem Instrument das Preset gehört. Meine erste Überlegung wäre, für das Preset ein Feld "instrument" oder "parent" o.ä. vom Typ Instrument anzulegen, das auf das Instrument verlinkt, dem es gehört. Das wäre bequem - aber es bedeutet eine Kreuzverlinkung. Darf man sowas, ist das verboten, schlechter Stil oder speichermäßig gefährlich? Wie löst man das Problem am sinnvollsten? Alternativen wäre, dass jede Funktion, die ein Preset zuordnen will, das komplette instruments-Array durchläuft und nachschaut, welches Instrument das Preset enthält. Oder weitere Alternative: Jeder Funktion nicht nur Preset, sondern zusätzlich das zugehörige Instrument übergeben. Finde ich aber umständlich, wenn das oft vorkommt.
2.) In dem Feld linkedPresets möchte ich weitere Presets anderer Instrumente speichern, die thematisch zu diesem Preset passen. Auch hier ist wieder das Problem: Wenn ich NUR die Presets speichere, fehlt hier wieder die Information, zu welchem Instrument diese Presets jeweils gehören. Wie löst man es?
3.) Ich habe hier das Feld UUID eingeführt, um jedem Instrument oder Preset eine eindeutige ID zu verpassen. Das dient hauptsächlich der Möglichkeit, zwei Objekte (bzw. ein und das gleiche Objekt), die an verschiedenen Stellen gespeichert sind, zu vergleichen. Macht das Sinn und ist das überhaupt notwendig? Oder ist es in Swift gar kein Problem, mittels if preset1 == preset2 Objekte zu vergleichen (da in dem Fall ja vermutlich nur die Pointer-Adressen verglichen werden!?)?
4.) Ich habe hier in der Klasse Preset ein Feld button vom Typ UIButton. Da ich, wenn ich Instrumente darstelle, für jedes Preset einen Button anlege, und beim Markieren/Löschen/Umbenennen eines Presets auch auf den zugehörigen Button zugreifen muss, speichere ich den Button in diesem Feld. Ist das legitim so oder ist das gegen die Gepflogenheiten von MVC? Falls dem so ist, wie würde man es sonst handhaben?
5.) Ich möchte für Instrument- und Preset-Arrays verschiedene Hilfsfunktionen/-Methoden erstellen wie z.B. findPresetWithCategory(...) oder findPresetWithName(...), die aus dem Array entsprechende Elemente liefert. Wo sind diese Funktionen richtig aufgehoben? An besten in einer von diesen Klassen (z.B. instrument.findPresetWithName(...) oder eher alle zusammen gesammelt in nem eigenen Swift-File?
6.) Oder gibt es die Möglichkeit, eine Extension für Arrays vom Typ X zu erstellen? So dass ich eine Mathede schreiben könnte, die nur bei Arrays vom Typ Instrument vorhanden ist, so dass ich dann direkt instrument.presets.findPresetWith... aufrufen könnte? Habe allerdings keine Infos dazu gefunden und vermute, dass es nicht geht.
Wäre mich sehr freuen, wenn mir jemand hier bei ein paar Fragen Klarheit schaffen könnte Habe zwar schon einige Jahre Programmiererfahrung, aber nicht mit Swift/ObjC/iOS/MVC und auch nicht so sehr mit OOP
Vielen Dank schon mal!
LG Lukas
Ich möchte eine Verwaltung von Musikinstrumenten programmieren. Jedes Instrument beinhaltet eine Reihe von Klangfarben/Sounds (ich nenne sie presets). Ich hab also eine Klasse Instrument und eine Klasse Preset. In meinem App-Modell hab ich also ein Array instruments: [Instrument]. Die Klasse Instrument beinhaltet wiederum ein Array presets: [Preset] ... in etwa so:
class Instrument {
var name: String
var UUID: String
var presets: Preset[] = []
var selectedPreset: Preset? = nil
}
class Preset {
var name: String
var UUID: String
var category: Int? = nil
var linkedPresets: [Preset] = []
var button: UIButton? = nil
}
Nun verschiedene Fragen zur Umsetzung:
1.) Ein Preset gehört ja zu einem Instrument. Angenommen, ich übergebe einer Funktion/Methode ein Preset. Diese Funktion weiß dann aber nicht, zu welchem Instrument das Preset gehört. Meine erste Überlegung wäre, für das Preset ein Feld "instrument" oder "parent" o.ä. vom Typ Instrument anzulegen, das auf das Instrument verlinkt, dem es gehört. Das wäre bequem - aber es bedeutet eine Kreuzverlinkung. Darf man sowas, ist das verboten, schlechter Stil oder speichermäßig gefährlich? Wie löst man das Problem am sinnvollsten? Alternativen wäre, dass jede Funktion, die ein Preset zuordnen will, das komplette instruments-Array durchläuft und nachschaut, welches Instrument das Preset enthält. Oder weitere Alternative: Jeder Funktion nicht nur Preset, sondern zusätzlich das zugehörige Instrument übergeben. Finde ich aber umständlich, wenn das oft vorkommt.
2.) In dem Feld linkedPresets möchte ich weitere Presets anderer Instrumente speichern, die thematisch zu diesem Preset passen. Auch hier ist wieder das Problem: Wenn ich NUR die Presets speichere, fehlt hier wieder die Information, zu welchem Instrument diese Presets jeweils gehören. Wie löst man es?
3.) Ich habe hier das Feld UUID eingeführt, um jedem Instrument oder Preset eine eindeutige ID zu verpassen. Das dient hauptsächlich der Möglichkeit, zwei Objekte (bzw. ein und das gleiche Objekt), die an verschiedenen Stellen gespeichert sind, zu vergleichen. Macht das Sinn und ist das überhaupt notwendig? Oder ist es in Swift gar kein Problem, mittels if preset1 == preset2 Objekte zu vergleichen (da in dem Fall ja vermutlich nur die Pointer-Adressen verglichen werden!?)?
4.) Ich habe hier in der Klasse Preset ein Feld button vom Typ UIButton. Da ich, wenn ich Instrumente darstelle, für jedes Preset einen Button anlege, und beim Markieren/Löschen/Umbenennen eines Presets auch auf den zugehörigen Button zugreifen muss, speichere ich den Button in diesem Feld. Ist das legitim so oder ist das gegen die Gepflogenheiten von MVC? Falls dem so ist, wie würde man es sonst handhaben?
5.) Ich möchte für Instrument- und Preset-Arrays verschiedene Hilfsfunktionen/-Methoden erstellen wie z.B. findPresetWithCategory(...) oder findPresetWithName(...), die aus dem Array entsprechende Elemente liefert. Wo sind diese Funktionen richtig aufgehoben? An besten in einer von diesen Klassen (z.B. instrument.findPresetWithName(...) oder eher alle zusammen gesammelt in nem eigenen Swift-File?
6.) Oder gibt es die Möglichkeit, eine Extension für Arrays vom Typ X zu erstellen? So dass ich eine Mathede schreiben könnte, die nur bei Arrays vom Typ Instrument vorhanden ist, so dass ich dann direkt instrument.presets.findPresetWith... aufrufen könnte? Habe allerdings keine Infos dazu gefunden und vermute, dass es nicht geht.
Wäre mich sehr freuen, wenn mir jemand hier bei ein paar Fragen Klarheit schaffen könnte Habe zwar schon einige Jahre Programmiererfahrung, aber nicht mit Swift/ObjC/iOS/MVC und auch nicht so sehr mit OOP
Vielen Dank schon mal!
LG Lukas