Виджет, main.php или как не нужно делать?!

Обсуждаем, как правильно строить приложения
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение ElisDN »

rugabarbo писал(а):Дима, всё верно, но любая сложность должна быть оправдана.
Да, важнейшее слово в программировании, в бизнесе и всём-всём-всём в нашей жизни - это "целесообразность".
rugabarbo писал(а):Всё меньше людей, способных рационально взвесить, что нужно использовать, а что нет.
А вот здесь с трендом не соглашусь. Их как было мало, так и остаётся :)
Последний раз редактировалось ElisDN 2015.12.20, 01:43, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Виджет, main.php или как не нужно делать?!

Сообщение zelenin »

rugabarbo писал(а):Дима, всё верно, но любая сложность должна быть оправдана. Давай посмотрим, что говорит про тот же самый сервисный слой Мартин Фаулер:
The easier question to answer is probably when not to use it. You probably don't need a Service Layer if your application's business logic will only have one kind of client - say, a user interface - and it's use case responses don't involve multiple transactional resources. [...]

But as soon as you envision a second kind of client, or a second transactional resource in use case responses, it pays to design in a Service Layer from the beginning.
Т.о. введение сервиса оправдано, если его действительно удаётся повторно использовать (задействовать один и тот же Service Layer в контроллерах сайта и в контроллерах API, например). Но вводить доп.слой просто для следования трендам - избыточно, нерационально.

То же самое про остальные перечисленные тобой вещи. Даже авто-тесты писать с самого старта проекта слегка избыточно. Есть критерии, которые позволяют оценить целесообразность написания авто-тестов под конкретный проект.

Есть примеры, когда очень крупные Highload-проекты годами жили без QA-отделов. То есть вообще ничего не тестировали. Посмотрите историю технического развития Badoo, например. У них очень долго не было тестирования и отдела качества.

Увы, программирование всё больше становится похожим на моду: "Ребята, что там в тренде? Сервисный слой, авто-тесты, события, NoSQL-решения, ангулярка? Хм... А дай-ка я тоже всё это запихаю в свою разработку! Раз уж вы говорите, что это лучшие практики, то они явно не помешают." :mrgreen: Всё меньше людей, способных рационально взвесить, что нужно использовать, а что нет.
Начни от противного. Стоит ли использовать модель в качестве хелпера? Нет такой здравой практики в модели создавать статические методы для получения какой-то коллекции объектов. Модель Post - об объектном отражении строки из базы данных, а не о хелпере для запросов в БД. И основываясь на этом тезисе и нужно действовать.
Нет ни одного рационального довода создавать статические методы для выборок из базы в модели.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение rugabarbo »

zelenin писал(а):Начни от противного. Стоит ли использовать модель в качестве хелпера? Нет такой здравой практики в модели создавать статические методы для получения какой-то коллекции объектов. Модель Post - об объектном отражении строки из базы данных, а не о хелпере для запросов в БД. И основываясь на этом тезисе и нужно действовать.
Нет ни одного рационального довода создавать статические методы для выборок из базы в модели.
Согласен по всем пунктам. В качестве хелпера использовать модель/AR не стоит. Также я признаю, что встречал проекты, где так делали и приходилось делать также, дабы не вступать в холивар со всей командой разработки :mrgreen:

Но дополнительно я хочу задать один вопрос... А зачем вообще для выборок делать хелпер? :mrgreen: Вот есть у меня сайт без API, без навороченных биллингов и B2B-панелей. Есть только сайт и админка. Код выборок живёт прямо в контроллерах (используется AR + ARQuery). Я бы не сказал, что код контроллеров админки и сайта дублируется (в силу специфики обработки запросов в админке).

Зачем я буду на таком проекте оборачивать запросы во что-то дополнительное? Нет у меня дублирования кода в контроллерах (или же оно минимальное). Зачем доп.классы или сервисный слой? Зачем выносить?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Виджет, main.php или как не нужно делать?!

Сообщение zelenin »

rugabarbo писал(а):
zelenin писал(а):Начни от противного. Стоит ли использовать модель в качестве хелпера? Нет такой здравой практики в модели создавать статические методы для получения какой-то коллекции объектов. Модель Post - об объектном отражении строки из базы данных, а не о хелпере для запросов в БД. И основываясь на этом тезисе и нужно действовать.
Нет ни одного рационального довода создавать статические методы для выборок из базы в модели.
Согласен по всем пунктам. В качестве хелпера использовать модель/AR не стоит. Также я признаю, что встречал проекты, где так делали и приходилось делать также, дабы не вступать в холивар со всей командой разработки :mrgreen:

Но дополнительно я хочу задать один вопрос... А зачем вообще для выборок делать хелпер? :mrgreen: Вот есть у меня сайт без API, без навороченных биллингов и B2B-панелей. Есть только сайт и админка. Код выборок живёт прямо в контроллерах (используется AR + ARQuery). Я бы не сказал, что код контроллеров админки и сайта дублируется (в силу специфики обработки запросов в админке).

Зачем я буду на таком проекте оборачивать запросы во что-то дополнительное? Нет у меня дублирования кода в контроллерах (или же оно минимальное). Зачем доп.классы или сервисный слой? Зачем выносить?
зачем не выносить?
предпочту даже на маленьком проекте делать код чистым, говорящим, непахнущим. Предпочту писать в единообразном стиле. Предпочту писать поддерживаемо, легко поддаваемо рефакторингу.
Я не буду думать будет ли этот код повторяемым и сразу недопущу, чтобы условно в одном контроллере я получал данные через прямой AR, а в другом через сервис-фетчер.
Это стиль, манеры, поддерживаемость, качество.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение rugabarbo »

Не выносить, чтобы не создавать дополнительные сущности, не повышать тем самым порог входа в проект и не повышать сложность системы в целом. Если код контроллеров не дублируется, то он и не "пахнет", остаётся достаточно чистым.

Объективный минус такого подхода: такой код не поддаётся покрытию юнитами, приходится покрывать функциональными/приёмочными тестами.

Да и рефакторинг всегда под рукой ведь. Пишу я пишу себе жирные контроллеры, а потом к сайту добавилось API c похожими контроллерами. Ну не смертельно, пару дней рефакторинга и будет выделен сервисный слой, но уже рационально и под конкретную задачу. И все будут понимать, зачем это нужно в данном проекте (чтобы не дублировать код контроллеров и чтобы покрыть юнитами функциональное "ядро" проекта).

Взять новый сайт Yii - у них достаточно толстенькие контроллеры/модели местами: https://github.com/yiisoft-contrib/yiif ... roller.php - разве это говорит о том, что ребята говнокодят? По-моему, просто нет необходимости в введении дополнительных слоёв и классов для такого проекта. Вот и всё.
Последний раз редактировалось rugabarbo 2015.12.20, 03:11, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Виджет, main.php или как не нужно делать?!

Сообщение zelenin »

best practices и разработчики yii - вещи не совместимые. О том речь и идет, что все сообщество yii покрыто примерами кода, непроходящими проверку на качественность. Разработчики самого фреймворка достаточно посредственны. Их нельзя ставить в пример. Они не развивают php-сообщество, не ведут блогов, не пишут каких-то интересных продуктов, не следят за трендами. Вся их заслуга - быстро работающий фреймворк с частично неплохо написанным кодом, частично с ужаснейшим.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение rugabarbo »

Есть такое высказывание: всё, что популярно - негодно (; Не хочу развивать эту тему в отношении Yii, пойду спать.


Я лишь хотел дать тебе другую точку зрения на вопрос рациональности SL. Надеюсь, тебе удастся стать чуть менее категоричным в суждениях, потому что категоричность и перфекционизм часто блокируют нас на пути к дальнейшему развитию (:
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Виджет, main.php или как не нужно делать?!

Сообщение zelenin »

rugabarbo писал(а):категоричность и перфекционизм часто блокируют нас на пути к дальнейшему развитию (:
как эта фраза сочетается с ниже написанным резюме всей ветки:
- я призываю не бояться вводить новые сущности, писать чистый поддерживаемый код, изучать примеры хорошего кода, читать хорошие книги, развиваться разработчику как разработчику.
- ты призываешь писать как пишут все, не повышать порог входа, следовать так называемому "спаггети"-коду, брать в пример код, написанный разработчиками yii. Другими словами продолжать стагнировать на одном уровне.
Низкий уровень дискуссии - подмена понятий, передергивание, безаргументно, безапеляционно. Без дальнейших фактологических высказываний продолжать не буду - воду лить неинтересно.
Аватара пользователя
xoma
Сообщения: 641
Зарегистрирован: 2009.04.02, 15:24
Откуда: Ногинск
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение xoma »

Согласен почти со всеми утверждениями @zelenin, только не стал бы так резко говорить про команду, которая разрабатывает фреймворк.
Не стоит думать, что там никто не знает про сервисы, репозитории и прочие SOLID-штуки. Просто у фреймворка другая ЦА. Фреймворк позволяет быстро стартануть новичкам и писать более или менее качественный код.

Если разработчик в сотый раз пишет:
Post::find()->where()->andWhere->orWhere и т.д. то в одном, то в дргугом контроллере и не понимает, что это нужно вынести и изолировать - это проблема не фреймворка, это проблема разработчика. В симфони все тоже самое - можно 100 раз писать запрос на DBAL в контроллере, а можно сделать кастомный репозиторий и вынести логику в него и потом везде использовать.

В тоже самое время фреймворк (Yii2) позволяет использовать все из SOLID, да есть ограничения, да есть костыли, но при желании можно писать вполне себе хороший код.
Аватара пользователя
xoma
Сообщения: 641
Зарегистрирован: 2009.04.02, 15:24
Откуда: Ногинск
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение xoma »

Соглашусь про отсутствие документации для "не новичков", вопрос о туториале для "продвинутых" пользователей поднимался уже много раз на форуме, думаю, что рано или поздно он появится. Ну или можно "скинуться" и написать самим +)
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение SiZE »

zelenin писал(а):Модель Post - об объектном отражении строки из базы данных, а не о хелпере для запросов в БД.
Тогда стоит уточнить что это модель AR, а не просто модель.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение SiZE »

xoma писал(а):Фреймворк позволяет быстро стартануть новичкам и писать более или менее качественный код.
Я поддерживаю это мнение и считаю что надо делать в рамках него, а не его пытаться загнать в свои рамки.
Аватара пользователя
xoma
Сообщения: 641
Зарегистрирован: 2009.04.02, 15:24
Откуда: Ногинск
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение xoma »

SiZE писал(а):
xoma писал(а):Фреймворк позволяет быстро стартануть новичкам и писать более или менее качественный код.
Я поддерживаю это мнение и считаю что надо делать в рамках него, а не его пытаться загнать в свои рамки.
Так в предложениях @zelenin нет никаких рамок. Он описывает довольно популярные и известные подходы.
Другое дело готов ли к таким подходам разработчик и команда или нет.
Trampampam
Сообщения: 19
Зарегистрирован: 2015.12.07, 20:01

Re: Виджет, main.php или как не нужно делать?!

Сообщение Trampampam »

к слову, да. Найти вменяемый мануал для новичков нереально. Например: нашел объяснение того, что что-то нужно сделать в виджете и вывести это что-то во вью этого же виджета. ОК, это есть и в гайде.

А что дальше-то?! Как мне это все вывести теперь на самих страницах сайта?! Тишина в мануалах звенящая. ))

Может потому и появляютя распухшие модели, контроллеры и незнание классов, что все руководствуются принципов "работает и ладно", а не принципами масштабируемости проекта и снижения прочих издержек, ибо просто нигде не описано, как это делается, особенно, если ты первый раз впялился в пхп - фреймворк вообще.

Проблему основ могут порождать фреймворки, а решение этих проблем, как в поговорке: у каждого Абрама своя программа. :)
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение rugabarbo »

zelenin писал(а):
rugabarbo писал(а):категоричность и перфекционизм часто блокируют нас на пути к дальнейшему развитию (:
как эта фраза сочетается с ниже написанным резюме всей ветки:
...
Почему ты решил, что эта фраза связана с веткой? :mrgreen:
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Виджет, main.php или как не нужно делать?!

Сообщение mkramer »

Trampampam писал(а):к слову, да. Найти вменяемый мануал для новичков нереально. Например: нашел объяснение того, что что-то нужно сделать в виджете и вывести это что-то во вью этого же виджета. ОК, это есть и в гайде.

А что дальше-то?! Как мне это все вывести теперь на самих страницах сайта?! Тишина в мануалах звенящая. ))
Да ладно? http://www.yiiframework.com/doc-2.0/gui ... ng-widgets

Код: Выделить всё

/* viewFileWhatNeedsAWidget.php */
use app\widgets\MyCoolWidget;

echo MyCoolWidget::widget(["config"=>"for", "my"=>"cool", "widget"=>"finish"]);
 
Видите, людям не до паттерна. Люди не видят в доке, как вызвать созданный ими виджет во вьюхе :)))
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Виджет, main.php или как не нужно делать?!

Сообщение ElisDN »

Trampampam писал(а):Может потому и появляютя распухшие модели, контроллеры и незнание классов, что все руководствуются принципов "работает и ладно", а не принципами масштабируемости проекта и снижения прочих издержек, ибо просто нигде не описано, как это делается, особенно, если ты первый раз впялился в пхп - фреймворк вообще.
Не нагнетайте конспирологию :) Всё давно написано, переписано, переведено. И про базы данных, и про архитектуру, и про масштабируемость. Проблема лишь в человеческой лени, ибо никто не читает.
Trampampam
Сообщения: 19
Зарегистрирован: 2015.12.07, 20:01

Re: Виджет, main.php или как не нужно делать?!

Сообщение Trampampam »

mkramer писал(а):
Trampampam писал(а):к слову, да. Найти вменяемый мануал для новичков нереально. Например: нашел объяснение того, что что-то нужно сделать в виджете и вывести это что-то во вью этого же виджета. ОК, это есть и в гайде.

А что дальше-то?! Как мне это все вывести теперь на самих страницах сайта?! Тишина в мануалах звенящая. ))
Да ладно? http://www.yiiframework.com/doc-2.0/gui ... ng-widgets

Код: Выделить всё

/* viewFileWhatNeedsAWidget.php */
use app\widgets\MyCoolWidget;

echo MyCoolWidget::widget(["config"=>"for", "my"=>"cool", "widget"=>"finish"]);
Видите, людям не до паттерна. Люди не видят в доке, как вызвать созданный ими виджет во вьюхе :)))
ХеллоВиджет работает. Это делал. А вот с примерами, что используют БД туговато. Один хелловиджет всюду.
Trampampam
Сообщения: 19
Зарегистрирован: 2015.12.07, 20:01

Re: Виджет, main.php или как не нужно делать?!

Сообщение Trampampam »

ElisDN писал(а):
Trampampam писал(а):Может потому и появляютя распухшие модели, контроллеры и незнание классов, что все руководствуются принципов "работает и ладно", а не принципами масштабируемости проекта и снижения прочих издержек, ибо просто нигде не описано, как это делается, особенно, если ты первый раз впялился в пхп - фреймворк вообще.
Не нагнетайте конспирологию :) Всё давно написано, переписано, переведено. И про базы данных, и про архитектуру, и про масштабируемость. Проблема лишь в человеческой лени, ибо никто не читает.
Не лукавьте. Прочитать одно, понять другое. Как автор блога, вы прекрасно понимаете, что стиль изложения может быть простым и/или сложным. И в итоге, инфа вроде есть и понять ее могут только подготовленные кодеры, которым это инфа, в принципе, до лампы.

Опять же, от того, что вы что-то написали, это еще не говорит о том, что это есть в поиске ЯНдекса / Гугла на первых страницах, ибо далее 3-4 мало кто ходит. И это, как автор блога, вы тоже знаете.

Мне не до архитектуры и паттернов, мне бы для начала тупо с виджетом "популярное" разобраться. Речь об этом. Про абсолютных новичков.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Виджет, main.php или как не нужно делать?!

Сообщение mkramer »

Trampampam писал(а):А вот с примерами, что используют БД туговато. Один хелловиджет всюду.
Вы программист, или копипастер? Зачем вам примеры с БД? Вы что, не можете в виджете написать:

Код: Выделить всё

namespace app\components;

use yii\base\Widget;
use yii\helpers\Html;
use app\models\Message;
class HelloWidget extends Widget
{
    public function run()
    {
        $message = Message::findOne(["subject"=>"hello"]);
        return $this->render("message", ["message" => $message]);
    }
}
Естественно, должна существовать модель Message. Ну логика же порядка 2+2.
Ответить