Autor Beitrag
rittergig
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 26.11.12 00:33 
Hallo,

ich habe mal eine allgemeine Frage.
Ist es ein guter Stil, Logik, die die Properties der Klasse befüllt, in einen Klassenkonstruktor zu implementieren?
Oder sollte man diese Logik lieber in eine statische Methode der Klasse implementieren und diese Methode dann von außen aufrufen und die Daten dann die Klasse direkt übergeben.

Konkret bin ich mir bei folgenden Fall unsicher:
Ich möchte eine eigene Regex-Engine schreiben (weil ich Spaß dran habe und mein Regex-Wissen anwenden will).
Im ersten Schritt nehme ich den Regex-String auseinander und unterscheide zwischen Literalen, Metazeichen und Klassen ([..]).

Für Zeichenklassen (z. B. [_0-9a-zA-Z]) habe ich nun eine Klasse in C# geschrieben, die eine Zeichenklasse repräsentiert.
Die Klasse hat folgende Properties, um eine Regex-Zeichenklasse darzustellen:
• List<char> Characters
• List<Range> Ranges ( public struct Range { public char start, end; } )
• bool IsNegated

Nun überlege ich, ob ich einen Konstruktor wie
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public Class(string classString)
{
   this.IsNegated = Class.FindOutWhetherKlassIsNegated(classString);
   this.Characters = Class.ExtractCharacters(classString);
   this.Ranges = Class.ExtractRanges(classString);
}
schreibe, der im Konstruktor den
String (z. B. [_0-9a-zA-Z], [^a-z] oder \w) parst und die Properties befüllt.

Ist dies in diesem Fall eine gute Idee oder sollte ich ausschließlich einen Konstruktor
wie
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
Class(bool isNegated, List<char> characters, List<Range> ranges)
{
   this.IsNegated = isNegated;
   this.Characters = characters;
   this.Ranges = ranges;
}
bereitstellen?

Oder sollte ich diese Funktionalität als statischer Methode dieser Klasse bereitstellen?

(Die oben genannten Code-Ausschnitte sind Pseudocode, und haben keinen Anspruch auf Eleganz und Performanz ;-) )

Vielen Dank für Hinweise
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 26.11.12 11:23 
Wenn die Klasse alles andere eindeutig aus classString bestimmen kann (auch ohne komplexe externe Abgängikeiten) sollte auch nur das die zu benutzende Oberfläche der Klasse sein. Das schließt den Konstruktor ein. Die Dinge einzeln anzufordern macht nur dan Sinn wenn die Bestimmung der abgeleiteten Werte aufwendig ist und deren Ergebnis mehrfach z.B in verschiedenen Class Instanzen benötigt wird.

Wenn letzteres nicht der Fall ist würde ich eher nur den Konstruktor mit classString anlegen und deine Properties ~intelligent~ gestallten. Heißt gar nicht im Konstruktor setzen sondern in der Property berechnen. Also z.B. im Getter von IsNegated die Class.FindOutWhetherKlassIsNegated Methode platzieren.