2017-04-07 12 views
3

Ich mache eine C# -Anwendung. Die Anwendung hat zwei Klassen und mehrere Methoden. Beim Schreiben des Codes bin ich auf ein Problem gestoßen. Ich benutze die gleichen zwei Variablen (XList und YList) und eine Methode in beiden Klassen. Und wahrscheinlich brauche ich mehr Klassen mit diesem Code. Also habe ich ein Duplikationsproblem erstellt. Im Folgenden ist eine einfache Version von meinem Code:Wie vermeidet man Doppelarbeit?

public class A { 
    private testEntities db = new testEntities(); 
    public List<int> XList = new List<int>(); 
    public List<int> YList = new List<int>(); 

    public void GetAllInfo() 
    { 
    // Get the data from a database and add to a list 
    XList = db.Table1.ToList(); 
    YList = db.Table2.ToList(); 
    } 

    public void DoStuff() 
    { 
    // Do Stuff with XList and YList 
    } 
} 

public class B { 
    private testEntities db = new testEntities(); 
    public List<int> XList = new List<int>(); 
    public List<int> YList = new List<int>(); 

    public void GetAllInfo() 
    { 
    // Get the data from a database and add to a list (the same as in class A) 
    XList = db.Table1.ToList(); 
    YList = db.Table2.ToList(); 
    } 

    public void DoDifferentStuff() 
    { 
    // Do ddifferent stuff with XList and YList then in class A 
    } 
} 

Meine Frage ist, was der beste Weg ist, diese Vervielfältigung Problem zu lösen?

Nach einigen Recherchen fand ich, dass ich das wahrscheinlich mit Vererbung oder Zusammensetzung lösen kann. Ich habe auch gelesen, dass die Leute die Komposition über die Vererbung wählen. Also schrieb ich den folgenden Code, um die Vervielfältigung zu lösen:

public class DataPreparation 
{ 
    private testEntities db = new testEntities(); 
    public List<int> XList = new List<int>(); 
    public List<int> YList = new List<int>(); 

    public void GetAllInfo() 
    { 
    // Get the data from a database and add to a list 
    XList = db.Table1.ToList(); 
    YList = db.Table2.ToList(); 
    } 

    // Implement other methods 
} 

public class A 
{ 
    public void MethodName() 
    { 
    DataPreparation dataPreparation = new DataPreparation(); 
    dataPreparation.GetAllInfo(); 

    UseDataX(dataPreparation.XList); 
    UseDataY(dataPreparation.YList); 

    // Implementation UseDataX() and UseDataY() 
    } 
} 

public class B 
{ 
    public void MethodName() 
    { 
    DataPreparation dataPreparation = new DataPreparation(); 
    dataPreparation.GetAllInfo(); 

    VisualizeDataX(dataPreparation.XList); 
    VisualizeDataY(dataPreparation.YList); 

    // Implementation VisualizeDataX() and VisualizeDataY() 
    } 
} 

Wie man sehen kann ich eine Klasse aus, die die Daten aus der Datenbank immer behandelt. Und dass die Klasse A und B die DataPreparation-Klasse verwenden. Aber ist das der beste Weg, um die Duplizierung zu lösen? Oder sollte ich Vererbung oder etwas anderes verwenden?

+0

Startpunkt: Wie planen Sie, Ihre Methoden zu testen? – tym32167

Antwort

4

Ich denke, man sollte wohl eine Methode nur DoStuff() eher als ein DoStuff() genannt hat genannt und eine andere namens DoDifferentStuff().

Dann können Sie eine ABC erstellen den gemeinsamen Code zu implementieren und haben eine abstrakte DoStuff() Methode, die unterschiedlich in den abgeleiteten Klassen implementiert:

public abstract class Base 
{ 
    private testEntities db = new testEntities(); 

    public List<int> XList = new List<int>(); 
    public List<int> YList = new List<int>(); 

    public void GetAllInfo() 
    { 
     // Get the data from a database and add to a list (the same as in class A) 
     XList = db.Table1.ToList(); 
     YList = db.Table2.ToList(); 
    } 

    public abstract void DoStuff(); 
} 

public class A: Base 
{ 
    public override void DoStuff() 
    { 
     // Do Stuff with XList and YList 
    } 
} 

public class B: Base 
{ 
    public override void DoStuff() 
    { 
     // Do ddifferent stuff with XList and YList then in class A 
    } 
} 

(ich denke auch, dass es eine schlechte Idee, den öffentlichen Bereichen haben so dass - aber ich hoffe, dass dies nur Beispielcode ist und Ihr realer Code diese nicht hat ...)

Anderer Code (außer Code, der A oder B erstellt) würde das Objekt verwenden über die Klassenart Base.

+0

Vielen Dank für Ihre Antwort. Ja, es ist ein Beispiel, ich möchte die öffentlichen Felder in Eigenschaften ändern. Ich habe ein paar Fragen dazu. Was ist der Grund dafür, Vererbung zu verwenden? Warum nicht zum Beispiel Komposition? Und warum machst du eine abstrakte Methode? –

+1

@BarryStotter Die Methode ist abstrakt, da die Basisklasse nicht weiß, wie die Methode implementiert werden soll. Es wird Vererbung verwendet, da nur so eine virtuelle Methode mit verschiedenen Implementierungen in verschiedenen abgeleiteten Klassen erstellt werden kann. Sie können es mit der Komposition machen, indem Sie eine 'DoStuff()' Aktion in den Konstruktor einfügen, aber für dieses spezielle Problem halte ich das nicht besser als die Vererbung. –

+0

Wenn die Implementierung der Methode in Klasse A völlig anders als die Methode in Klasse B war. Wäre es dann besser, keine abstrakte Methode zu verwenden? Oder vielleicht Zusammensetzung dann verwenden? –

2

Eine einfache Option ist die Verwendung inheritance. Stellen Sie eine Basisklasse mit der gemeinsamen Funktionalität her und die A und B können davon erben. Zum Beispiel:

public abstract class Base 
{ 
    private testEntities db = new testEntities(); 
    public List<int> XList = new List<int>(); 
    public List<int> YList = new List<int>(); 

    public void GetAllInfo() 
    { 
     // Get the data from a database and add to a list 
     XList = db.Table1.ToList(); 
     YList = db.Table2.ToList(); 
    } 
} 

public class A : Base 
{ 
    public void DoStuff() 
    { 
     // Do Stuff with XList and YList 
    } 
} 

public class B : Base 
{ 
    public void DoDifferentStuff() 
    { 
     // Do ddifferent stuff with XList and YList then in class A 
    } 
} 
Verwandte Themen