Hinweis zur Codeverbesserung gesucht

Lesterdor

Erfahrenes Mitglied
Guten Tag,

gestern ist mir beim Schreiben eines Programms deutlich aufgefallen, dass ich ziemlich redundanten Code habe, daher möchte ich gerne in Erfahrung bringen, wie man das geschickter angeht.

Ausgangssituation:

ich habe eine Basisklasse, die 4 abstracte Methoden (Add, Delete, Edit und Exit) enthält. Des Weiteren gibt es 4 Klassen, die von der Basisklasse erben und die oben genannten Methoden implementieren müssen. Soweit so gut. Mir fällt jetzt auf, dass die Methode Delete bei allen 4 Kindklassen immer gleich abläuft und sich nur in der Konvertierung des Datentyps unterscheiden:

protected override void Delete()
{
while (RowDetail.SelectedItems.Count > 0)
{
DBService.DeleteObject(RowDetail.SelectedItem);
SSCs.Remove((SSC)RowDetail.SelectedItem);
}
DBService.SaveChanges();
StatusText = Resource.deleteComplete;
}

Die fett markierten Passagen sind die unterschiede, die von Kindklasse zu Kindklasse variieren. Das SSCs ist eine Collection. Mein Gedankengang ist, dass ich eine generische Methode erstelle, die 2 Parameter bekommt, einmal die Collection, aus der am Ende gelöscht wird und der zu konvertierende Datentyp in dem konkreten Fall SSC.

Leider habe ich keine Erfahrung mit Generic-Programming... Erste Gehversuche sind gescheitert. Vielleicht ist mein Ansatz auch verkehrt, daher dieser Thread.

Ich verwende .NET 3.5.

Um Unterstützung und Hilfe freue ich mich und bedanke mich in diesem Zuge im Voraus!
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Hallo,

es wäre vielleicht noch sinnvoll, wenn du den eigentlichen Anwendungsfall nennst.

So wie ich das deinem Code entnehme, ist nur die Datenquelle (eine Collection) eine andere.
Wie wäre es mit folgender Lösung (allerdings in Java-Syntax):
Java:
abstract class BaseClass {
  // Was heißt SSC überhaupt?
  abstract protected Collection getSSCDataSource();

  @Override
  protected void Delete() {
    // Der Name SSC kollidiert wahrscheinlich mit dem Klassennamen SSC
    Collection SSC = getSSCDataSource();
    while (RowDetail.SelectedItems.Count > 0) {
      DBService.DeleteObject(RowDetail.SelectedItem);
      SSC.Remove((SSC)RowDetail.SelectedItem);
    }
    DBService.SaveChanges();
    StatusText = Resource.deleteComplete;
  }
}

class ChildClass extends BaseClass {
  @Override
  protected Collection getSSCDataSource() {
    return /* ... */;
  }
}
Alternativ könntest du auch die Zeile mit SSC.Remove((SSC)... in eine eigene Methode auslagern, die dann die Kindklassen überschreiben.
 

Lesterdor

Erfahrenes Mitglied
Hallo ComFreek,

Danke für deine Antwort. Mein Anwendungsfall sind Daten aus einer Datenbank, die ich über ein EntityFramework beziehe.
Die SSC-Klasse beschreibt dabei einen Vorgang. Wie du richtig geschrieben hast, dient eine Collection, die die Daten aus der Datenbank lokal im Speicher hält, um darauf zu operieren.

Es ändert sich somit wirklich beim Delete immer nur die Collection, die einen anderen Typ hat. Allerdings ist unter .NET 3.5 kein dynamic Casting möglich.

Ich hatte nämlich folgendes in der Elternklasse probiert:

Code:
protected virtual void Delete(List<T> listsource)
{
   Type datatyp = RowDetail.SelectedItem.GetType();
  while (RowDetail.SelectedItems.Count > 0)
  {
    DBService.DeleteObject(RowDetail.SelectedItem);
    listsource.Remove((datatyp)RowDetail.SelectedItem);
   }
   DBService.SaveChanges();
   StatusText = Resource.deleteComplete;
}
Allerdings verlangt .Net 3.5 zur Kompilierzeit einen Datentyp, weshalb sich dieser Versuch nicht übersetzen lässt.
 

Spyke

Premium-User
Du müsstest in deinem unterem Codebeispiel nur nach T casten:
Code:
listsource.Remove((T)RowDetail.SelectedItem);

Edit:
Oder ganz einfach, einfach mit IList arbeiten
 

Lesterdor

Erfahrenes Mitglied
Hey ComFreak und Spyke,

vielen lieben Dank für eure Unterstützung. Ich habe es nun wie gewünscht hinbekommen, nachdem ich mir von eurem Code Anregungen eingeholt habe und mich ins Thema Generics in C# eingearbeitet habe. Danke für alles!
 

Neue Beiträge