easydev
easydev
  • Видео 95
  • Просмотров 247 956

Видео

Цикломатическая сложность кода. Как её снизить?
Просмотров 29 тыс.Месяц назад
#javascript #typescript 00:00 Что такое цикломатическая сложность 01:44 Пример расчёта цикломатической сложности 03:38 Рефакторинг функций 06:25 Early return 07:43 Подходы функционального программирования 11:04 Hash tables 12:52 Тернарный оператор 13:40 Полиморфизм 19:15 Value objects 25:04 State pattern Code: github.com/easydevgit/cyclomatic-complexity/
Next.js 14 App Router #12 - Server Actions на примере
Просмотров 1,5 тыс.4 месяца назад
#nextjs13 #nextjs14 #server_actions Видео о useTransition ruclips.net/video/hWUlv7M7rR8/видео.html 00:00 Что такое Server Actions 02:24 Мини-проект для тестов 03:19 Как было бы без Server Actions 04:42 Первый Server Action 09:20 Устанавливаем Prisma 14:16 Получаем данные с помощью prisma 16:57 Сохраняем данные с помощью prisma 19:20 Ревалидируем кэш 21:10 Используем клиентский компонент для фор...
Принципы работы с потоковыми данными в JS
Просмотров 1,2 тыс.4 месяца назад
#javascript #js 00:00 веб и данный в потоке 01:52 Promise 06:25 Promise и рекурсия 08:19 async/await 09:33 итераторы 13:38 генераторы code: gist.github.com/easydevgit/d6b29f43b0a5d3eda68cf08259276220
Vue.js современные возможности. onRenderTriggered, onRenderTracked, onErrorCaptured
Просмотров 6834 месяца назад
#javascripttamil #typescript #vuejs 00:00 onRenderTriggered 03:59 onRenderTracked 05:18 effect 06:29 onErrorCaptured
Next.js 14 App Router #11 - Стриминг
Просмотров 2,2 тыс.7 месяцев назад
#nextjs13 #nextjs14 #typescript 00:00 файл loading.js 02:48 dynamic настройка 04:36 эмулируем задержку на уровне страницы 05:35 использование файла loading.js 07:21 что такое стриминг 10:26 эмулируем задержку на уровне компонента 13:17 используем suspense 15:22 добавляем fallback у suspense 17:31 задаём порядок отображения используя suspense Code: github.com/easydevgit/next-13-course/tree/maste...
Function overloading. Как работают
Просмотров 7037 месяцев назад
#typescript #ts #javascript 00:00 для чего нужны function overloading 02:49 пример перегрузки функции с параметрами различных типов 05:31 пример перегрузки функции различным количеством параметров 06:11 функция не всегда работает как ожидается 07:45 как можно оптимизировать function overloading дженериками Code: gist.github.com/easydevgit/45b4e38e62f6ea22cc0b4812840a916f
Произведение массива кроме самого элемента
Просмотров 3638 месяцев назад
#js #algorithms #javascript leetcode.com/problems/product-of-array-except-self/description/ Code: gist.github.com/easydevgit/2d277567cbd68c773cbdeae51dcd51ed
TypeScript Discriminated Unions. Для чего используются
Просмотров 5248 месяцев назад
#typescript #javascript
TypeScript compile-time и runtime проверка типов
Просмотров 6059 месяцев назад
#typescript #javascript
React пользовательские компоненты и Styled Components
Просмотров 6509 месяцев назад
#reactjs #typescript #styledcomponents Repo: github.com/easydevgit/react-styled-custom-component
Next.js 14 App Router #10 - 10 возможных недопониманий
Просмотров 10 тыс.10 месяцев назад
#nextjs13 #nextjs14 #typescript 00:00 Начало 01:10 Можно ли на Next.js делать full-stack приложения? 03:39 Клиентские компоненты выполняются только на клиенте? 04:42 Как ещё можно сделать компонент клиентским? 08:36 Использовать серверные компоненты или клиентские? 10:10 Как добавить серверный компонент в клиентский? 13:20 В children в клиентском компоненте могут ли быть серверные компоненты? 1...
Vue.js современные возможности. toRef, toValue
Просмотров 1,6 тыс.10 месяцев назад
#vue #javascript #typescript #vuejs 00:00 что такое toRef и toValue 03:01 пример composable 08:15 добавляем toValue в composable 09:47 как сохранить реактивность пропсов в composable 14:33 MaybeRefOrGetter тип Code: github.com/easydevgit/vue-tovalue Статья в блоге о vue 3.3: blog.vuejs.org/posts/vue-3-3 API: dummyjson.com/
Работа с состоянием во Vue и React. Computed, watch, watchEffect, useEffect, useEffectEvent
Просмотров 1,5 тыс.10 месяцев назад
#vuejs #reactjs #javascript #typescript 00:00 Начало 00:32 computed 07:18 Новое состояние в React на основе уже существующих 10:03 useMemo 10:36 watch 17:53 watchEffect 21:49 useEffect 29:39 useEffectEvent API: restcountries.com/ useEffectEvent: react.dev/learn/separating-events-from-effects#declaring-an-effect-event vuejs.org/guide/essentials/computed#getters-should-be-side-effect-free
ComponentPropsWithoutRef. React и TypeScript
Просмотров 67311 месяцев назад
ComponentPropsWithoutRef. React и TypeScript
Стабильные и нестабильные значения в React
Просмотров 86911 месяцев назад
Стабильные и нестабильные значения в React
memo vs useMemo vs useCallback в React. В чём разница?
Просмотров 3,2 тыс.11 месяцев назад
memo vs useMemo vs useCallback в React. В чём разница?
Проверка на повторяющиеся значения. Задачи с собеседований. JS
Просмотров 439Год назад
Проверка на повторяющиеся значения. Задачи с собеседований. JS
Next.js 14 App Router #9 - Кэширование
Просмотров 7 тыс.Год назад
Next.js 14 App Router #9 - Кэширование
Vue.js современные возможности. defineSlots
Просмотров 1,1 тыс.Год назад
Vue.js современные возможности. defineSlots
Next.js 13 App Router #8 - Практика. Приложение с прогресс-баром чтения
Просмотров 2,6 тыс.Год назад
Next.js 13 App Router #8 - Практика. Приложение с прогресс-баром чтения
Vue.js современные возможности. defineModel
Просмотров 3,1 тыс.Год назад
Vue.js современные возможности. defineModel
Vue.js современные возможности. defineProps
Просмотров 2,5 тыс.Год назад
Vue.js современные возможности. defineProps
JavaScript Promise (промисы). Состояния промиса
Просмотров 736Год назад
JavaScript Promise (промисы). Состояния промиса
Generic компоненты во Vue и React
Просмотров 1,5 тыс.Год назад
Generic компоненты во Vue и React
useTransition и useDeferredValue хуки в React
Просмотров 1,8 тыс.Год назад
useTransition и useDeferredValue хуки в React
Next.js 13 App Router #7 - Работа с GraphQL
Просмотров 3,4 тыс.Год назад
Next.js 13 App Router #7 - Работа с GraphQL
Как использовать keyof оператор
Просмотров 1,3 тыс.Год назад
Как использовать keyof оператор
Next.js 13 App Router #6 - Перехватывающие роуты
Просмотров 5 тыс.Год назад
Next.js 13 App Router #6 - Перехватывающие роуты
Next.js 13 App Router #5 - Параллельные роуты
Просмотров 7 тыс.Год назад
Next.js 13 App Router #5 - Параллельные роуты

Комментарии

  • @АндрейФунтов-щ9ю
    @АндрейФунтов-щ9ю 16 часов назад

    смотреть на двойной скорости. иначе он вас усыпит

  • @ТарасХомайко-к1щ
    @ТарасХомайко-к1щ 3 дня назад

    Лучшее обьяснение

  • @Sputnik134
    @Sputnik134 8 дней назад

    я запутался в примере c vue3

  • @КостяМамонтов-л9д
    @КостяМамонтов-л9д 11 дней назад

    Спасибо за контент. Очень легко воспринимается материал

  • @Emagnarium
    @Emagnarium 12 дней назад

    Хорошо раскрыл тему. Да, опустил многое, но, в целом, ревьювить код таких джунов стократ проще, а ошибок в десять раз меньше (обычно) Что опустил, если вдруг кому нинтересно: Тут не упомянуто, что подход функц.программирования, строго говоря, повышет цикломатическую сложность Не объяснил, а зачем вообще битва за чистые функции и почему на практике юзают "условно" чистые функции Не упомянуто, почему цикл это +1, а не +бесконечность (ведь из первого определения звучит так, что если есть цикл, то есть бесконечно путей пробежать по графу алгоритма) Ну и опасности использования .reduce/.map/.filter в высоконагруженных модулях системы (например, отрисовка графиков на бирже, там за цепочки пальцы отрубать должны) И да, использование тернарника (?:), равно, как использования switch ц.сложность алгоритма не снижает, а демки в первую очередь про читаемость и уменьшение вероятности ошибки Но опять таки база есть, две предметные области раскрыты. Понимание дано, а если не приплести одно к другому, то и на собесе не провалитесь.

  • @ЕкатеринаПантелеева-э9ю

    дядя спасибо вам большое вы так харашо абьяснили :3

  • @__procherk__
    @__procherk__ 13 дней назад

    В одном из видео вы сказали что тема того как работает ssg это тема для видео на несколько часов. с удовольствием послушал бы как работает Next еще более под капотом в вашем исполнении

  • @_M.i.h.a.i.l._
    @_M.i.h.a.i.l._ 15 дней назад

    Я понимаю, что видос полезный, но где в заголовке наименование языка?

  • @vividbw
    @vividbw 18 дней назад

    26:58 вы описали паттерн «Стратегия», а не «Состояние». Их легко спутать, так как диаграммы классов у них похожи. Различие между ними в том, что стратегию передает клиент снаружи (как у вас), а состоянием управляет сам объект. В случае паттерна «состояние» объекты состояний обычно хранят ссылку на контекст, чтобы переходить между состояниями, либо принимают контекст в качестве параметров своих методов (если один и тот же экземпляр состояния может использоваться разными контекстами).

  • @enosunim
    @enosunim 18 дней назад

    Как снизить цикломатическую сложность и запутать код еще больше = )))) Особенно люблю всякие ехал мап через мап, видит мап в мапе мап, сунул мап мап в мап, мап за мап мап мап! И потом клиент просит доработку, где если бы код был цикломатически сложным, т.е. на нормальных ифах и циклах, то просто вставить строчку в нужное место. А тут, надо сначала код переписать, потом вносить правку. = )))) Тоже самое касается всяких стрелочных функций, вопросиков с двоиточиями и т.д. Да где-то уместно, но универсальной пилюлей не является. Конечно те или иные подходы могут найти своё применение. Но по сути, снижение этой самой сложности это скорее оптимизация. А оптимизируют приложение только в том случае если оно не укладывается в ТЗ и только те модули которые не укладываются, а оптимизация ради оптимизации это уже от лукавого!

  • @billgrover3130
    @billgrover3130 19 дней назад

    Классно всё разжевано. Подробно. Огонь!

  • @azzzn-m8h
    @azzzn-m8h 19 дней назад

    а чем полиморфизм отличается от State pattern?

  • @unknown-im8kj
    @unknown-im8kj 19 дней назад

    очень доходчиво, спасибо

  • @aleks_versus
    @aleks_versus 20 дней назад

    То есть цикломатическая сложность кода - это визуальная сложность кода? А когда я засуну цикл в функцию и потом буду эту функцию юзать, то цикломатическая сложность кода типа уменьшится?

  • @ergonomiccode1418
    @ergonomiccode1418 21 день назад

    @easydev1205 Не подскажите тему VSCode из видео, заранее спасибо!

  • @apikunov
    @apikunov 23 дня назад

    А ещё мягче можете разговаривать? 😂

  • @ТимофейЧерников-щ2х

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

  • @Dadadadam999
    @Dadadadam999 24 дня назад

    Хорошее видео и примеры хорошо подобраны и хорошие советы по их решению. Почти всё, что здесь перечислено постоянно использую при написании кода. Так же очень приятная подача материала.

  • @DobinSergei
    @DobinSergei 25 дней назад

    28:36 - к чему было делать ещё один класс, который сам по себе ничего не добавляет, а только вызывает методы базового класса? 😏 Лучше вместо него, использовать непосредственно базовый класс. За счёт полиморфизма будет автоматом вызвана реализация из правильного наследника, без проверок типа.

  • @DobinSergei
    @DobinSergei 25 дней назад

    16:08 - можно было в данном примере, вместо интерфейса, сделать наследование всех трёх классов от общего. Куда вынести виртуальный метод send. И заодном конструктор, который в данном случае одинаковый. Чтобы 3 раза не писать одно и то же. И в функцию передавать общий класс, где вызывать его метод send. В принципе делает то же самое. Если помимо этого у интерфейса не будет другого функционала, требующего именно возможности интерфейса.

    • @enosunim
      @enosunim 18 дней назад

      А функцию вообще убрать и просто вызывать send у объекта = ))))) Мы изобрели объектно-ориентированное программирование = )))))

  • @DobinSergei
    @DobinSergei 25 дней назад

    14:47 - плохая идея использовать строковый тип для проверки условий. Если изначально это не функция для работы со строковыми данными. Не знаю есть ли в JS, но во многих языках для этого есть перечисляемый тип (enum). Который по сути числовая константа на уровне компилятора. Тогда просто сравниваются 2 числа. Что работает быстрее, в космических масштабах! Чем сравнение 2 строк, где цикл в цикле для сравнения познаково.

    • @easydev1205
      @easydev1205 25 дней назад

      в js нет enum. Есть в TS - но его использование никак не влияет на скорость работы. Как и во многих других языках

    • @DobinSergei
      @DobinSergei 25 дней назад

      @easydev1205 ну нифига себе "не влияет"! Вообще-то выше подробно объяснено, как именно влияет.

    • @enosunim
      @enosunim 18 дней назад

      Сишник никогда не поймёт питониста = )) Хотя сишники пишут для него модули = ))))

    • @kaiuandrey
      @kaiuandrey 18 дней назад

      @@enosunim сишник понимает как это выглядит на уровне ассемблера. Для си++ передав тип уже компилятор знает, с какой функцией связать и проверок лишних не будет. Ну и if else f else все же приходится применять в сложных случаях, когда входные данные не из множества предопределенного, но тогда более вероятное событие обрабатываем в первом if... но проблема в том, что более вероятное может и поменяться :), так что иногда все не просто, как и при обработка данных в БД или в ИИ.

    • @enosunim
      @enosunim 17 дней назад

      @@kaiuandrey сишник понимает как это выглядело бы на уровне ассемблера если бы было написано на си = ))) Забывая, что в скриптовых языках за счет магии тумба-юмба совершенно не оптимальный с точки зрения сишника код, с множественными вызовами всяких методов будет работать быстрее, чем "правильный" с точки зрения сишника код, написанный разумеется на этом же тормозном языке.

  • @DobinSergei
    @DobinSergei 25 дней назад

    5:07 - по этой причине, мы имеем то что имеем 😏 Страдает оптимизация в угоду читаемости. Программы с одним и тем же функционалом, раньше летали на старом железе. А на новом тормозят и глючат... При том что мощь самого железа постоянно увеличивается. И занимаемое на диске место раздувается. Железо со временем развивается, а софт деградирует. Пора бы менять подход к разработке.

    • @easydev1205
      @easydev1205 25 дней назад

      а какие именно программы тормозят и глючат? Я не замечал. И там ссылка на пример с разбиением на функции. Из-за того что одну огромную функцию разбили на несколько маленьких программа глючить начинает?

    • @easydev1205
      @easydev1205 25 дней назад

      какие именно программы тормозят и глючат? программы разные бывают. Я в целом не замечал такого. И ссылка на пример с разбиением на функции. Из-за того что одну гигантскую функцию разбивают на несколько маленьких программа глючить начинает?

  • @ВладимирВолощик-ю3ы

    спасибо большое наш учитель!!!

  • @vlad3c
    @vlad3c 26 дней назад

    по ролику: "return" да, когда что то не прошло условие смысл выполнять дальнейшие проверки. Профит однозначно. "подходы функционального программирования" вообще не профит. внезапно метод filter с условием под капотом оказывается тем же циклом, который проверяет условие, т.е. тот же for и тот же if, других инструментов работы с массивом нет в принципе, если в нем надо что то найти надо пройти по нему циклом и никак иначе. Более лаконичная запись - да, удобочитаемость - нет(что делает цикл понятно с ходу, что делает метод, надо смотреть), быстродействие - тоже нет, сначала мы проходим по массиву чтобы найти нужные элементы, узнаем их индексы или копируем, потом проходим вторым циклом по этим элементам +память +время. "хэш-таблицы" - возможно да, НО только при больших объемах разносортных данных или строковых параметрах, если у вас 1-3 if то быстрее будет работать if, если данные числовые и по порядку лучше взять switch. В случае с хэш таблицей, подаются данные на вход хэш функции, которая вычисляет индекс в массиве и мы переходим по этому индексу, узнаем какую функцию выполнить, выполняем. В случае со switch, данные проверяются, что они укладываются в интервал значений switch'a и в таблице переходов(массив меток) выбирается переход под этим индексом, без каких либо вычислений, выполняются операции. Очень спорно зачем это прятать в хэш-таблицы? Лучше уж добавить числовой параметр и по нему в свиче определять переход, это будет работать быстрее, чем хэш-таблица. "тернарный оператор" однозначно нет, это тот же if просто в другой записи, никакой сложности он не снижает. да более лаконичная запись получается, но по факту это тот же if написанный в другой форме, ни больше ни меньше. (вообще смотря ролики python или js программистов создается впечатление, что они считают более короткая запись = быстрее выполняется, но увы это не всегда так, и может быть вполне наоборот) "полиморфизм" - да, по сути вызываются разные функции в зависимости от типа данных аргумента. суть полиморфизма "value objects" - да, снижение за счет использования дополнительной памяти. По сути мы к классу добавляем значение, которое уже используется в вычислениях. "state pattеrn" - да, разные классы для разных типов, значит разные методы. то же самое что с полиморфизмом, но другим способом

    • @enosunim
      @enosunim 18 дней назад

      По поводу фильтров и прочего. Нечитаемость согласен. Быстродействие не согласен. Во всяких скриптовых языках типа пейтона (да я знаю что пайтона) писать цикл это капец как долго. Вызывать тридцать три цикла, но через методы написанные на сях - супер быстро. = )))

  • @wylysypydystyshky
    @wylysypydystyshky 27 дней назад

    7:35 для ясности кода несколько возвратов return должны выглядеть однородно, стоять на одном уровне вложенности, возвращать одинаковый тип, а ещё лучше будет, если множество значений функции конечно.

  • @MaxPV1981
    @MaxPV1981 27 дней назад

    Уже самое начало не соответствует действительности - по приведённому определению: "... количество линейно независимых маршрутов через программный код". В приведённом графе в википедии с двумя циклами это три, потому что один маршрут без выполнения условий для циклов, и ещё два на каждый цикл (подразумевается, что условный по определению), которые могут выполняться, а могут нет. Это элементарная комбинаторика. И тут Вы говорите, что ЦС алгоритма с двумя условными операторами - 3. Но Вы ведь сами до этого прочитали: "если исходный код не содержит никаких точек ветвления или циклов, то сложность равна единице, поскольку есть только единственный маршрут через код. Если (!) код имеет единственный оператор IF, содержащий простое условие, то существует два пути через код: один если условие оператора IF имеет значение TRUE и один - если FALSE." Вы вообще понимали то, что читали? Итого ЦС представленного алгоритма 4 - это элементарно считается вручную (количество сочетаний из 4 по 2). "Сама функция" никак не может быть независимым маршрутом через программный код", если там нет условного оператора, который делает выполнение указанных двух условных операторов невозможным.

  • @cliffa-net
    @cliffa-net 27 дней назад

    Данное сообщение НЕ является критикой видеоматериала автора, но является попыткой углубить понимание автора в суть программирования на примере конкретного его видео. Ну и пожалуй, я не претендую на истину в последней инстанции, это всего-лишь выкладки на основе многолетнего опыта программирования. ____________ Сначала по поводу читаемости кода. Дело в том, что лично я бы выделил всего-лишь один постулат читаемости - это всегда компромис между двумя параметрами: 1. Размер кода - как длина строки, так и количество строк - чем меньше, тем лучше. Сюда же можно отнести - чем меньше всяких синтаксических обвязок, которые не несут никакой логической нагрузки, а только оформляют код, тем лучше. 2. Понимаемость записанного кода. Эти два пункта противоречат друг другу. И читаемость кода - это выверенный баланс между ними. И все пляски вокруг читаемости - они все вокруг этого. Когда вы приводите пример преобразования одного варианта написания в другой - попробуйте оценить, с т.з. какого из этих двух пунктов стало легче. И насколько итоговый баланс стал лучше. Я в видео почти не встретил таких примеров. __________ Теперь о сути ваших примеров. Везде вы приводите примеры с т.з. борьбы ЯП с самим собой. И так же везде вы приводите код, который не соответствует логике задачи, который мы потом исправляем, приближая её именно к логике задачи. А я как раз пропагандирую опираться не на инструменты ЯП в первую очередь, а как раз исходить из логики задачи, а потом уже смотреть, какой инструмент для реализации лучше использовать. И на примере самого последнего вашего примера давайте рассмотрим, что я имею ввиду. Вот у вас есть по сути два объекта (в человеческом понимании, в отрыве от ООП), с которыми надо что-то сделать. По сути - это банальное двух-уровневое дерево условий. На одном из уровней мы определяем, что за фигура (круг/треугольник), на другом - какое действие мы с этим будем делать (рисовать/изменять). А вот, какой уровень первый, а какой второй - это определяет задача!!! Не ЯП и его методы. Есть всего два варианта условных переходов: статический (перебор if-else) и динамический (когда мы выполняем переход к метке, которая хранится в переменной). Первый вариант - это все свитч-кейсы, циклы, любые условные операторы. Второй вариант - это полиморфизм, указатели на функции. Объекты "ключ-функция" - это гибрид первого и второго. В вашем примере оба уровня (выбор фигуры или действия) можно представить обоими способами. И опять же - эффективность выбора зависит в первую очередь от задачи, а так же от сложности реализации в конкретном ЯП. В общем случае state-вариативность всегда эффективнее выражать динамическим вызовом - т.е. вы машине предлагаете не перебрать кучу вариантов, которые заранее известны, а сразу в код закладываете, куда пойти, без перечислений. Это и с т.з. восприятия кода обычно проще, но тут индивидуально. А вот статическая вариативность гораздо лучше работает на любых других условных операторах, кроме == (например a<5 и т.п.). Почти во всех ваших примерах вы меняете для state-вариативности реализацию с статического перебора на динамический вызов. А в нашем с вами примере с фигурами ещё и намеренно допустили концептуальную ошибку, которую потом исправляете. По сути вы взяли неверное распределение по уровням условие задачи: Сначала вызываем действие, а Потом определяем, с чем мы работаем. И только потом начали исправлять - т.е. первичен у нас всё-таки объект, а только потом действие. И то, что вы назвали читаемостью - это лишь более точное соответствие задаче, не более того. Не всякий ЯП позволяет эффективный способ замены state-вариативности со статического перебора на динамический вызов: как с т.з. читаемости (посмотрите, вы правда считаете, что читаемость улучшилась? по мне - нет), с т.з. масштабируемости (тут дискуссионно), так и с т.з. машинной эффективности (полиморфизм - дорогая для машины штука). Я очень часто миксую все эти способы. И редко когда какой-то определённый способ используется чаще других. Рассказать о них - да, надо.. Но говорить, что какой-то один лучше другого - неправильно. Потом рождаются ООП-фанаты, которые пихают объекты везде. Из-за чего количество ситаксического обвяза в разы больше, что просто вызов в одной функции через условные переходы - прям как в вашем последнем примере.

    • @DobinSergei
      @DobinSergei 25 дней назад

      "... Вы прослушали лекцию профессора МГУ Васи Галушкина, об особенностях грамотной речи во время секса." 👏😃

    • @cliffa-net
      @cliffa-net 24 дня назад

      @@DobinSergei цель моего "высера" я сразу же обозначил. А цель вашего?

    • @-unity-
      @-unity- 16 дней назад

      Сразу чувствуется многолетний опыт работы! Я тоже голосую обеими руками за читаемость кода, даже в ущерб различным паттернам проектирования/программирования, которые стало модно пихать куда не попадя. Одного взгляда на функцию должно быть достаточно, чтобы понять, ЧТО она делает. Возможно, этого будет недостаточно, чтобы понять, КАК она это делает, но это уже вторично. Когда приходит время вносить какие-то изменения в код, нужно первым делом понять, а куда их вносить? Поэтому почти всегда читаемость превыше всего. Бывают, конечно, куски кода, которые должны работать очень быстро. И тут приходится применять приёмы, которые могут быть трудны для восприятия, но именно здесь критична скорость. Однако, такие куски встречаются далеко не всегда. P.S. высером ваш текст я не считаю. Изложены довольно глубокие мысли. А кому трудно читать объёмные тексты - пусть проходят мимо. Видимо, ещё созрели.

  • @holypowerenjoyer6059
    @holypowerenjoyer6059 28 дней назад

    Годный видос, своей подачей и типажем чем то напоминаешь ulbi tv, продолжай пилить видосы, друг

  • @kagoroshi-lg8pz
    @kagoroshi-lg8pz 29 дней назад

    на ру язычном ютубе мало такого или вообще нет

  • @sergeysoprunovvv9656
    @sergeysoprunovvv9656 29 дней назад

    Спасибо за видео!

  • @venan5245
    @venan5245 29 дней назад

    Я никогда не слышал про эту сложность, но сам всегда это понимал. Бывает напишешь с условиями в условиях, после еще добавишь, а потом как прозрение придет, и красиво перепишешь. По мне очевидная тема.

    • @VladimirNerby
      @VladimirNerby 18 дней назад

      Я при описании функции в самом начале уже поставил себе условие: если больше 20 строк, то попробовать сократить/упростить

  • @АндрейК9-я3ч
    @АндрейК9-я3ч Месяц назад

    Не очень люблю выводить тип из объекта, получается абстракция завязывается на реализацию, а должно быть наоборот. А оператор прикольный 👍

    • @easydev1205
      @easydev1205 29 дней назад

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

  • @Darth__Vader--x
    @Darth__Vader--x Месяц назад

    Спасибо за урок

  • @roman-berezkin
    @roman-berezkin Месяц назад

    Классное видео, крайне лаконичное. Спасибо!

  • @виртуоз_ру
    @виртуоз_ру Месяц назад

    Хорош 👍

  • @mariospaghetti8710
    @mariospaghetti8710 Месяц назад

    плохо слышно

    • @lankryf
      @lankryf 23 дня назад

      Купи норм навушники

    • @mariospaghetti8710
      @mariospaghetti8710 22 дня назад

      @@lankryf у меня нормальные наушники

  • @MrTruth2
    @MrTruth2 Месяц назад

    Все это баловство заканчивается в embedded

    • @JingoBo
      @JingoBo 29 дней назад

      Не заканчивается. Ранний выход, тернарный оператор. Полиморфизм даже на Си адекватно реализуется.

    • @MrTruth2
      @MrTruth2 29 дней назад

      @JingoBo никто и не спорит , что реализуется. Другой вопрос какой ценой и есть ли на это ресурсы.

  • @yarikv4133
    @yarikv4133 Месяц назад

    по поводу раннего выхода конечно тоже есть разные мнения. есть такие товарищи которые утверждают что точка выхода должна быть одна потому как множественные ухудшают читаемость кода. и не брезгуют для этого использовать goto)

    • @easydev1205
      @easydev1205 Месяц назад

      Да, много разных товарищей есть) Не на всех внимание обращать стоит

  • @Krasivi-s9c
    @Krasivi-s9c Месяц назад

    8:01 filter.map == несколько аллокаций (дело ни только в памяти -- это тяжёлая операция) 😢😢😢😢 + в худшем случаи, если не отработает filter, тогда два раза бежать по массиву 😢😢 (без негатива)

  • @trypophobia7497
    @trypophobia7497 Месяц назад

    Спасибо за видео! Конечно это специально простые примеры, но смешно смотреть, когда ради одной функции, нужно создать интерфейс и класс, чтобы реализовать стратегию)))) Думаю, для такого случая лучше подойдёт функция, которая принимает callback. Вот вам и стратегия на минималках)

    • @easydev1205
      @easydev1205 Месяц назад

      Это просто пример. Чтобы не терять время. И не засорять внимание зрителя.

    • @trypophobia7497
      @trypophobia7497 Месяц назад

      @@easydev1205 хорошо😁

  • @YuriyParaska
    @YuriyParaska Месяц назад

    Хорошое обьяснение и класный голос, прям как фильм смотриш с профисиональной озвучкой)

  • @СтепанПалий-д9ж
    @СтепанПалий-д9ж Месяц назад

    Спасибо, добрый человек

  • @agicotech
    @agicotech Месяц назад

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

    • @easydev1205
      @easydev1205 Месяц назад

      Абстракций вы не избежите ни в одном реальном проекте. И далеко не так уж они и ресурсоемки. Главное разумное использование. Как и со всем остальным.

    • @agicotech
      @agicotech Месяц назад

      @easydev1205 я не говорю что их нужно избегать как тотальное зло) я говорю что в вычислительных частях кола надо постараться делать что-то максимально низкоуровневое, а в реализации основной логики проекта абстракции это очень даже замечательно

  • @geoffreycollins6627
    @geoffreycollins6627 Месяц назад

    Спасибо за видео. в блоке с полиморфизмом/стратегией мне не понятно вот что: в изначальной "плохой" реализации сущность сообщения у нас объект, что заставляет думать, что мы изначально не знаем, какой тип сообщения мы должны отослать, поэтому и пишем условия внутри функции. а во второй "правильной" реализации мы как будто уже знаем, какой тип сообщения хотим отослать, "оборачивая" строку нужным классом. Но как быть все-таки если мы не знаем тип сообщения заранее? Например, если нам пришел ответ с вот таким объектом, как в изначальном примере, и исходя из того, что у него внутри, нужно выбрать необходимую стратегию отсылки? Получается, опять те же if-ы использовать?

    • @MrDerReiter
      @MrDerReiter Месяц назад

      Это распространённая проблема. Так или иначе нам всё равно где-то в коде нужно будет сделать выбор (выбрать конкретную стратегию, конкретную реализацию интерфейса, составить пары ключ-значение и т.д.), вопрос лишь в том где именно это сделать, и насколько аккуратно и читаемо это будет оформлено. Обычно решается паттерном "Фабричный метод" (т.е. по сути if/else все переносятся в одно место; инкапсулируются, чтобы не мозолить глаза по всему коду); или через внедрение зависимостей и DI-контейнеры (более сложное в плане реализации, но более изящное и поддерживаемое в долгосрочной перспективе решение). Подробности реализации обьяснять не буду, много текста выйдет. Просто погуглите Factory Method и Dependency Injection.

  • @idensas
    @idensas Месяц назад

    Классное видео! Напоминает arjan codes (или как-то так), там на англе много подобного рассматривалось. Довольно интересно наблюдать над рефакторингом кода, столько всего удобного реализуется, каеф. А когда открываю старые-старые проекты свои, такой кринж испытываю...

  • @AlekseiBleile
    @AlekseiBleile Месяц назад

    только хотел сказать что где же она чистая если у нее руки в 26 строке испачканы, а ты сам подправил. люблю когда возникает замечание, а автор сам тут же отвечает. как будто интерактив)0

  • @serb1146
    @serb1146 Месяц назад

    Пример с фигурами лучше было использовать для объяснения полиморфизма подтипов! Многоформенность! Формы фигур же! А вот способ доставки можно было использовать для State pattern, за исключением что там еще добавлен static Factory method (зачем?). С Value Object - придется вам перечитать теорию снова, и обратить внимание на слово equality и задуматься почему это так важно. Лайк, однозначно!

    • @easydev1205
      @easydev1205 Месяц назад

      Спасибо! И почему же важно?

    • @pinkierar_real
      @pinkierar_real 21 день назад

      @@easydev1205 возможно, для сравнения объектов не по полю, а по ссылке

  • @АлександрКнязев-ю1в

    Классно, приятно слушать человека который сам понимает то, что говорит👍Спасибо!

    • @easydev1205
      @easydev1205 Месяц назад

      Спасибо, за добрые слова!

  • @YuriyParaska
    @YuriyParaska Месяц назад

    Спасибо большое, хорошая подача и обьяснение!

  • @TheBypasser
    @TheBypasser Месяц назад

    "Что, соответственно, минус" - ну и тут я уже слушать и перестал: во-первых, ну главное-то в коде всё ж не примитивность, а оптимальность, и - во-вторых - всё равно автомат на кучу состояний читаем куда лучше пятка раскиданных по коду IFов. Разбить функцию на кучу мелких - можно, конечно, заинлайнить пару-тройку совсем уж логически отвязанных от остального кода вещей (что нечасто и имеется) - но скорее всего у тебя просто получится убогое опенсорсное спагетти. Помните, дети: функции, классы и т.п. сделаны для того, чтобы применяться в разных частях программы по многу раз, и правя любую подобную штуку, редактирующий будет всё время отвлекаться на то, что же эта правка затронет - и всё ради того, чтоб увидеть (желательно, вообще в другом файле), что функция эта - очередной такой вот изврат. Едем дальше. Твоё "функциональное программирование" вообще к функциональному программированию отношения не имеет, вот совсем и никак. Почему ж вы все обычные процедуры обзываете "функциональным программированием" ?.. А так - да тут половина примеров была б нормальными, если б уже все поняли, что скобки после кондишнов надо на новую строчку переносить (тогда сразу видно, скоуп там, или просто одиночный вызов), и всякой чуши типа return; else не писали... Или (я просто на скриптах не писал давно) в отличае от нормальных C/С++, тут IF без скобок не работает?

    • @easydev1205
      @easydev1205 Месяц назад

      Ничего не понятно, но очень интересно) Спасибо за комментарий

    • @enosunim
      @enosunim 18 дней назад

      А я вот очень люблю скобочки, и терпеть не могу этих "нормальных" когда одна команда без скобок. И начинается. Садишься дорабатывать этот "спагетти" код и сначала везде скобки пишешь, чтобы понять что вообще где выполняется. И уже потом добавляешь пару строчек которые нужно. Хотя в целом согласен, что мешать в кучу ООП, функциональное программирование и структурное это уже не спагетти, а макароны по флотски = )))

    • @TheBypasser
      @TheBypasser 17 дней назад

      @@enosunim Про скобки - "ну такое". Иногда помогают читабельности, иногда же попросту захламляют код. Вообще, если нет жёсткого требования, предпочитаю стандартам выборочно следовать: бывает, когда код с кучей goto и макрокода отлично читается, а бывает, что всё прям по MISRA, но хуже, чем после обфускатора :) А вот функционального программирования я так и вообще немного видел, а C/C++ его в явном виде и не поддерживают вовсе ;)