Autor |
Beitrag |
DummyScript
      
Beiträge: 24
|
Verfasst: Mi 04.08.10 15:22
Hi!
Ich habe folgendes Problem: In meiner Hauptklasse gibt es 2 Methoden die für das laden einer Konfigurations-XML-Datei zuständig sind. Da in der Datei relativ viele Variablen gespeichert sind, sind die beiden Methoden recht lange. Darum würde ich sie gerne wegpacken. In C ist das einfach: Die Unterprogramme in eine neue .c Datei kopieren und per #include einfügen. In C# würde ich normalerweise dafür eine eigene Klasse erstellen. Doch das Problem in diesem Fall ist, dass sehr viele Variablen der Hauptklasse verwendet werden.
Also wie packt ihr eure Unterprogramme aus der Hauptklasse weg? Was ist in meinem Fall die beste Möglichkeit?
Danke für eure Hilfe!
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 04.08.10 15:26
Hallo,
wenn du zu viele Variablen hast hört sich das nach einer eignen Klasse/Struktur an. Eine Methode mit viel Code lässt sich wohl am besten mit dem Aufruf andere Methoden kapseln. Ansonsten wohl noch Code an sich optimieren. Aber dafür müsstest du uns wohl den Code zeigen damit wir dir Sagen könnten wir du ihn umschreiben kannst.
Gruß
|
|
Th69
      

Beiträge: 4799
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 04.08.10 15:32
Mittels XML-Serialisierung (XmlSerializer) sollte sowohl das Lesen als auch Schreiben der XML-Datei nicht mehr als ein Einzeiler sein (und die Eigenschaften dann entsprechend mit den passenden Attributen belegen, falls überhaupt nötig!).
|
|
DummyScript 
      
Beiträge: 24
|
Verfasst: Mi 04.08.10 15:38
Naja es ist im Prinzip so, dass in meiner Hauptklasse (ein Teleskoptreiber) ~20 Variablen für div. Einstellungen sind. Das ist so und kann ich auch nicht ändern. Diese Einstellungen werden von einem Programm das den Treiber lädt beliebig abgefragt. Sobald der Treiber initialisiert wird, werden die zuletzt verwendeten Einstellungen aus einer XML-Datei geladen. Bei ~20 Einstellungen sind die Methoden die für Speichern und Laden zuständig sind natürlich entsprechend umfangreich.
Anbieten würde sich eventuell, alle Einstellungen in ein Struct zu speichern, und dieses zu übergeben. So werde ich es wahrscheinlich auch machen. (Ist mir gerade eingefallen)
@Th69:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| public void SaveConfig(string Filename) { XmlTextWriter ConfigFile = new XmlTextWriter(Filename, null);
ConfigFile.WriteStartDocument();
ConfigFile.WriteStartElement("TelescopeConfiguration");
ConfigFile.WriteStartElement("Viewpoint"); ConfigFile.WriteStartElement("Latitude"); ConfigFile.WriteString(String.Format("{0}", m_SiteLatitude)); ConfigFile.WriteEndElement();
ConfigFile.WriteStartElement("Longitude"); ConfigFile.WriteString(String.Format("{0}", m_SiteLongitude)); ConfigFile.WriteEndElement();
ConfigFile.WriteStartElement("Elevation"); ConfigFile.WriteString(String.Format("{0}", m_SiteElevation)); ConfigFile.WriteEndElement(); ConfigFile.WriteEndElement(); ConfigFile.WriteEndElement();
ConfigFile.WriteEndDocument();
ConfigFile.Close(); } |
In wiefern kann man das in einem 1.Zeiler lösen? Bzw. beim Auslesen muss ich ja den Wert der richtigen Variable zuweisen => großes Switcht().
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 04.08.10 18:44
DummyScript hat folgendes geschrieben : | In wiefern kann man das in einem 1.Zeiler lösen? |
Mit einem XML-Serializer, schrieb er doch  . Mit einem DataContractSerializer kannst du sogar bei privaten Feldern bleiben und musst nur noch jeweils ein [DataMember] davor hängen.
PS: Wenn es nicht um höchste Performance geht, kannst du auch für gewöhnlichen XML-Zugriff XmlTextReader/Writer aus deinem Gedächtnis verbannen. XElement ist da doch ein wenig hübscher.
_________________ >λ=
|
|
Th69
      

Beiträge: 4799
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 04.08.10 18:51
Wie schon geschrieben mittels der Klasse XmlSerializer.
Hier ein paar Tutorials aus dem Netz:
www.grohne.de/web/tut_xmlserializer.html
www.switchonthecode....al-xml-serialization
skysigal.xact-soluti...icky-situations.aspx
Du mußt also nur entsprechende Klassen mit den benötigten Eigenschaften erstellen und darauf dann XmlSerializer.Serialize bzw. Deserialize anwenden (dies ist dann der Einzeiler -)
Wenn deine XML-Datei jedoch ein bestimmtes Format haben muß, dann kannst du bei den Eigenschaften entsprechende Attribute setzen (z.B. XmlRoot, XmlElement, XmlAttribute, XmlIgnore, ...).
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.08.10 06:36
DummyScript hat folgendes geschrieben : | Naja es ist im Prinzip so, dass in meiner Hauptklasse (ein Teleskoptreiber) ~20 Variablen für div. Einstellungen sind. Das ist so und kann ich auch nicht ändern. |
Nun ja, es hört sich doch so an als würde da genau eine Konfigurationsklasse passen, die selbst die Einstellungen als Properties zur Verfügung stellt und diese auch verwaltet, sprich lädt und speichert.
Dann kannst du von der Hauptklasse auf eben diese Klasse dann zugreifen und die Einstellungen benutzen. Das ist doch deutlich übersichtlicher als da viele einzelne Variablen in der Hauptklasse zu haben.
|
|
CSMN
      
Beiträge: 43
Erhaltene Danke: 2
|
Verfasst: Do 05.08.10 18:09
ich würde das an deiner stelle über die projektsettings regeln. die kannst du unter Properties/Einstellungen erstellen und dann via Code abrufen und speichern
C#-Quelltext 1: 2: 3: 4:
| Namespace.Properties.Settings.Default.Pfad= tB_Pfad.Text; Namespace.Properties.Settings.Default.Save(); ... StreamReader sr = new StreamReader(Namespace.Properties.Settings.Default.Pfad); |
|
|
Chrison
Hält's aus hier
Beiträge: 2
Erhaltene Danke: 1
|
Verfasst: Fr 06.08.10 12:08
|
|
DummyScript 
      
Beiträge: 24
|
Verfasst: Fr 06.08.10 17:15
Danke für eure Vorschläge! Werde ich berücksichtigen 
|
|