Best Practice Mappingtabelle

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Best Practice Mappingtabelle

    Hi,

    war ein langer Tag und irgendwie habe ich wohl gerade den Schädel dicht und finde keine schöne Lösung:

    Ich brauche eine Mappingtablle die mir aus einem String einen passenden anderen zurück liefert und das in beide Richtungen. Muss/Sollte ich dafür wirklich eine eigene Klasse machen, die ich auch noch instanzieren muss, die dann zwei fest definierte Arrays hat und ich suche dann in dem einen Array nach dem String und gebe dann den Inhalt des anderen Array am gleichen Index aus. Das ist doch Code mäßig irgendwie blöde. Alleine schon, dass ich die Einträge an zwei komplett verschiedenen Stellen eintragen muss. Wenn es nur in eine Richtung gehen müßte könnte man schön mit einem Dictionary arbeiten aber so ist das auch nicht drin.

    Wie würdet ihr das machen? Am schönsten wäre es wenn man die zugehörigen Paare auch entsprechend im Code zusammen stehen hat, denn die Tabelle muss ständig erweitert werden. Dazu würde mir aber nur einfallen die Werte als XML abzuspeichern und dann einzulesen und zu parsen. Aber das ist ja noch aufwendiger.

    Sehe ich den Wald vor lauter Bäumen nicht oder gibt es da wirklich keine schöne einfache Lösung?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • gritsch schrieb:

    muss es performant sein oder einfach nur schnell runtergetippt sein?
    denn dann kannst du schon NSDictioanry verwenden. Den umgekehrten weg machst du einfach über "[[dict allKeysForObject] lastResult]". oder ist die geschichte nicht 1-1 sondern 1-n?


    Performant ist relativ. Ich denke das werden irgenwann mal so um die 100 Einträge und davon werden dann 5-10 gebraucht. Denke nicht das hier ein Performance-Problem auftritt. Wäre also eine Option es so zu machen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • oder da es ja um string-konstanten geht einfach sowas (noch eine funktion dazu die die liste durchsucht und fertig):

    Quellcode

    1. ​typedef struct {
    2. __unsafe_unretained NSString *a;
    3. __unsafe_unretained NSString *b;
    4. } TwoStringsMap;
    5. static TwoStringsMap stringsMap[] = {
    6. { @"eins", @"one" },
    7. { @"zwei", @"two" },
    8. { @"drei;", @"three" },
    9. { nil, nil } // oder auch nicht.
    10. }
    Alles anzeigen
  • Wie wäre es mit Core Data? Eine Entity mit zwei Attributen definieren und dann auf beide Attribute einen Index packen. Dann kannst Du einfach und schnell per FetchRequest mit passendem Predicate darauf zugreifen.

    Wenn Du für die Entity noch eine eigene Klasse verwendest, dann kannst Du auch gleich zwei Methoden für den jeweiligen Zugriff über Wert1 oder Wert2 implementieren und fertig.

    Scheint mir jetzt eine saubere und schnelle Lösung zu sein. Über Speicherprobleme bei 10.000 oder mehr Mapping-Einträgen brauchst Du Dir bei Core Data auch keine Sorgen zu machen. :)
  • MCDan schrieb:

    Wie wäre es mit Core Data? Eine Entity mit zwei Attributen definieren und dann auf beide Attribute einen Index packen. Dann kannst Du einfach und schnell per FetchRequest mit passendem Predicate darauf zugreifen.

    Wenn Du für die Entity noch eine eigene Klasse verwendest, dann kannst Du auch gleich zwei Methoden für den jeweiligen Zugriff über Wert1 oder Wert2 implementieren und fertig.

    Scheint mir jetzt eine saubere und schnelle Lösung zu sein. Über Speicherprobleme bei 10.000 oder mehr Mapping-Einträgen brauchst Du Dir bei Core Data auch keine Sorgen zu machen. :)


    und dann tipp ich die ganzen Werte alle von Hand in die Datenbank oder ich schreibe extra eine Methode die genau nur einmal benutzt wird um die DB zu erstellen oder verstehe ich da was falsch?

    Das Ganze soll ja quick und easy sein und kein programmiertechnische Wunderwerk :)

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ich weiss ja nicht, wo die Werte für Dein Mapping her kommen?

    Wenn die bereits in einer Computer lesbaren Form vorliegen, dann musst Du diese halt irgendwie importieren.

    Der Import dieser Daten fällt doch eh an, egal wie Du diese später verwendest oder verstehe ich das ganz Problem nicht?
  • MCDan schrieb:

    Ich weiss ja nicht, wo die Werte für Dein Mapping her kommen?

    Wenn die bereits in einer Computer lesbaren Form vorliegen, dann musst Du diese halt irgendwie importieren.

    Der Import dieser Daten fällt doch eh an, egal wie Du diese später verwendest oder verstehe ich das ganz Problem nicht?


    er will die manuell eingeben und deshalb so gut lesbar wie möglich und ohne großen aufwand erweiterbar.
  • MCDan schrieb:

    Ich weiss ja nicht, wo die Werte für Dein Mapping her kommen?

    Wenn die bereits in einer Computer lesbaren Form vorliegen, dann musst Du diese halt irgendwie importieren.

    Der Import dieser Daten fällt doch eh an, egal wie Du diese später verwendest oder verstehe ich das ganz Problem nicht?


    Naja es sind halt im Moment so ca 40 Werte und es werden immer mal wieder welche dazu kommen. Aber nicht heute oder morgen sondern vielleicht in 2 Wochen oder so. Deshalb sollte das Hinzufügen möglichst einfach sein. In dem Fall halt ein einfaches reintippen und gut ist.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    MCDan schrieb:

    Ich weiss ja nicht, wo die Werte für Dein Mapping her kommen?

    Wenn die bereits in einer Computer lesbaren Form vorliegen, dann musst Du diese halt irgendwie importieren.

    Der Import dieser Daten fällt doch eh an, egal wie Du diese später verwendest oder verstehe ich das ganz Problem nicht?


    Naja es sind halt im Moment so ca 40 Werte und es werden immer mal wieder welche dazu kommen. Aber nicht heute oder morgen sondern vielleicht in 2 Wochen oder so. Deshalb sollte das Hinzufügen möglichst einfach sein. In dem Fall halt ein einfaches reintippen und gut ist.

    Du kannst die Werte ja in einer plist erfassen und beim Start der App einmalig einlesen. Ich sehe da ehrlich gesagt keinen großen Aufwand drin.
  • MCDan schrieb:

    Thallius schrieb:

    MCDan schrieb:

    Ich weiss ja nicht, wo die Werte für Dein Mapping her kommen?

    Wenn die bereits in einer Computer lesbaren Form vorliegen, dann musst Du diese halt irgendwie importieren.

    Der Import dieser Daten fällt doch eh an, egal wie Du diese später verwendest oder verstehe ich das ganz Problem nicht?


    Naja es sind halt im Moment so ca 40 Werte und es werden immer mal wieder welche dazu kommen. Aber nicht heute oder morgen sondern vielleicht in 2 Wochen oder so. Deshalb sollte das Hinzufügen möglichst einfach sein. In dem Fall halt ein einfaches reintippen und gut ist.

    Du kannst die Werte ja in einer plist erfassen und beim Start der App einmalig einlesen. Ich sehe da ehrlich gesagt keinen großen Aufwand drin.


    allein schon das bearbeiten einer plist ist viel aufwändiger (vor allem wenn sie im binary format abgespeichert ist).
    auch fehlt einem dann die schnelle übersicht etc.
    hat man zb ein programm ohne bundle, so hat man auch keine resourcen...

    naja, lösungen hat er jetzt ja genug - muss er sich für die passende entscheiden ;)
  • MCDan schrieb:

    Eine plist lässt sich doch direkt in Xcode anzeigen und auch sehr komfortabel editieren.


    und du verwendest immer Xcode? nie einfach nur einen texteditor zb um mehrere einträge autoamtisch einzufügen (per searc&replace bekommt man die xml struktur ja recht schnell hin).
    dann muss mans aber wieder vom binary ins xml-format und dann zurück convertieren.
    binary plists sind auch nicht so schön für die versionsverwaltung.
    außerdem bietest du so daten die du vielleicht mühevoll zusammengesucht hast jedem honk an der weis wie man sich den paketinhalt anzeigen lassen kann... ;)
  • @Thallius

    Wenn Du die Werte nicht händisch oder per lade Methode in deine Anwendung bekommen möchtest, kannst Du die Werte ja in eine Testdatei schreiben und dann per Script, das zur Compilierzeit ausgeführt wird, eine .h Datei erzeugen. In dieser steht dann der gewünschte Datentyp, z.B. NSDictionary, inklusive der Initialisierung.

    Ist schnell umgesetzt und macht nicht viel Arbeit.

    Grüsse
    goto fail;
  • Ich verstehe auch nicht den Aufwand, eine Plist zu editieren gegenüber Sourcen. Auch nicht für $Honk. Und selbstverständlich verwende ich stets den passenden Editor.

    Und wenn dann doch mal ein Eintrag dynamisch sein soll? Viel Spaß mit ARC und C-Struct …
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ok,

    also ich habe mich jetzt für die Dictionary-Variante entschieden. Ich denke das ist der beste Kompromiss. Jetzt ergibt sich noch eine Folgefrage zu der ich auch keine Idee habe. Vielleicht fällt euch ja was schönes ein.

    Wie ich jetzt feststellen musste (Ich wußte vorher das genaue Format der Werte noch nicht) besteht der Zielwert aus einer Art Pfad. Also einfach mal ein Beipsiel:

    Quellcode

    1. NSDictionary *mappingDict= {
    2. @"IRGENDEINE_DEFINITION" : @"aaaa/bbbb/cccc/dddd"
    3. @"NOCHEINE_DEFINITION" : @"aaaa/bbbb/cccc/eeee"
    4. @"WEITERE_DEFINITION' : @"aaaa/gggg/hhhh/iiii"
    5. };


    Es wäre natürlich schön, wenn man für die einzelnen Pfadteile eine Art DEfine benutzen könnte, so dass wenn irgendwann mal (Keine Ahnung ob das passieren kann aber bei meinem Auftraggeber ist alles möglicht ;) "aaaa" unbenannt wird in "ffff", man nur eine Stelle ändern muss und nicht alle einzelnen Einträge. Aber ich wüßte nicht wie man das bewerkstelligen könnte.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)