2 назначения у объекта - правильно или нет?

Духовность™

Продвинутый новичок
2 назначения у объекта - правильно или нет?

В рамках MVC надо хочу сделать свой первый сервис, позволяющий пользователям восстановить их пароль в системе, указав свой логин или email. Я решил сделать класс Getpassword который инкапсулирует логику сервиса. В контроллере обрабатывающего запрос пишу:

PHP:
// тут проверки на существование логина или email-адреса из POST 
// если найден пользователь с такими данными,
// получили объект пользователя
$user;

// обертка над mail
$mail = new Base_Mail();
// указываем from-адрес  ([email protected])
$mail->setFrom(Base_Registry::getInstance()->config['robot_email_adress']);
// указываем reply-адрес ([email protected]) 
$mail->setReplyTo(Base_Registry::getInstance()->config['robot_email_adress']);
// заголовок письма
$mail->setHeader('Восстановление забытого пароля на сайте '.$_SERVER['HTTP_HOST']);
// указываем путь к шаблону письма 
$mail->setTemplate($this->getTemplateFilePath('FrontendGetpasswordSendTest'));

try
{
    $service = new Getpassword();
    // как вам такое API кстати?
    $service->setUser($user)-> // указываем для сервиса пользователя, который хочет восстановить пароль
              setMail($mail)-> // объект письма 
              sendTest(); // отправляем письмо, совершаем логику сервиса Getpassword
}
catch (Exception $e){..}
в общем, тут всё наверно ясно и стандартно - на почту отправляется уникальная ссылка, пройдя по которой пользователь попадет на другой скрипт, который должен проверить секретный хэш из ссылки и в случае положительного результата выслать пользователю новый пароль.

Меня смущает вот что - Getpassword я собираюсь использовать как для отправки письма и всей остальной логикой, присущей шагу 1, так и для заключительного шага 2, когда проверяется хэш-код из ссылки. Меня это смущает, ведь объект должен отвечать за одно какое-то действие, иметь одно назначение.
Но в тоже время разделять Getpassword на два класса совсем не уместно.. как быть?
 

korchasa

LIMB infected
Это нормально, т.к. это по сути два обязательных шага в алгоритме, который он инкапсулирует. Правда сейчас он этого не делает. Я бы сделал так:
PHP:
class PasswordReminder
{
  function sendEmailWithHash($user) {...}
  function isHashValid($user, $hash) {...}
}
-~{}~ 09.08.10 14:36:

По хорошему isHashValid надо переименовывать в isRequestValid($user, $request), чтобы все внутрь упихать
 

Духовность™

Продвинутый новичок
Понятно. А как быть с зависимостями в таких "богатых" объектах? Объект БД, почта и шаблон, интернационализация. Всё это должно тупо быть прописано в классе или все это надо впрыскивать в класс PasswordReminder ?
 

korchasa

LIMB infected
Все по ситуации. Сначала я бы делал в лоб, а потом уж по прецедентам (внутри можно заранее прослоить методами, типа $this->getDbConnection()). С другой стороны, если фича нужна 100%-но (например, изначально делаем версию на кучу языков), то делал бы ее впрыскивание сразу.
 

Духовность™

Продвинутый новичок
Кстати, а кто как делает восстановление пароля через ссылку? Поделитесь интересными алгоритмами!
 
Сверху