Laden...

Beste Vorgehensweise bei Erstellung von Klassen

Erstellt von sh17 vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.885 Views
S
sh17 Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren
Beste Vorgehensweise bei Erstellung von Klassen

Hallo,

ich bin etwas neu in C# und hab mir folgende Klassen und Member "zusammengesucht".

Kann man das so machen?
Was geht besser?
Verletze ich Konventionen von C#?
Sind MemoryStream und DateTime praktikabel?
Sollte man unbedingt Properties verwenden?

Bin für jeden Hinweis dankbar.

  public struct DoubleString
  {
    public string key;
    public string value;
  }
  public class DoubleStringList : List<DoubleString> { }

  public enum Letter_DocRefType { letterType_None, letterType_Addr, letterType_Proj };

  public class Letter
  {
    public int UID;
    public string UID_Ref_Doc;
    public Letter_DocRefType UID_Ref_Doc_Type;
    public bool Template;
    public string Name;
    public MemoryStream Content;
    public string ContentPlain;
    public DateTime LetterDate;
    public DateTime ChangedAt;
    public int ChangedByUID;
    public string FirstPage;
    public DoubleStringList AdditionalParams;
    public int TmpChanged;

    public Letter()
    {
      //Inhalt = new MemoryStream();
      AdditionalParams = new DoubleStringList();
      Clear();
    }

    public void Clear()
    {
      UID = 0;
      UID_Ref_Doc = "";
      UID_Ref_Doc_Type = Letter_DocRefType.letterType_None;
      Template = false;
      Name = "";
      Content = new MemoryStream();
      LetterDate = DateTime.Now;
      ChangedAt = default(DateTime);
      ChangedByUID = 0;
      FirstPage = "1";
      AdditionalParams.Clear();
      TmpChanged = 0;
    }

    public bool ItemNeedsToBeSaved()
    {
      return (UID == 0) || (TmpChanged > 0);
    }
  }

  public class LetterObjectList : List<Letter>
  {
    public void SortByLastChanged()
    {
      this.Sort(delegate (Letter left, Letter right)
      {
        return left.ChangedAt.CompareTo(right.ChangedAt);
      });
    }

    public void SortByName()
    {
      this.Sort(delegate (Letter left, Letter right)
      {
        return left.Name.CompareTo(right.Name);
      });
    }
  }

6.911 Beiträge seit 2009
vor 7 Jahren

Hallo sh17,

beginnen wir andersrum: Was soll die Klasse abbilden? Danach richtet sich dann auch ihr Design. Wir können das so nur vom Code ableiten, aber das kann auch in die falsche Richtung gehen.

Sollte man unbedingt Properties verwenden?

Ja -- im Sinne der Kapselung sind diese die Technik dazu.

Sind MemoryStream und DateTime praktikabel?

Kommt darauf an für was, aber an sich ja sehr sogar.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.658 Beiträge seit 2006
vor 7 Jahren

Hi sh17,

ergänzend dazu: Damit man sich seinen Code nicht immer "zusammensuchen" muß, haben wir für Einsteiger eine FAQ zur Verfügung gestellt: [FAQ] Wie finde ich den Einstieg in C#?

Weeks of programming can save you hours of planning

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

das Konstrikt mit DoubleString und DoubleStringList finde ich recht kurios:

  public struct DoubleString
  {
    public string key;
    public string value;
  }
  public class DoubleStringList : List<DoubleString> { }

Stattdessen würde man wohl eher ein Dictionary<string,string> statt der DoubleStringList verwenden, und spart sich damit die DoubleString-Klasse (es sei denn die keys könnten mehrfach vorkommen, dann wäre allerdings der Name "key" unpassend).

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
sh17 Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren

@MarsStein Dictionary sieht sehr gut aus, das könnte mein Konstrukt durchaus ersetzen, dankeschön.

@gfoidl

also MemoryStream hab ich einem Byte Array vorgezogen, Content stellt binären Inhalt dar

wenn ich alles in properties packe reicht ja eigentlich erst mal ein

{ get; set; }

Bei meinem MemoryStream-Property dürfe ich dann aber nur einen Getter benutzen, richtig? Zumindest, wenn ich Property-Instanz selbst von außen nicht ändern können soll.

Die FAQ werd ich gleich mal durchsehen.

T
2.224 Beiträge seit 2008
vor 7 Jahren

@sh17
Content in Binärform solltest du eher mit byte[] abbilden.
MemoryStream ist eben ein Stream im RAM und dienst eher als ein Kanal den als Lager.
Binädaten sollte man möglichst immer als byte Array abbilden.

Nachtrag:
Ebenfalls solltest du dir Unterstriche abgewöhnen.
In C# werden die Variablen immer zusammenhängend geschrieben
Liest sich schöner und ist genereller Style in C#
Deinem aktuellen Code fehlen auch Kommentare.
Wenn du einige Zeit lang nicht mit der Klasse arbeitest musst du dir erst anschauen was deine Klasse genau macht.
Hier solltest du den Sinn deiner Methoden/Properties durch Kommentare auch dokumentieren.

Ist es nötig als UID einen int zu nehmen.
In C# gibt es für eindeutige ID die Guid, die löst auch so einige Probleme mit den alten Auto Incrementen.
Du solltest dein Enum und die einzelnen Werte darin sauber bennen.
In jedem Teil davon kommt Letter vor.
Hier ist ein ausreichender Enum Name schon genug um klar zu machen, dass es irgendwas mit Lettern zu tun hat.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
sh17 Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren

Dankeschön, ja, das mit dem Enum stimmt natürlich, ich muss den Typ sowieso immer davor schreiben, da braucht es im Namen nicht noch einmal zu stehen.

UID muss int, eine GUID nützt mir hier nichts.

MemoryStream werde ich ändern. Auch die anderen Style-Anmerkungen. Das kommt davon, wenn man von einer anderen Sprache kommt 😃

M
368 Beiträge seit 2006
vor 7 Jahren

Verletze ich Konventionen von C#?

Zusätzlich noch der Verweis auf den Artikel C#, Richtlinien für die Namensvergabe

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉