Логично. Спасибо.В типовом случае скорее всего да. Надо это переносить в ту область, которая у тебя запросы выполняет.
Логично. Спасибо.В типовом случае скорее всего да. Надо это переносить в ту область, которая у тебя запросы выполняет.
Я бы так сказал - не надо извне узнавать какие-то параметры, которые в рамках данного класса нужны только для того, чтобы передать кому-то другому.Хм... Похоже, главная мотивация принципа tell don't ask заключается в уменьшении дублирования кода (дублирование одних и тех же проверок в разных местах программы)
Если это так, то в примере с кешированием, если используется весь этот код в нескольких местах, то конечно надо рефакторить. Если же используется только вызов метода, который весь этот код содержит, тогда всё ок.
Правильно?
Или есть еще какие-то выгоды от этого принципа?
Тогда получается:Tell:
$MessageDispatcher->createMessageFor($User)->send();
О, я ждал, пока кто-то напишет.А может быть так:
$email = $User->sendNotify();
а в sendNotify уже сам решает, чего ему делать, ничего не спрашивая.
типа
$MessageDispatcher->sendMessage($this->email, $this->name, $this->body);
$MessageDispatcher->sendMessage($this->email, $this->name, $this->body);
$message = $MessageDispatcher->create();
$message->addRecipient($email);
$message->setBody("Ой! Кажется админ ПФР удалил вас из БД :( Не огорчайтесь, сегодня в магазине рядом идет распродажа веревок и мыла :) ");
$message->send();
$message = $MessageDispatcher->create();
$message->addRecipient($email);
if ($message->method = "sendmail") {
$message->setAltBody();
} else {
$message->setHTMLBody();
}
$message->send();
Пользователь априори не умеет отправлять письма, это задача электронной почты или почтового отделения. Т.е. отдельного объекта.А может быть так:
PHP:$email = $User->sendNotify();
как то нифига не гибко и интуитивно не понятно.Tell:
PHP:$MessageDispatcher->createMessageFor($User)->send();
// вася написал письмо
$mail = new Base_Mail();
$mail->setFrom( Base_Registry::getInstance()->config['robot_email_adress'] );
$mail->setReplyTo( Base_Registry::getInstance()->config['robot_email_adress'] );
$mail->setHeader('Восстановление забытого пароля на сайте');
$mail->setTemplate($this->getTemplateFilePath('FrontendGetpasswordSendTest'));
try {
// захотел отправить его через Главпочтамт
$service = new Module_User_Service_Getpassword();
// зашел в почту
$service->setUser($user)
// отдал письмо
->setMail($mail)
// пота отправила письмо через свои механизмы, не известные васе
->sendEmailWithHash();
} catch ...
$User->tellSelfToGoToPostAndSendLetterNOW();
...
method tellSelfToGoToPostAndSendLetterNOW() {
$User->giveAPan();
$User->giveASheets();
$User->writeAddress();
$User->writeMessage();
$User->addRegads();
$User->walkToPost();
$User->putLetterToMailbox();
$User->tellPostOfficeAboutYouLetter();
$User->profit();
}
этапять! )))))PHP:$User->tellSelfToGoToPostAndSendLetterNOW();
и?> априори не умеет отправлять письма
Окей!
PHP:$User->tellSelfToGoToPostAndSendLetterNOW(); ... method tellSelfToGoToPostAndSendLetterNOW() { $User->giveAPan(); $User->giveASheets(); $User->writeAddress(); $User->writeMessage(); $User->addRegads(); $User->walkToPost(); $User->putLetterToMailbox(); $User->tellPostOfficeAboutYouLetter(); $User->profit(); }
Пользователь априори не умеет отправлять письма, это задача электронной почты или почтового отделения. Т.е. отдельного объекта.
Совершенно правильно. Но как вяжется это утверждение с этим $User->tellSelfToGoToPostAndSendLetterNOW ? У тебя пользователь делает SendLetterNOW. Он не должен это уметь.Это я к тому, что пользователь должен сделать определенные действия, что бы отправить письмо, т.е., подготовить все необходимое для его отправке и передать в почтовое отделение (tell), а не просить (ask) почтовое отделение перезвонить ему и уточнить, какой у него адрес, что будет в письме.
После того, как он его передаст в почтовое отделение (tell), он выполнит свою работу.
Это принцип Tell, don't ask, на пальцах.
Это реальный код?PHP:$User->giveAPan(); $User->giveASheets(); $User->writeAddress(); $User->writeMessage(); $User->addRegads(); $User->walkToPost(); $User->putLetterToMailbox(); $User->tellPostOfficeAboutYouLetter(); $User->profit();