У меня есть набор одноцелевых функций, которые мне нужны в двух отдельных контроллерах. Сейчас у меня просто дублированный код, и я хочу от него избавиться. Этот код является частью контроллера и не принадлежит моему уровню обслуживания. Где бы вы это положили?
mvc
code-smell
Erin
источник
источник
Ответы:
Вы не сказали, что это за логика, которой вы делитесь. Короче говоря, это логика контроллера или вспомогательная функция? Два метода решения этой проблемы в объектно-ориентированном языке - наследование и композиция. Наследование имеет смысл, если между двумя контроллерами существует совместное действие. Композиция имеет смысл в остальное время. Пример использования наследования лежит в моем первоначальном ответе под делителем.
Нередко бывает, что в зависимости от вашей среды есть вспомогательный класс или вспомогательный класс. Например, в веб-инфраструктурах Java и C # у вас может быть пакет / пространство имен для утилит. В Ruby on Rails вы можете использовать
Helper
класс, который разделяет логику между контроллерами и представлениями. По сути, это будет выглядеть так:Кроме того, вы можете сделать это классом, который вы создаете. Ключ к приведенному выше шаблону статического класса - сделать ваши функции чистыми функциями. Другими словами, вы переходите в любое состояние, необходимое для выполнения своей работы, и функция не ссылается на какое-либо другое статическое состояние в системе.
В любом случае вы получите доступ к нему на каждом из ваших контроллеров, как это:
Оригинальный ответ
Вы не сказали, какая у вас платформа, так как это может повлиять на ответ. Предполагая, что это объектно-ориентированный язык, наиболее распространенный подход заключается в создании базового класса, который расширяют оба контроллера. Например, в Ruby on Rails вы можете иметь:
Вы также можете перевести эту идею на другие языки. Тот же подход будет работать для ASP.NET MVC, Apache Wicket, Grails или для любой другой объектно-ориентированной веб-среды. Если ваш язык не является объектно-ориентированным, то это действительно зависит от того, как спроектирована структура для наилучшего подхода.
источник