• Как вы освоили шаблоны проектирования?

    goodprogrammer
    @goodprogrammer
    к. ф.-м. н.
    Опасная дорожка — заставлять себя применять паттерны. Паттерны не волшебная таблетка.

    Гораздо лучше самому сесть и подумать над решением, потом решить, набить шишек и через время изучить паттерны. Тогда будет настоящее понимание, где и как их применять.

    А то такого набыдлокодите, что мама не горюй :(
    Ответ написан
    3 комментария
  • Как вы освоили шаблоны проектирования?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Когда начался бум и восторг вокруг концепции паттернов проектирования, выкрики "GoF рулит!" и так далее, я озадачился тем, чтобы понять, что за шум?

    По своей сути - паттерны - это обычные шаблоны проектирования. Заимствовано у обычных архитекторов (те, которые зданиями занимаются). Суть проста. В работе архитектора есть задачи, которые удобно решать одним или несколькими проверенными способами.

    По аналогии в проектировании софта имееются свои архитектурные вопросы вроде разбиения приложения на компоненты/модули, организации зависимостей между ними, распределение функциональных обязанностей и т.п. Как ловко подметили авторы книжки из этой банды четырех (The "Gang of Four") в нашей индустрии можно также выделить некоторе количество типовых шаблонов, проверенных на практике, чтобы тем самым не наступать на уже обойденные другими грабли.

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

    Чтобы понять, где они нужны - нужен опыт. То есть (я лично убежден), что учиться на ошибках других может только крайне ограниченное число людей. Все остальные обязаны набить шишки самостоятельно :)

    К изучению паттернов я дам такие советы:

    1) Прочтите пару книжек, чтобы понять, что это за зверь и с чем его едят. Можно взять одну из вариаций книжки GoF или какие-то производные для вашего стека разработки - познакомиться с основными популярными шаблонами. Сразу после этого я посоветовал бы прочесть книжку "Горький вкус Java" (Брюс Тейт) - она про анти-паттерны. Это чтобы понять обратную сторону их использования. Мне понравилась и уберегла думаю от многих проблем. То что на примере Java - неважно. Речь идет о шаблонах, так что представителям других стеков (к которым отношусь и я) будет просто понять все равно.

    2) Постарайтесь осознать, доводилось ли вам сталкиваться в работе раньше с чем-то, что является или могло бы легко стать одним из шаблонов. Где получалось применить концепт верно, а где из-за этого только проблемы были.

    3) В новых проектах, держите в голове полученные по шаблонам знания - вдруг пригодятся.

    В конечном итоге, знаете ли вы паттерны, или нет - с опытом приходит понимание того, какая архитектура будет правильная, а какая - нет. Как сделать удобно, а как нет. И неважно, какими паттернами это обозвать.

    Я даже пожалуй посоветовал бы подойти к освоению айтишной архитектурной мудрости с другой стороны - со стороны нефункциональных требований или так называемых "-ilities" - их много. Тут вот описаны 7 штук. А вообще их десятки.

    Среди прочих - такие как maintainability (простая поддержка кода), scalability (масштабируемость), extensibility (расширяемость), availability (устойчивость ) и тп. Если, проектируя свое приложение, вы задумываетесь об этих "илитях" и стараетесь их обеспечить в необходимом проекту объеме, то, как правило, ваше приложение будет иметь отличную архитектуру. При этом шаблоны проектирования в ней появятся лаконично сами собой.

    Поскольку идея использовать шаблоны - это попытка опытных программных инженеров дать десяток готовых рецептов менее опытным, чтобы пока они не научились варить "вкусную кашу", они не варили уж что-то совсем несъедобное. :) Учитесь "готовить", разбирайтесь в -ilites :) и все будет хорошо
    Ответ написан
    6 комментариев
  • Зачем нужен RESTful API?

    @marazmiki
    Укротитель питонов
    Вы вот тут про REST пишите, а имеете в виду, вероятно, django-rest-framework (лучшее, на мой взгляд, существущее решение для организации RESTful API для джанги).

    Для начала ответьте себе на вопрос: а нужен ли вообще API Вашему сайту. Если объективно нужен (например, с сайтом взаимодействует мобильное приложение, причём не только читает данные, но и отправляет; или фронтэнд построен таким образом, что от сервера требуются только данные, а отрисовка HTML происходит на клиенте; или Вы предоставляете информацию "неживым" пользователям — роботам), то RESTful API хороший выбор. И DRF, соответственно, тоже.

    Если всего этого нет и Вас вполне устраивает схема, когда бэкенд генерирует весь HTML и отдаёт его клиенту, то DRF, REST, да и вообще API в целом не нужны.
    Ответ написан
    1 комментарий
  • ООП - нормальная ли это практика вызывать родительский конструктор каждый раз при создании потомка?

    Adamos
    @Adamos
    Без реального использования этих классов говорить не о чем. Может быть, логичнее будет такой родитель:
    abstract class Widget
    {
        protected $template;
    
        public function __construct() 
        {   }
    
        public function setTemplate(string $template)
        {
            if (!file_exists($template)) {
                throw new \Exception('Widget template "' . $template . '" was not found.');
            }
    
            $this->template = $template;
    
            return $this;
        }
    
        abstract public function render(TemplateService $templateService, Client $client) : string;
    }
    Ответ написан
    Комментировать
  • ООП - нормальная ли это практика вызывать родительский конструктор каждый раз при создании потомка?

    leha_gorbunov
    @leha_gorbunov
    Программист
    Ну так и убери из TestimonialWidget конструктор если он только родителя вызывает.

    class TestimonialWidget extends Widget
    {
       public function renderWidget() : string
        {
            $testimonials = [[
                'name' => 'John Snow',
                'text' => 'Test'
            ]];
    
            return $this->templateService->render($this->template, [
                'testimonials' => $testimonials
            ]);
        }
    }


    Потом вызови
    $widget = new TestimonialWidget($templateService, $client);


    Угадай какой конструктор будет вызван ?
    Ответ написан
    1 комментарий