2013-11-28 8 views
5

Attualmente sto cercando di capire come funziona il design Patterns, sono stato impostato il compito di ordinare uno IQueryable basato su colonne diverse, questo è come è attualmente implementata:Uso dello schema di progettazione della strategia (C#) per ordinare in base a diverse colonne di dati

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

questo però mi sembra un codice di cattivo odore per me, non ha la possibilità di aggiungere campi diversi o opzioni di ordinamento facilmente, il mio tutor mi ha consigliato che sarebbe meglio per implementare il modello di strategia e utilizzare uno Dictionary per selezionare l'implementazione della strategia che vogliamo, Tuttavia non sono sicuro di come il Pattern Strategico verrà applicato a questa situazione, qualsiasi utile i consigli sarebbero molto apprezzati, se sono necessarie ulteriori informazioni, basta chiedere.

+1

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

+0

buona risposta da dcastro. Ti ha dato tutto il suggerimento. Da quel momento in poi, devi farlo da solo. – Irfan

risposta

9

Applicando il modello di strategia, si avrebbe un'interfaccia ISortStrategy, e quindi diverse implementazioni come SortById, SortByName e SortByAge. L'interfaccia e le sue implementazioni avrebbero un metodo come object Sort(Animal animal); che restituisce una delle proprietà dell'animale.

Farebbe quindi basta selezionare la strategia adeguata in fase di esecuzione, e usarlo in questo modo:

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

Grazie per questa risposta, penso di sapere dove sto andando ora, il mio unico problema è Im non sono sicuro di come il dizionario che mi è stato detto di usare entri in gioco, sia per la scelta di quale interfaccia dell'interfaccia uso? – JamesZeinzu

+2

@ user2879468 Sì, si può fare qualcosa come 'Dictionary ' per memorizzare le diverse strategie di ordinamento per poi interrogarlo da input dell'utente come 'ISortStrategy strategy = myDictionary [userInput]' –

+0

Immagino che il dizionario sarà usato per indicizza tutte le strategie disponibili. La scelta viene dall'input dell'utente? Suppongo che voglia che tu abbia un 'IDictionary ', dove la chiave è un identificatore (ad esempio, "nome", "età"). L'utente inserirà "nome" e userete quella stringa per cercare la giusta strategia nel dizionario. – dcastro

4

Proseguendo da @ di dcastro risposta, per quanto riguarda dizionari.

È possibile creare la strategia di cemento tramite una classe di fabbrica (e ottenere punti bonus per l'utilizzo di una fabbrica così):

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

} 

Allora il vostro codice iniziale diventa:

ISortStrategy sortStrategy= SortStrategyFactory.GetStrategy(choice); 

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