• Уйти от jQuery к Svelte, без боли
    0
    А чем svelte:window on:load лучше просто window.onload?

    я не эксперт по Svelte, чем лучше сказать не могу.
    Как он сработает, если до этого

    события в JS работают одинаково, всё что на событие повешаешь всё будет вызвано.
    Как я писал выше знающие люди советуют использовать метод onMount(), у в итоге через этот метод реализовано.
  • Ок, Гугл, «спасибо» за новый автомобиль
    0
    Пользуюсь Call Recorder, Android 8, запись включается не в момент дозвона, а ровно через 30 секунд после начала набора, потому что да, Гугл запретил приложениям на прямую работать с телефоном, поэтому приложение не в курсе что там со звонком происходит, но доступ к динамику и микрофону имеет.
  • Уйти от jQuery к Svelte, без боли
    0
    Статья не о том как проект переписать, статья о том как привычный инструмент jQuery заменить на другой инструмент — Svelte.
    на кой там вообще нужен %любой_новый_модный_фреймворк%?).

    мне например очень нравиться компонентный подход, мне нравиться идея библиотеки визуальных компонентов пользовательского интерфейса, хотя бы ради этого, что бы меньше копипастить и больше включать зависимостей в проект, что бы любой проект был набором «плагинов», а не набором файлов скопированных из предыдущего проекта.
    В коментах выше спрашивали в чём выгода смены отработанного инструмента на новый? у нового инструмента очень клёвая фишка — не надо знать магию CSS селекторов, в разметке не надо расставлять бесконечные id, с новым инструментом пишешь шаблон и в нужных местах появляется нужная информация, использование Svelte экономит время.
  • Уйти от jQuery к Svelte, без боли
    +1
    Из любви к особому пути я решил осваивать не проверенный миллионами разработчиков Angular/React/Vue, я решил попробовать Svelte.

    Что бы принять решение об использовании чего то надо знать плюсы и минусы, для этого надо с технологией познакомиться.
    Это учебный код.
  • Уйти от jQuery к Svelte, без боли
    0
    нельзя просто Jquery вместо $ использовать?

    Можно конечно, но не нужно, в качестве временного решения меня устраивает window.$

    То что документация по второй версии я это заметил по адресу страницы, поменял двойку на тройку — страница не найдена, поэтому я решил что это актуальная документация. Плюс на странице с документацией ни где не стоит ни версия ни дата.
    И если посмотреть в учебник, то там в примерах есть
    <svelte:window/>
    

    В телеграм канале русскоязычного сообщества, мне посоветовали onMount использовать, работает аналогично.
  • Типобезопасная работа с массивами PHP
    0
    спасибо
  • «Красная» корпоративная культура — главная проблема российского бизнеса (Часть 3)
    +1
    Для программистов конечно зелёная культура это то что надо, а вот думаю строителям лучше не отходить от традиций синей культуры.
    Мне эффективность культуры зависит от характера бизнеса, будут ли плюсы от свободы творчества?
    Многие области деятельности достаточно механические, по крайней мере на самом нижнем уровне.
    Лидер должен быть творческим, его подчинённые исполнительными, а подчинённые подчинённых уже как придётся, где то от их вопросов и предложений может быть польза, а где то всё настолько продумано что линейным исполнителям уже не чего добавить в процесс.
    Если только руководитель среднего звена после повышения квалификации или другого семинара / конференции предложит что то поменять.
  • Спецификации на стероидах
    0
    www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/filters.html
    Я думаю в самой Докритн ОРМ побогаче этот функционал, не знаю почему тут так скромно описано.

    И есть же LINQ to SQL, делаете метод, который принимает формируемое условие, что то в это условие добавляет и выдаёт что получилось — прямо так и задумано использовать LINQ, потом из сфомированного выражения LINQ генериться SQL, при этом строиться дерево выражений и конечно оно упрощается, ещё в далеком 2013 оно это умело и умело хорошо (по мнению некоторых более чем я прошаренных товарищей).
  • Спецификации на стероидах
    0
    У ORM может быть такая фишка как предопределённые части запросов, рассматривали такую возможность?
    Что то типа того что автоматом (через вызов специально написанного метода совместимого с ORM) добавлять к запросу «is_hidden = 0» или «user.active = 1», и при формировании SQL ORM дубли отсечёт и нужные альясы подставит.
  • Comment from a drafted post.
  • Comment from a drafted post.
  • «Красная» корпоративная культура – главная проблема российского бизнеса (Часть 2)
    0
    +1, спасибо за статью.
  • Comment from a drafted post.
  • Решение типовых проблем с json_encode (PHP)
    0
    нет лишний кавычек, и как следствие смотреть consil.log приятней, нет сплошной каши из строк, но вообще это был разбор конвертации, вы если не сталкивались, т овам конечно сложно понять в чём боль.
  • Решение типовых проблем с json_encode (PHP)
    +1
    Спасибо за статью, не знал про JSON_UNESCAPED_UNICODE и JsonSerializable, последние вообще красота, по АПИ надо отдавать объекты, которые предназначены только для чтения и конечно у них все свойства приватные, раньше приходилось писать собственный toJson(), а теперь всё ясно что делать:
        public function jsonSerialize() 
        {
            $fields = get_object_vars($this);
            // что-то делаем ...
            return $fields;
        }
    


    Совет использовать функцию get_object_vars($this) я в своё время нагуглил, а про JsonSerializable узнал только из вашей статьи. спасибо.
  • Помощник по работе с базами данных GreenPig
    0
    очень сложный велосипед, с ним не получиться так что бы «сел и поехал», поэтому без тонны обучающего материала ни кто не будет пользоваться этим решением если сталкивается с подобной задачей впервые.
    За статью спасибо.
  • Длинная история путеводителя — как я 5 лет писал сервис для умных пешеходных маршрутов
    0

    Про маштабирование на другие города не понятно в чём трудности. По идее надо распарсить гео данные из OSM или что то еще? Или описания достопримечательностей необходимы и забиваются в ручную?
    Тогда понятно. Но можно в самом приложении дать возможность пользователям заводить свои тексты.
    Дать людчм карту и пусть сами контент добавят, я думаю это выход.
    Вопрос только в наполнеии базы на сервере. Но пара гигов под каждый город это наверное не очень дорого ?

  • Основа любого программирования на… пазлах
    +1
    +1
  • Игра в собеседование
    0
    У каждого конечно свой жизненный опыт.
    Я ни когда в жизни не работал на «бегемота», мои работодатели это всегда «нано-конторы».
    Иногда мне приходилось искать «тёлок», и да иногда это были очень коротки проекты на два месяца. Но даже в такой ситуации у нано конторы каждый боец на счету и идти в «бой» с «предателем» чревато «поражением». Ты ему поручишь, он не справиться, а у тебя времени за ним доделать уже нет, ты и так 12 часов в день пишешь код и тестируешь.
    Ваши рассуждения совершенно справедливы для больших контор, но есть исключения.
    И статья про стратегию найма, а не про рынок.
    У каждого игрока своя стратегия, да.
  • Создание игр и видео на YouTube. Мой эксперимент взаимодействия и доход от этого
    0

    Автор пиши ещё !

  • Игра в собеседование
    0
    Мне кажется у каждого кандидата и компании свои 100 вопросов для собеседований, общий список 100 вопросов интересен для оценки компании или кандидата в целом, что бы понять что кандидат / компания из себя представляет, но общий список не даёт на вопрос насколько кандидат/компания соответствует потребностям и главное возможностям кандидата / компании.
    Другое дело что компании / кандидаты хотят примерно одного, и можно их разбить по кластерам, но таких кластеров требований будет не парочка штук, а пара десятков.
  • Почему мне нравится PHP?
    0

    За что я люблю PHP.
    Во первых я его не люблю. Я на нём пишу.
    Чем он хорош? Хорош обилием готовых решений и готовыми ответами на любые вопросы.
    Чем ещё хорош? Хорош тем что можно писать хоть что и хоть как.
    Хочу пишу спагетти код, хочу блюду SOLID и проверку типов.
    Можно накидать прототип, отработать идею, всё выкинуть и после этого написать с ноля и написать хорошо. И всё это на одном языке.
    PHP даёт свободу творчества. И эта свобода как и любая другая накладывает ответственность.
    Нет плохих инструментов, есть неподходящие. PHP это только инструмент, а ответственность на том кто этим инструментом работает.

  • Прекратите использовать Else в ваших программах
    –3
    Есть разные подходы к отладке, и у нас с вами они отличаются, поэтому мы пишем разный код.
    Я стреляюсь каждый раз когда мне приходиться отлаживать код, который вы приводите в качестве примера.
    Вот комент под этой статьёй, который я сто процентов поддерживаю, человек знает о чём речь.
    В функции должен быть один ретурн, любые выражения должны быть вычислены до того как результат вычисления будет передан в какой либо оператор или функцию, что бы во время дебага видеть вычисленные значения, а не только результат их применения. Надо понимать что ты передаёшь в if().
    Надо понимать что ты передаёшь в функцию. Надо вообще понимать с какими значениями работает твой код, без дополнительных телодвижений, когда мы передаём в if() выражение во время отладки мне придётся делать eval() средствами IDE что бы понять что уйдёт в if(), для операций чтения из «стрима» это не идемпотентная операция.
    Для highload это наверное не оптимальный подход, но я не highload программирую и не на асемблере пишу, для меня на первом месте моё удобство как разработчика.
    PS
    Вы в коде 100500 фэйлов расставили, но по бизнес логике это не фейлы, это «легковесное» логирование для отладки, если какой то кусок кода выполнять не надо, то это флагами разруливается.
  • Прекратите использовать Else в ваших программах
    0
    ок, класс не получил состояние.

    $construct->isConstructFound()
    $properties->get_published()

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

    метод CIBlockElement::SetPropertyValuesEx() точно сможет обработать новые $properties, которые теперь умеют get_published()?

    вообщем я же не говорю что тут не чего рефакторить, просто не за 5 минут это делается, поэтому я не стал на это время тратить. И сейчас время тратить не хочу.
  • Прекратите использовать Else в ваших программах
    –1
    разные проекты разное качества кода, мне это каждому тут повторять? если вы не согласны, то это ваше личное дело.
    У меня попросили пример кода без ветвлений, привёл пример кода, у меня просили пример идеального кода? нет. Какие ко мне претензии? вы за контекстом не следите, а я в контексте отвечаю.
  • Прекратите использовать Else в ваших программах
    –2
    я тоже могу повториться:
    Хороший пример как можно писать без ветвлений.

    В это коде очень много условий, но нет ни одного значимого ветвления.

    С другой стороны если у вас на рефакторинг ушло 15 минут, то о чём речь? это не показатель того что это не спаггети код? Вы в каждый метод отдаёте всего две переменные, и только один раз приходиться отдать три, что ещё надо для счастья?

    Из минусов: в результат вашего рефакторинга появилось состояние у класса, но бог с ним, если вы считаете это допустимым.
  • Прекратите использовать Else в ваших программах
    –1
    Всё просто, это спагетти код.

    Которым местом? Что такое спаггети код? Это когда у нас переменные используются в неожиданных местах кодовой базы. Где тут такое?
    Все переменные используются там где они объявлены, переменные хорошо локализованы.
    приходит новый человек

    Новый человек не придёт ближайший год, а скорее вообще ни когда не придёт. Это заказная разработка в очень сжатые сроки, у людей была задача и мы эту задачу решили, и процессы у них не поменяются ближние пять лет точно.
    Какая причина менять код? Причина в том что в вашем опыте код переписывается переписывается и переписывается? не надо думать что везде как у вас, то есть думайте что хотите конечно, но когда я что то делаю, я делаю это под условия заказчика, а не под свои представления о прекрасном.
    Откуда он узнает что какие-то переменные используются только в ограниченном месте

    Я пользуюсь Штормом, я ставлю курсор на переменную и Шторм мне подсвечивает в боковой панели все строки кода где эта переменная используется, если вы так не можете то сделайте поиск, это умеют все редакторы, но например когда я копаюсь в исходниках Битрикса мне приходиться смотреть использование переменных поиском, потому что там весь скролл бар в варнингах и отметки использования переменной не видно.
    и какие из них можно переиспользовать и не будет ли конфликтов?

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

    Условия задачи заметили? время на написание и полную отладку одни сутки. При чём на старте у тебя просто «Нужен метод для Публикации одной рекламной конструкции», что это означает? а вот пойди разберись. В итоге выяснилось что надо сделать иногда 4 операции, а иногда 8. Тут с постановкой фиг пойми что и как, а вы хотите ещё и проектирование кода в шоколаде получить. Нет у меня лишнего часа на декомпозицию этой простыни на 4-8 методов.
    Заработало и ура в бэклоге ещё тонны не реализованных требований.
    Но вы же этого не знаете, и из своего опыта меня судите, адекватно это?
    Не знаю броду, не суйся в воду, но вы конечно свободны сделать по своему :)
  • Великий порноэксперимент: история Интернета для взрослых
    +2
    статья о научном исследовании, или для науки есть запретные темы?
  • Прекратите использовать Else в ваших программах
    –2
    Код предельно гранулирован, шаги можно легко менять местами, можно выкидывать, можно добавлять новые, для этого надо только подправить проверку до вставки кода и поправить проверку после вставки кода.
    Учитывая что проверки на флагах, сделать это легко.

    Скажите пожалуйста, что вас не устраивает в этом коде?
    Количество строк в методе?
    ок, код не декомпозирован и на то есть причины, описанные в моих коментах, что следующее?
    Использование статических методов?
    это методы Битрикса, мне свою обёртку на них написать надо?

    Что вам ещё не по душе? давайте проведём код ревью, с учётом того что на метод и его полную отладку у нас одни сутки, выйти за этот бюджет времени нельзя.
  • Бот на нейросетках: как работает и учится виртуальный ассистент
    0
    +1
  • Прекратите использовать Else в ваших программах
    –3
    Хороший пример как можно писать без ветвлений.
    Понятно что его можно декомпозировать на 4 части, но я тут не учу SOLID-у, вот даже такой стиль написания кода он сам способствует декомпозиции, сделали — проверили, сделали — проверили, каждую пару выполнения шага и обработки результата можно в отдельный метод кидать. Но.
    Началось всё с того, что товарищ попросил пример кода, я ему пример кода привёл, понабежали чудаки которые стали судить код вообще с других позиций, смотреть на него со своей колокольни, развели оффтоп, а минусов я отхватил :)
    Если кто то не понимает что такое эффективность, что такое требования по качеству и требования по времени разработки, то успехов этим людям с производством ПО.
  • Прекратите использовать Else в ваших программах
    0
    Для себя я пилю два проектика и там у меня код коверэйдж 100%.
    При чём во втором строчек побольше чем в этом и логика поинтересней.
  • Прекратите использовать Else в ваших программах
    –4
    Для условно линейного кода тесты написать попроще чем для кода с вложенными ветвлениями.
    И конечно покрытие тестами в помощь.
    Конкретно этому коду от силы две недели, при чём в прошлую пятницу заказчику показали релиз, и всё понравилось, а в четверг мы подписываем акт приёмки и ни какой дальнейшей разработки не будет.
    Смысл тесты писать? для фирмы которая через *цать лет наш код будет дорабатывать? благородное конечно дело, но мой директор не одобрит.
  • Прекратите использовать Else в ваших программах
    0
    Особенно когда исполняешь работы по гос контракту, а в гос закупке чёрным по белому написано с использованием Битрикс Управление Сайтом.
    И ты ещё такой в курсе что закупку уже один раз провели, но прошлый раз разработчики сделали без Битрикса, и у них работу просто не приняли как не соответствующую ТЗ, поэтому закупку провели повторно.
    И ты такой директору говоришь «Битрикс это антипаттерн, не будем его использовать» :)
  • Прекратите использовать Else в ваших программах
    –1
    Для меня фишка в отладке, когда делаешь дебаг просто ставишь брейк поинт на единственный ретурн в коде и жмёшь F5 и тебе не надо проживать на каждую строчку кода F10 в ожидании ого что сработает какой то ретурн и ты даже не узнаешь почему и что функция / метод вернули в вызывающий код.
    Другое удобство в том что бы не прожимать весь код, а нажать F5 и после этого пробежаться глазами по флагам и значениям переменных и быстро понять что к чему, успешно ли отработал код, или были ошибки и тут же посмотреть что функция возвращает.
    Мне удобно когда ретурн только один, и меня не смущает использовать флаги, что бы не исполнять код который при «ошибках» исполнять не надо
  • Прекратите использовать Else в ваших программах
    –16
    Какой бы сложности пример не был, на каждую проверку заводим флаг ($flag) и проверяем. Слова «каждую» не надо понимать буквально, можно один и тот же флаг проверять по 10 раз, можно его переиспользовать.
    $flag = proverka1();
    if(!$flag){ /* если не выполнилась проверка 1 */}
    $flag2 = false;
    if($flag) { /* делаем шаг 1 */ $flag2= proverk2();}
    if($flag1 && !$flag2){ /* если должны были сделать шаг 1 , но проверка 2 не прошла */}
    if($flag2){ /* делаем шаг 2, потому что проверка 2 успешная и потому что сделали шаг 1 */}
    

    Ниже пример боевого кода, из которого убрана большая часть логики, но оставлен скелет из if-ов, как видите код без ветвлений совершенно и все проверки на флагах.
        public function publishOne($identity)
        {
            $output = ['success' => false];
    
            $response = CIBlockElement::GetByID($identity);
            $isReadSuccess = BitrixOrm::isRequestSuccess($response);
            if (!$isReadSuccess) {
                $output['message'] = 'Fail request construction';
            }
            $construct = false;
            if ($isReadSuccess) {
                $construct = $response->Fetch();
            }
            $isConstructFound = BitrixOrm::isFetchSuccess($construct);
            if ($isReadSuccess && !$isConstructFound) {
                $output['message'] = 'Construction not found';
            }
            $isExistsChild = false;
            if ($isConstructFound) {
                $response = CIBlockElement::GetList([], $filter,
                    false, false, $select);
                $isExistsChild = BitrixOrm::isRequestSuccess($response);
            }
            $child = false;
            if ($isExistsChild) {
                $child = $response->Fetch();
            }
            $gotChild = BitrixOrm::isFetchSuccess($child);
            $childId = 0;
            $childPermit = 0;
            $gotPublicPermit = false;
            if ($gotChild) {
                $childId = $child['ID'];
                $childPermit = $child['PROPERTY_PERMIT_OF_AD_VALUE'];
                $gotPublicPermit = !empty($childPermit);
            }
            $isSuccessDelete = false;
            if ($gotPublicPermit) {
                $isSuccessDelete = CIBlockElement::Delete($childPermit);
            }
            if ($gotPublicPermit && !$isSuccessDelete) {
                $output['message'] = 'Fail delete published permit;';
            }
            if ($gotPublicPermit && $isSuccessDelete) {
                $output['message'] = 'Success delete published permit;';
            }
            if ($gotChild) {
                $isSuccessDelete = CIBlockElement::Delete($childId);
            }
            if ($gotChild && !$isSuccessDelete) {
                $output['message'] = 'Fail delete published permit;';
            }
            if ($gotChild && $isSuccessDelete) {
                $output['message'] =  'Success delete published permit;';
            }
            $source = [];
            $published = 0;
            if ($isConstructFound) {
                $source = $construct;
                $published = (new CIBlockElement())->Add($construct);
            }
            $hasCopy = !empty($published);
            if ($isConstructFound && !$hasCopy) {
                $output['message'] =  ' Fail copying of construction;';
            }
            $values = [];
            if ($hasCopy) {
                $output['success'] = true;
                $output['message'] = ' Success copying of construction;';
    
                CIBlockElement::GetPropertyValuesArray($values,
                    $source['IBLOCK_ID'], $filter, [],
                    ['GET_RAW_DATA' => 'Y']);
            }
            $gotValues = !empty($values);
            if ($hasCopy && !$gotValues) {
                $output['message'] = ' Fail read construction properties';
            }
            $properties = [];
            if ($gotValues) {
                $values = current($values);
                foreach ($values as $key => $value) {
                    if (!empty($value['VALUE'])) {
                        $properties[$key] = $value['VALUE'];
                    }
                }
                $properties['original'] = $identity;
            }
            $answer = null;
            $hasPermit = !empty($properties)
                && !empty($properties['permit_of_ad']);
            if ($hasPermit) {
                $permitId = (int)$properties['permit_of_ad'];
                $answer = CIBlockElement::GetByID($permitId);
            }
            $hasAnswer = !empty($answer) && $answer->result !== false;
            if ($hasPermit && !$hasAnswer) {
                $output['message'] =  'Fail read permit';
            }
            $permit = [];
            if ($hasAnswer) {
                $permit = $answer->Fetch();
            }
            $publishedPermit = 0;
            $gotPermit = !empty($permit) && $permit !== false;
            if ($gotPermit) {
                $publishedPermit = static::copyElement($permit,
                    $this->pubPermits);
            }
            if ($gotPermit && empty($publishedPermit)) {
                $output['success'] = false;
                $output['message'] = 'Fail copying of permit';
            }
            if ($gotPermit && !empty($publishedPermit)) {
                $output['message'] = ' Success copying of permit';
            }
            if ($gotPermit && !empty($publishedPermit) 
                && !empty($properties)) {
                $properties['permit_of_ad'] = $publishedPermit;
            }
            if (!empty($properties)) {
                CIBlockElement::SetPropertyValuesEx($published,
                    $this->pubConstructs->getBlock(),
                    $properties, ['NewElement' => true]);
            }
            return $output;
        }
    
  • Размер имеет значение
    +2
    «фреймворки не нужны поэтому мы используем in-house аналог»
  • Типобезопасная работа с массивами PHP
    0
    спасибо
  • Типобезопасная работа с массивами PHP
    0
    Коллега молодец, и вам спасибо за ссылки.
    Но не всегда такие линейные переливания из пустого в порожнее.
    Конечно для каких то случаев отличное решение.
  • Типобезопасная работа с массивами PHP
    0
    Данная библиотека помогает мне распарсить ответ API или какого либо метода, когда такой ответ представляет собой массив (обычно с вложенными массивами).
    С DTO я редко заморачиваюсь, а если заморачиваюсь, то задаются свойства DTO через сеттеры (делаем прототип), потом это DTO отдаётся в конструктор и получаем наконец DTO без сеттеров, то есть изменить состояние не получиться даже если очень захочется.
    И конечно само DTO из методов имеет только геттеры, вся бизнес логика в других классах.
    Передачу параметров через массивы не практикую, потому что это сводит на нет статический анализ, я использую или DTO, или строго заданные типы параметров в методах.