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

    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 комментариев
  • Рекурсия в Ruby. Как реализовать?

    @SilentFl
    Мусье желает странного ))
    def walk_tree(root_id)
      root_item = Distinct.find(root_id)
      items = Distinct.where(parent_id: root_item.id)
      items.each { |item| walk_tree(item.id) }
    end

    Если модель лежит в базе - то будет куча запросов, от этого избавиться можно сразу прочитав все записи в хеш, и искать по нему
    Ответ написан
    Комментировать
  • Как в Ruby on Rails проверять скрипты на скорость?

    Читай документацию по Benchmark.realtime.
    ruby-doc.org/stdlib-2.0.0/libdoc/benchmark/rdoc/Be...
    Ответ написан
    Комментировать
  • Как провести рекурсию?

    inf
    @inf
    DevOps Engineer
    Гуманнее так
    def recurs(category_id)
        list << category_id
        Category.where(parent_id: category_id).each do |category|
          recurs(category.id)
        end
        list
      end


    @list = recurs(7)
    Ответ написан
    3 комментария
  • Как в Ruby on Rails убрать (unscoped) скоупы у всех связанных?

    @Fusion23
    Я бы посоветовал никогда не использовать default_scope, это может принести еще кучу проблем в будущем при масштабировании, увлечения сложности поведения модели и пр., а по-крайней мере создать концерн со скоупомами :undeleted, :deleted, и подгружать уже объекты используя необходимые скоупы. Для удобства подгрузки объектов в контроллерах могу порекомендовать гем has_scope https://github.com/plataformatec/has_scope где по умолчанию можно задать применять скоуп :undeleted, и в целом управлять поведениями всех скоупов)
    Ответ написан
    Комментировать
  • Как в JS округлять число, если после запятой идут нули?

    @Ridz
    number*10/10
    Ответ написан
    Комментировать
  • Как включить тесты в Ruby on Rails?

    Dem1
    @Dem1 Куратор тега Ruby on Rails
    Ruby on Rails developer
    Отредактируйте application.rb
    Раскомментировать / Добавить:
    require "rails/test_unit/railtie"

    Удалить:
    config.generators.system_tests = nil
    Ответ написан
    Комментировать
  • В чем причина ошибки в PHP7?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Не вижу необходимости помещать свойство объекта/класса в дополнительную переменную. Вместо:
    $st = $item->timestamp;
    if(time() < $st){

    достаточно:
    if( time() < $item->timestamp ) {

    2. В PHP exit - это конструкт, и если в него не передается параметр, скобки необязательны (принято не указывать их): вместо exit(); достаточно exit;

    3. Для выхода из цикла необходимо использовать break. Разница в том, что exit прекращает выполнение скрипта вообще, break - только выходит из цикла, прекращая дальнейшие итерации:
    if( time() < $item->timestamp ) {
        break;
    }


    4. Возможно, вам вообще нужно просто прекратить логику в текущей итерации и перейти к следующей итерации (скипнуть текущий элемент в итерации) - для этого есть continue:
    if( time() < $item->timestamp ) {
        continue;
    }
    // тут остальная логика в итерации цикла, 
    // при выполнении условия и вызове continue; эта логика для текущей итерации не будет выполнена, 
    // произойдет переход к следующей итерации цикла
    ...


    5. Уточните, вам таки из цикла выйти надо (перестать проверять данные в следующих итерациях), или же прекратить выполнение всего скрипта?

    6. Что касается "почему такая конструкция не работает":

    – ваш дамп, это значения $item->timestamp?
    – вы уверены что условие проверки верное, в вашем коде текущий unix timestamp должен быть меньше $item->timestamp, то есть последний должен содержать timestamp в будущем. Рискну предположить, что на самом деле вам необходимо:
    if( $item->timestamp < time() ) {
        continue;
    }
    Ответ написан
    Комментировать
  • С чего начинается создание механических штуков на электронике, микроконтроллерах?

    @poznawatel
    начинающий разработчик ЧПУ
    Начинать лучше с этого проекта: micropython.org
    1. Барьер входа по созданию электромеханического устройства - на уровне среднего школьника средних классов, проект хорошо документирован на русском: micropython-ru.readthedocs.io/ru/latest
    2. Мощный 32-битный микроконтроллер, годный не только "поиграться".
    3. В их магазинчике продаётся всё нужное на первое время.
    Ответ написан
    Комментировать
  • Есть ли смысл тестировать валидации моделей в Ruby on Rails?

    c3gdlk
    @c3gdlk
    Ментор в http://rubyboost.ru/
    Вам не надо тестировать фреймворк. Т.е например в тесте на валидацию на presence не надо проверять что и пустую строку отработает и nil отработает и еще что-то. Но, какой-то тест все равно должен быть, потому что если другой программист удалит эту валидацию - где-то 100% должен упасть тест. Если ее надо было удалять, разработчик удалит и тест, если он случайно удалил - тест упал, он починил. Тесты для этого и нужны - для командной работы и возможности менять код.

    Рспеком очень легко тестировать рельсовые стандартные валидации, гем shoulda
    Ответ написан
    Комментировать
  • Как лучше BDD'ить с Rspec'ом?

    Fahrenhe17
    @Fahrenhe17
    Ruby on Rails developer
    Все, что написано ниже - сугубо субъективно и за чистую и единственную истину ни в коем случае воспринимать все не нужно.

    1. Что тестировать?
    Вопрос очень холиварный. Правда. Лично я делаю в бОльшем кол-ве integration tests, т.е. тестируется то, что видит пользователь. к тестам API это конечно не относится. Но так же тестирую более-менее сложные actions в контроллере. Так же я не тестирую простые валидации.
    Вывод: Для начала лучше тестировать каждый байт трафика между пользователем и сервером. Просто что-бы привыкнуть к тестам. Что-бы написать тест занимало меньше времени, чем любой, самый простой кусок кода в приложении.

    2. Название блоков.
    Скажу двумя словами от себя и вот ресурс. Там где-то в начале об этом вроде говорится.
    От себя - пишите названия так, что-бы при команде
    rspec --format documentation
    вам выводились более-менее связные предложения.

    p.s. Очень рекомендую главу RSpec из этой книги.

    Наверняка я ошибаюсь в чем-то и гуру рельсов меня поправят. Я буду только рад. :)
    Ответ написан
    Комментировать
  • Используются ли паттерны-проектирования при написании бизнес-логики в MVC-фреймворке?

    qonand
    @qonand
    Software Engineer
    Вот я думал, что в фреймворках уже ты не можешь писать паттерны-проектирования, так как ты уже пишешь в MVC-паттерне, но услышал что можно и других использовать.

    Без разницы используется ли MVC или нет, это такой же паттерн как и остальные. А практически любые паттерны можно комбинировать. Поэтому использовать можно и нужно (если есть необходимость)
    Так ли это и какие обычно используются?

    Паттерн это готовый способ решения какой-то задачи. Соответственно какой паттерн где использовать зависит только от задачи.
    Ответ написан
    Комментировать
  • Зачем нужно установить Sphinx на компьютер, если ты его пишешь в Gemfile (Ruby on Rails)?

    DevMan
    @DevMan
    в геме только адаптер для работы с сфинксом, и, ясен пень, что нужен и сам сфинкс.
    Ответ написан
  • Поздно ли покрыть тестами (Rspec) проект, который уже давно реализован?

    Поздно, но лучше иметь хоть какие-то тесты чем не иметь их вообще.
    Покрыть тестами можно ключевые места и расширять тесты по необходимости.
    Ответ написан
    2 комментария
  • Зачем в RoR протестировать статические страницы на Rspec?

    xpert13
    @xpert13
    Full Stack Developer
    В результате рефакторинга кода страница может быть удалена, запуск теста это выявит и даст возможность оперативно исправить.

    Зачем такое писать, если можно просто открыть страницу и убедиться?

    С таким подходом зачем вообще тесты? Вы ведь можете любой функционал проверить вручную.
    Ответ написан
    1 комментарий
  • Как в url ссылки добавить продолжение без полного указания?

    BuriK666
    @BuriK666
    Компьютерный псих
    нет
    Ответ написан
    Комментировать
  • Стоит ли изучать паттерны проектирования, если ты всю жизнь будешь писать на фреймворках?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Фреймворки это просто каркас. Чтоб все это сооружение имело смысл, в нем должна быть бизнес-логика. И вот там-то паттерны как раз нужнее всего.
    Ответ написан
    2 комментария
  • При сборке Vue 2 создается App.vue, а он подключается к main.js. Что лучше выбрать для главного входа?

    gennadiy403
    @gennadiy403
    Во vuejs нет "основного кода" . Весь функционал реализуется через компоненты, дерево которых начинается импортироваться с файла App.vue. И никак иначе, никак не лучше, только так)
    Ответ написан
    Комментировать
  • При сборке Vue 2 создается App.vue, а он подключается к main.js. Что лучше выбрать для главного входа?

    @Artem0071
    Безработный mr. Junior
    Всякие подключения библиотек, роутов и компонентов делайте в main.js.
    App.vue - это просто обычный компонент (не совсем обычный конечно, но как точка входа для остальных компонентов)
    index.html - не трожь. Ну или можно внешние скрипты подключить
    Ответ написан
    Комментировать