Tell, don't ask

гемоглобин

Новичок
Никак не могу до конца понять принцип tell dont ask. Ну то есть в сферических примерах всё ясно:
PHP:
$head->getMouth()->say()
Хуже чем
PHP:
$head->say()
Но вот что делать, если есть ядро приложения (типа реестр)?
PHP:
Application::getInstance()->getDb()->query();
Я что должен в Application засовывать все методы всех объектов которые мне понадобятся (db, session, user, etc)?

Чего-то я не понимаю.
 

akd

dive now, work later
Команда форума
Ты Никому Ничего Не Должен. к сожалению, не все ООПнутые это понимают :)
твой getDb() возвращает обьект Db, который уже содержит все свои методы, Application о них ничего не знает.
 

Духовность™

Guest
Почему это
PHP:
$head->getMouth()->say()
хуже чем
PHP:
$head->say()
?
 

Активист

Активист
Команда форума
Принцип "скажи не спрашивая" очень обширный, в результате его несколько расширили.
Здесь подразумевается следующее - что типа объекты не могут общаться между собой, ну скажем правильно, мне объяснить сложно, нашел ссылку в гугле, почитай
http://wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code

> Application засовывать все методы всех объектов
Нет, в апликатион (я бы) засунул интерфейс доступа к либе (в нашем случае db), а в "ядре" оставил бы только ссылку на этот интерфейс.

Application::getInstance()->database->create()->query();
Дело в том, что если у вас например сменится база данных (с MySQL на пострег, например, в виду запрета MySQL ораклом) - вам будет проще )))
 

Активист

Активист
Команда форума
Кстати, по той ссылке, есть хорошие материал по поводу загнивающего кода, у меня есть один проект, который загнил, ибо допиливался крайне быстро в виду его некоммерческого характера, добиливался наспех, куча зависимостей, архитектура сломалась, вот полностью переписываю, ибо его допиливание по времени стало дольше, чем глубокий рефакторинг.
 

Вурдалак

Продвинутый новичок
Почему-то некоторые имеют свойство всё усложнять: просто в данном случае метод query() непосредственно к сущности «приложение» отношения не имеет.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Почему-то некоторые имеют свойство всё усложнять: просто в данном случае метод query() непосредственно к сущности «приложение» отношения не имеет.
Это понятно, но возможно вызов query("SELECT * FROM users ORDER BY dateLogged") можно заменить методом getLastUsers, который уже будет относиться к application
 

whirlwind

TDD infected, paranoid
Это принцип работать в приказном порядке. То есть считаем что вызов выполнят свою работу. Никаких

PHP:
if ( $head->getMouth()->say() ) {
    do something
} else {
    do something else
}
Не выполнить работу он может только в исключительной ситуации
 

Духовность™

Guest
а где про этот принцип почитать можно? не нашел что-то...
 

HraKK

Мудак
Команда форума
Кстати интересный вопрос, вот у меня в моделе есть код
PHP:
{
    если есть кеш
    {
        вернуть результат из кеша
    }
    выполнить запрос
    закешировать
    вернуть результат
}
Тут есть неявная логика спросить кешь. Или я параноик?
 

whirlwind

TDD infected, paranoid
В типовом случае скорее всего да. Надо это переносить в ту область, которая у тебя запросы выполняет. Но есть ситуации где требуется показать инфу о том что из кеша или не из кеша взято, что бы пользователь знал причину искажения или устаревания инфы.
 
Сверху