У мене є набір функцій єдиного призначення, які мені потрібні в двох окремих контролерах. Зараз у мене просто є дублікат коду, і я хочу його позбутися. Цей код є частиною контролера і не належить до мого сервісного рівня. Куди б ви його поклали?
У мене є набір функцій єдиного призначення, які мені потрібні в двох окремих контролерах. Зараз у мене просто є дублікат коду, і я хочу його позбутися. Цей код є частиною контролера і не належить до мого сервісного рівня. Куди б ви його поклали?
Відповіді:
Ви не сказали, що це за логіка, якою ви ділитесь. Коротше кажучи, це логіка контролера чи функція помічника? Два способи поводження з цим об'єктно-орієнтованою мовою - це успадкування та склад. Спадкування має сенс, якщо між двома контролерами є спільна дія. Композиція має сенс решту часу. Приклад використання успадкування лежить у моїй оригінальній відповіді під роздільником.
Не рідкість мати клас корисності або клас помічника, залежно від вашої структури. Наприклад, у веб-рамках Java та C # ви можете мати пакет / простір імен для утиліт. У Ruby on Rails ви можете скористатися Helper
класом, який розділяє логіку між контролерами та видами. В основному, це виглядатиме так:
// NOTE: group similar functions
static class LoginUtility
{
static bool IsLoggedIn(Request request) { /* ... */ }
}
Крім того, ви можете зробити його класом, який ви використовуєте. Ключ до вищезгаданого статичного шаблону класу полягає в тому, щоб зробити ваші функції чистими функціями. Іншими словами, ви передаєте в будь-якому стані, що йому потрібно виконати свою роботу, а функція не посилається на будь-який інший статичний стан у системі.
В будь-якому випадку ви отримаєте доступ до нього у кожному з своїх контролерів, як це:
void MyAction()
{
if (LoginUtiltiy.IsLoggedIn(Request))
{
// Do something ...
}
}
Оригінальний відповідь
Ви не сказали, що це за ваша платформа, оскільки це може вплинути на відповідь. Припускаючи, що це об'єктно-орієнтована мова, найпоширенішим підходом є створення базового класу, який розширюють обидва контролери. Наприклад, у Ruby on Rails:
class BaseController < ApplicationController
def my_special_function
# ...
end
end
class Controller1 < BaseController
# ...
end
class Controller2 < BaseController
# ...
end
Ви можете перекласти ідею і на інші мови. Цей же підхід буде працювати і для ASP.NET MVC, Apache Wicket, Grails, або майже будь-який інший об'єктно-орієнтований веб-фреймворк. Якщо ваша мова не орієнтована на об’єкти, то це дійсно залежить від того, як буде розроблена рамка як найкращий підхід.