Se hai un pezzo di logica che deve essere condiviso tra due controllori dove lo tieni?

9

Ho una serie di funzioni a singolo scopo di cui ho bisogno in due controller separati. In questo momento ho solo il codice duplicato e voglio liberarmene. Questo codice fa parte del controller e non appartiene al mio livello di servizio. Dove lo metti?

    
posta Erin 29.03.2011 - 14:52
fonte

1 risposta

10

Non hai detto che tipo di logica è che stai condividendo. In breve, questa logica del controller o una funzione di supporto? I due metodi per trattare questo in un linguaggio orientato agli oggetti sono l'ereditarietà e la composizione. L'ereditarietà ha senso se esiste un'azione condivisa tra i due controllori. La composizione ha senso il resto del tempo. L'esempio dell'utilizzo dell'ereditariità si trova nella mia risposta originale sotto il divisore.

Non è raro avere una classe di utilità o una classe di supporto a seconda del tuo framework. Ad esempio, nei framework web Java e C # potresti avere un pacchetto / spazio dei nomi per le utilità. In Ruby on Rails, potresti trarre vantaggio dalla classe Helper che condivide la logica tra controller e viste. Fondamentalmente, sarebbe simile a questo:

// NOTE: group similar functions
static class LoginUtility
{
    static bool IsLoggedIn(Request request) { /* ... */ }
}

In alternativa, puoi renderlo un corso che instanziati. La chiave per il modello di classe statica sopra è quello di rendere le funzioni funzioni pure. In altre parole, si passa in uno stato in cui è necessario eseguire il proprio lavoro e la funzione non fa riferimento a nessun altro stato statico nel sistema.

In entrambi i casi, dovresti accedervi in ciascuno dei tuoi controller in questo modo:

void MyAction()
{
    if (LoginUtiltiy.IsLoggedIn(Request))
    {
        // Do something ...
    }
}

Risposta originale

Non hai detto quale fosse la tua piattaforma, in quanto ciò potrebbe influenzare la risposta. Supponendo che si tratti di un linguaggio orientato agli oggetti, l'approccio più comune è quello di creare una classe base che sia i controller si estendano. Ad esempio in Ruby on Rails potresti avere:

class BaseController < ApplicationController
    def my_special_function
        # ...
    end
end

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

Puoi tradurre l'idea anche in altre lingue. Lo stesso approccio funzionerà con ASP.NET MVC, Apache Wicket, Grails o con qualsiasi altro framework web orientato agli oggetti. Se la tua lingua non è orientata agli oggetti, dipende in realtà da come è concepito il framework rispetto all'approccio migliore .

    
risposta data 29.03.2011 - 14:58
fonte

Leggi altre domande sui tag