2013-11-28 26 views
5

Obecnie próbuję uzyskać informacje na temat wszystkich różnych wzorów projektowych. Zostałem ustawiony do sortowania IQueryable na podstawie różnych kolumn, to jak to jest obecnie realizowane:Posługiwanie się wzorcem projektowania strategii (C#) do sortowania na podstawie różnych kolumn danych

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; 
} 

wydaje się jednak jak zły zapachy kodu do mnie, że nie ma możliwość dodawania różnych pól lub opcji sortowania łatwo, mój opiekun poinformowała mnie, że byłoby lepiej wdrożyć wzorzec strategii i użyć Dictionary, aby wybrać wymaganą implementację strategii, jednak nie jestem pewien, w jaki sposób wzorzec strategii zostanie zastosowany w tej sytuacji, wskazówki byłyby bardzo doceniane, jeśli potrzebne są dodatkowe informacje, po prostu zapytaj.

+1

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

+0

Dobra odpowiedź od dcastro. Dał ci całą wskazówkę. Od tego momentu musisz zrobić to sam. – Irfan

Odpowiedz

9

Stosując wzorzec strategii, trzeba interfejs ISortStrategy, a następnie kilka implementacje jak SortById, SortByName i SortByAge. Interfejs i jego implementacje będą miały taką metodę, jak object Sort(Animal animal);, która zwraca jedną z właściwości zwierzęcia.

Byłbyś wtedy wystarczy wybrać odpowiednią strategię w czasie wykonywania i używać go tak:

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

Dziękuję za tę odpowiedź, myślę, że wiem, dokąd teraz zmierzam, moim jedynym problemem jest to, że nie jestem pewien, w jaki sposób słownik, którego mi polecono użyć, ma związek z wyborem, która implementacja interfejsu I posługiwać się? – JamesZeinzu

+2

@ user2879468 Tak, możesz zrobić coś takiego jak 'Dictionary ', aby przechowywać różne strategie sortowania w zapytaniu od użytkownika, np. 'Strategia ISortStrategy = myDictionary [userInput]' –

+0

Domyślam się, że słownik będzie używany do indeksuj wszystkie dostępne strategie. Czy wybór pochodzi z danych wprowadzonych przez użytkownika? Przypuszczam, że chce, abyś miał łańcuch "IDictionary <, ISortStrategy>", gdzie klucz jest identyfikatorem (np. "Nazwa", "wiek"). Użytkownik wpisałby "name", a ty użyłbyś tego ciągu, aby znaleźć właściwą strategię w słowniku. – dcastro

4

Kontynuując użytkownika @ dcastro odpowiedzi dotyczące słowników.

Można tworzyć konkretną strategię za pośrednictwem klasy fabryki (i dostać dodatkowe punkty za korzystanie z fabryki, jak również):

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]; 
    } 

} 

Wtedy początkowy kod staje:

ISortStrategy sortStrategy= SortStrategyFactory.GetStrategy(choice); 

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