Eu tenho um conjunto de funções de propósito único que preciso em dois controladores separados. No momento, só tenho código duplicado e quero me livrar dele. Este código faz parte do controlador e não pertence à minha camada de serviço. Onde você colocaria isso?
mvc
code-smell
Erin
fonte
fonte
Respostas:
Você não disse que tipo de lógica está compartilhando. Em resumo, essa lógica do controlador é uma função auxiliar? Os dois métodos de lidar com isso em uma linguagem orientada a objetos são herança e composição. A herança faz sentido se houver uma ação compartilhada entre os dois controladores. A composição faz sentido o resto do tempo. O exemplo do uso de herança está na minha resposta original abaixo do divisor.
Não é incomum ter uma classe de utilitário ou auxiliar, dependendo da sua estrutura. Por exemplo, nas estruturas da web Java e C #, você pode ter um pacote / namespace para utilitários. No Ruby on Rails, você pode estar aproveitando a
Helper
classe que compartilha lógica entre controladores e visualizações. Basicamente, ficaria assim:Como alternativa, você pode criar uma classe que você instancia. A chave para o padrão de classe estática acima é tornar suas funções funções puras. Em outras palavras, você passa em qualquer estado em que ele precise executar seu trabalho, e a função não faz referência a nenhum outro estado estático no sistema.
Em qualquer um dos casos, você o acessaria em cada um de seus controladores como este:
Resposta original
Você não disse qual era a sua plataforma, pois isso pode afetar a resposta. Supondo que seja uma linguagem orientada a objetos, a abordagem mais comum é criar uma classe base que os dois controladores estendem. Por exemplo, no Ruby on Rails, você pode ter:
Você pode traduzir a ideia para outros idiomas também. A mesma abordagem funcionará para o ASP.NET MVC, Apache Wicket, Grails ou qualquer outra estrutura da Web orientada a objetos. Se sua linguagem não é orientada a objetos, isso realmente depende de como a estrutura é projetada quanto à melhor abordagem.
fonte