Denken Sie an vorberechnete Nachschlagetabellen oder ähnliches. Ab wann ist es sinnvoller, eine Datenbank zu verwenden, anstatt Werte in meiner Anwendung fest zu codieren? Die Werte werden sich nicht ändern, und sie sind gut von den Wartungsentwicklern getrennt. 100 Werte, 1k, 10k, 100k? Ich möchte ungefähr 40k Werte speichern. Im Moment ist es eine maschinengenerierte switch
Aussage (über die VS2010 unglücklich ist).
bearbeiten:
Wenn jemand neugierig ist, habe ich Folgendes versucht: Meine Daten waren in zwei Float-Arrays mit 100.000 Elementen speicherbar, also habe ich das getan. Es dauerte ungefähr 20 Sekunden, um die Daten zu generieren, also habe ich das einmal gemacht und sie mit einem BinaryFormatter zu einer eingebetteten Ressource serialisiert. Das Entpacken der Daten dauert beim Start der Anwendung ungefähr 5 Millisekunden und übertrifft die von mir ersetzte Datenbankimplementierung (diese hartcodierten Werte wurden zuvor dort gespeichert) um fast das 45.000-fache.
quelle
Persönlich bin ich in der Lage, eine beliebige Menge von Daten, die in der Anwendung fest codiert sind, zu speichern, bis keine Notwendigkeit mehr besteht, sie für eine bestimmte Bereitstellung oder einen bestimmten Hotfix zu optimieren.
Das Speichern und Zugreifen auf Daten mithilfe der C # -Schalteranweisung ist jedoch eine ziemlich schlechte Praxis, da das Datenspeicher- und Datenzugriffsmodell eng miteinander verknüpft ist und nur eine Methodenzugriffsmethode (nach Switch-Parametern) impliziert.
Ich würde es vorziehen, Daten in einer Hashtabelle oder einem Wörterbuch zu speichern und separate Klassen zum Abrufen der Daten und zum einmaligen Auffüllen von Suchwörterbüchern bereitzustellen.
Kürzlich fand ich es ziemlich praktisch, kleine DSLs zum Spezifizieren von Geschäftsregeln zu implementieren ( flüssige Schnittstelle für SiteMap oder Frage- Check-Methode "calc" für Steuerrechner zur Definition von Regeln) und dann ein separates Objekt zum Abfragen dieser Regeln bereitzustellen. Diese Technik würde sich gut für Switch-Szenarien eignen.
Einer der Vorteile einer solchen Zerlegung besteht darin, dass Sie eine Reihe von Ansichten für Ihre Daten implementieren können, ohne das XXXk-Linien-Blob zu berühren, das diese Daten definiert.
quelle
Eine 40k-Line-Switch-Anweisung ist etwas fragwürdig. Ich gehe davon aus, dass Sie noch Abfragen durchführen müssen, oder? Haben Sie versucht, die Daten zu kapseln? Verwenden Sie dann LINQ, um Abfragevorgänge für die Auflistung auszuführen und die Leistung zu testen. Holen Sie sich konkrete Zeiten, indem Sie Komponententests mit einem Timer wie StopWatch durchführen . Dann, wenn Sie denken, dass es einfach funktionieren könnte. Prüfen Sie, ob die Leistung für die Benutzer akzeptabel ist.
quelle
Ich hatte zweimal eine solche Anforderung. Die Anwendungen wurden eigenständig entwickelt, ohne dass ein Datenbank-Setup / -Zugriff erforderlich ist. In beiden Fällen habe ich XML-Dateien zum Speichern der Daten verwendet. In der ersten Version des 2.0 Frameworks habe ich die alten XML-Parsing-Aufrufe zum Nachschlagen von Daten verwendet. Bei der neueren Version des 3.5 Frameworks habe ich LINQ to XML verwendet, um das zu finden, was ich brauchte. In beiden Fällen wurde der Zugriff auf die Daten in Klassen eingekapselt.
quelle
Der Schlüssel dabei ist, sicherzustellen, dass Ihre öffentliche Schnittstelle Ihre Implementierung kapselt - aber das ist nicht Ihre Frage, und es gibt keinen Grund zu der Annahme, dass Sie dies nicht getan haben. Darüber hinaus ist es nur eine Frage von Leistung gegen Trauer (und Leistungsunterschiede sind es möglicherweise nicht wert, beachtet zu werden). Als praktische Lösung für die VS 2010-Ausgabe können Sie die case-Anweisung immer in eine Hierarchie von case-Anweisungen aufteilen. Die oberste Ebene kann eine von 10 anderen Methoden aufrufen, von denen jede beispielsweise eine case-Anweisung mit 4000 Fällen enthält. Sie könnten jede der 10 in eine eigene Datei schreiben, wenn Sie müssten. Ein bisschen hässlich, aber Sie generieren trotzdem Code.
Was die Nummer angeht, auf eine DB umzuschalten - es ist immer dann ein Problem, wenn keine DB verwendet wird.
quelle
GetValuesForInput
-type-Methode verfügbar gemacht, und meine massive Aussage ist in der Implementierung verborgen.Sie könnten so etwas wie SQL Compact verwenden. Legen Sie die Daten in eine Tabelle und belassen Sie die DB-Datei im Projekt. Tabellen sind für diese Datenmenge besser geeignet als eine switch-Anweisung.
quelle
Ich denke, das Schlüsselwort hier ist "kaum"
Wenn sich die Daten nie ändern - z. B. vorberechnete mathematische Werte, Farbkonstanten usw. -, behalten Sie sie im Code, solange die Größe für Sie überschaubar ist. Beachten Sie jedoch, dass bei Problemen mit der Leistung die case / switch-Anweisungen im Vergleich zu anderen Optionen sehr langsam sind.
Wenn sich die Daten kaum ändern - zum Beispiel Telefonvorwahlen, Landesgrenzen und dergleichen -, würde ich wahrscheinlich versuchen, die Daten auf irgendeine Weise extern zu halten. Besonders wenn es anfing, mehr als ein paar Dutzend Werte zu werden.
quelle
Wenn Sie große Datenmengen in Ihrer Anwendung speichern, wird Ihr Programm möglicherweise langsamer geladen und Sie setzen den Code möglicherweise einem Risiko aus, falls jemand mit den Binärdateien oder der ausführbaren Datei spielen könnte.
Auch wenn das Programm mehrmals bearbeitet wird, kann es sein, dass Sie Fehler einführen, indem Sie Zahlen versehentlich oder aufgrund eines Änderungsbefehls falsch eingeben.
Möglicherweise werden Sie in Zukunft gefragt, ob Sie Abfragen zu den Daten ausführen möchten, beispielsweise, ob Sie den Durchschnitt einer Spalte abfragen möchten. In diesem Fall müssen Sie Ihre Anwendung ändern und eine Methode hinzufügen, um jede Abfrage zu berechnen, die Ihr Benutzer aufruft Mit und dann mit allen Schritten fortfahren, um Ihren Code in die Produktion zu befördern. Das ist wirklich nicht gut.
Das Trennen von Daten und Code ist eine gute Vorgehensweise, insbesondere wenn die Daten groß sind.
quelle