2013-11-28 9 views
5

Ich versuche derzeit, mich mit den verschiedenen Entwurfsmustern vertraut zu machen. Ich habe die Aufgabe gesetzt, IQueryable basierend auf verschiedenen Spalten zu sortieren. dies ist, wie es zur Zeit implementiert:Verwenden des Strategieentwurfsmusters (C#) zum Sortieren basierend auf verschiedenen Datenspalten

if (choice == 1) 
{ 
    return from Animals in ctx.Animals orderby Animals.AnimalID descending select Animals; 
} 
else if (choice == 2) 
{ 
    return from Animals in ctx.Animals orderby Animals.Name descending select Animals; 
} 
else if (choice == 3) 
{ 
    return from Animals in ctx.Animals orderby Animals.Age descending select Animals; 
} 

Dies scheint jedoch wie ein schlechter Code Geruch zu mir, ist es nicht die Möglichkeit hat, leicht unterschiedliche Felder oder Sortiermöglichkeiten hinzuzufügen, hat mein Lehrer mir geraten, es wäre besser, um das Strategie-Muster zu implementieren und eine Dictionary verwenden, um die Strategie-Implementierung, die wir wollen, zu wählen, aber ich bin mir nicht sicher, wie das Strategie-Muster auf diese Situation angewendet werden würde, hilfreich Tipps würden sehr geschätzt, wenn weitere Informationen erforderlich sind, fragen Sie einfach.

+1

http: // www.dofactory.com/Patterns/PatternStrategy.aspx –

+0

gute Antwort von dcastro. Er gab dir den ganzen Hinweis. Von diesem Zeitpunkt an müssen Sie es selbst tun. – Irfan

Antwort

9

die Strategie Muster anwenden, würden Sie eine ISortStrategy Schnittstelle haben, und dann mehrere Implementierungen wie SortById, SortByName und SortByAge. Die Schnittstelle und ihre Implementierungen würden eine Methode wie object Sort(Animal animal); haben, die eine der Tiereigenschaften zurückgibt.

Sie würden dann wählen Sie einfach die richtige Strategie zur Laufzeit, und es wie folgt verwendet werden:

return from animal in ctx.Animals 
     orderby sortStrategy.Sort(animal) descending 
     select animal; 
+0

Vielen Dank für diese Antwort, ich denke, ich weiß, wo ich jetzt mit diesem gehen werde, mein einziges Problem ist Ich bin nicht sicher, wie das Wörterbuch, das ich verwendet wurde, ins Spiel kommt, ist es mit der Auswahl der Implementierung der Schnittstelle I zu tun benutzen? – JamesZeinzu

+2

@ user2879468 Ja, Sie können etwas wie 'Dictionary ' tun, um die verschiedenen Sortierstrategien zu speichern, dann abfragen von Benutzereingaben wie 'ISortStrategy strategie = myDictionary [userInput]' –

+0

Ich denke, dass das Wörterbuch verwendet wird Index alle verfügbaren Strategien .. Kommt die Wahl von Benutzereingaben? Ich nehme an, er möchte, dass Sie eine IDictionary-Zeichenfolge ISortStrategy> haben, wobei der Schlüssel eine Kennung ist (z. B. name, age). Der Benutzer würde "name" eingeben, und Sie würden diese Zeichenfolge verwenden, um nach der richtigen Strategie im Wörterbuch zu suchen. – dcastro

4

Fortsetzung von @ dcastro Antwort in Bezug auf Wörterbücher.

Sie können die konkrete Strategie über eine Factory-Klasse erstellen (und auch Bonuspunkte für die Verwendung einer Fabrik erhalten):

public static class SortStrategyFactory() 
{ 
    private static Dictionary<string, ISortStrategy> strategyRepository; 

    static SortStrategyFactory() 
    { 
     strategyRepository = new Dictionary<string, ISortStrategy>(); 
     strategyRepository.Add("ID", new SortById()); 
     strategyRepository.Add("Name", new SortByName()); 
     strategyRepository.Add("Age", new SortByAge()); 
    } 

    public static ISortStrategy GetStrategy(string key) 
    { 
     //todo: add error checking 
     return strategyRepository[key]; 
    } 

} 

Dann wird Ihr Anfangscode wird:

ISortStrategy sortStrategy= SortStrategyFactory.GetStrategy(choice); 

return from animal in ctx.Animals 
     orderby sortStrategy.Sort(animal) 
     descending select animal; 
Verwandte Themen