Entwickler-Ecke

C# - Die Sprache - Lange Methoden in eigene .cs Datei


DummyScript - Mi 04.08.10 15:22
Titel: Lange Methoden in eigene .cs Datei
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 - 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 - 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 - 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);

            // Opens the document
            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();
            //usw...

            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 user profile iconChristian S.: Code- durch C#-Tags ersetzt


Kha - Mi 04.08.10 18:44

user profile iconDummyScript hat folgendes geschrieben Zum zitierten Posting springen:
In wiefern kann man das in einem 1.Zeiler lösen?
Mit einem XML-Serializer, schrieb er doch :zwinker: . 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 - Mi 04.08.10 18:51

Wie schon geschrieben mittels der Klasse XmlSerializer.
Hier ein paar Tutorials aus dem Netz:
http://www.grohne.de/web/tut_xmlserializer.html
http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization
http://skysigal.xact-solutions.com/Blog/tabid/427/EntryId/500/C-Crash-course-tutorial-in-using-the-XmlSerializer-including-the-tricky-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 - Do 05.08.10 06:36

user profile iconDummyScript hat folgendes geschrieben Zum zitierten Posting springen:
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 - 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 - Fr 06.08.10 12:08

user profile iconDummyScript hat folgendes geschrieben Zum zitierten Posting springen:
Hi!
Also wie packt ihr eure Unterprogramme aus der Hauptklasse weg? Was ist in meinem Fall die beste Möglichkeit?


Also wenn es dir NUR darum geht den ganzen Wulst übersichtlicher zu gestalten, kann ich dir die Verwendung von #region empfehlen.


C#-Quelltext
1:
2:
3:
4:
#region XML-Settings
public ladeSettingsAusXml( int a, string b ...)
{ }
#endregion


Dadurch sollte deine IDE in der Lage sein diesen Programmteil auszublenden und nurnoch "XML-Settings" anzuzeigen.


DummyScript - Fr 06.08.10 17:15

Danke für eure Vorschläge! Werde ich berücksichtigen :-)