Тёмный

Разбираю и объясняю пример хорошего и плохого кода 

S0ER
Подписаться 107 тыс.
Просмотров 50 тыс.
50% 1

#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwaree...
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/...
GitHub - github.com/soe...
Чат для программистов - / discord
Группа ВК - codeart...

Опубликовано:

 

29 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 263   
@arhitutorials
@arhitutorials 3 года назад
Название видео не соответствует содержанию. Надо было назвать "Страдания JS разработчиков")
@protiv_bio
@protiv_bio 3 года назад
Истинно
@xdef42
@xdef42 3 года назад
Предлагаю сделать видео, где Соер просто 15 минут будет быстро говорить умные слова, за Макконнела, белые/черные списки и стратегии "мусор на входе - мусор на выходе" и т.д. больше спасибо
@keksinjo
@keksinjo 3 года назад
чтобы избежать переполнения стека: function sum(n, s = 0) { return (n) ? () => sum(n - 1, s + n) : s } function trampoline(fn) { return function (...args) { let res = fn.apply(null, args) while (typeof res === 'function') { res = res() } return res } } const num = 1000000 const trampSum = trampoline(sum) const res = trampSum(num) console.log(res)
@АндрійБілецький-о2ж
Отличное видео, побольше бы таких.
@sovrinfo
@sovrinfo 3 года назад
Спасибо за ролик!
@avecoder
@avecoder 3 года назад
Почему ты не продаешь курсы по JS? Разбогател бы, уехал жить на остров, может даже и на свой :)
@ovanse
@ovanse 3 года назад
Джун: ничерта не понятно, но очень интересно 😂
@covid-2284
@covid-2284 3 года назад
Не думаю что я - джун. Я никто вообще... Но что, зачем, как и почему - мне понятно. Думаю тут в принципе ничего такого нет. Ну разве что гуманитарий запутается...
@computercomputer3293
@computercomputer3293 3 года назад
@@covid-2284 гуманитарий. Не запутался :)
@I_am_Alan
@I_am_Alan 3 года назад
Респект!
@Олександр-ы4э
@Олександр-ы4э 3 года назад
Оба варианта ужасны .
@norzqq
@norzqq 3 года назад
Из этого ролика я узнал в каком стиле я проектирую и пишу все свои функции - мусор на входе, мусор на выходе :peepo_cry:
@nazarii.lazarchuk
@nazarii.lazarchuk 3 года назад
да и сам код тоже мусор XD
@zakzemsky4199
@zakzemsky4199 3 года назад
@@nazarii.lazarchuk мусор внутри 😉
@alexmanspb-2125
@alexmanspb-2125 Год назад
😂
@blacktrub
@blacktrub 3 года назад
если достаточно долго писать на javascript то вообще перестаёшь доверять людям и начинаешь обрабатывать всё подряд, будто каждый хочет тебе подсунуть undefined
@muratx10
@muratx10 3 года назад
😂😂
@fellainthewagon7166
@fellainthewagon7166 3 года назад
Вот это контент. Вот это можно пощупать. Больше бы таких практических наглядных ситуаций, больше разборов!
@fess932
@fess932 3 года назад
вывод - языки без строгой типизации позволяют ломать себе ногу передавая обьект туда куда надо передавать uint
@PostoiParovoz
@PostoiParovoz 3 года назад
В таких языках надо делать проверку и типизацию (валидацию) внутри функции.
@anotherone3641
@anotherone3641 3 года назад
а что скажешь насчет ассемблера?
@fess932
@fess932 3 года назад
@@anotherone3641 ассемблер это лучший способ сломать себе все что возможно))
@ВикторСмольяков-щ4в
Никогда не рассматривал такие примеры с факториалом с такой стороны... Вроде пример банальный, а тонкостей оказывается очень много. Спасибо!
@qwertymangames1800
@qwertymangames1800 14 дней назад
Хвостовые рекурсии наши друзья А исключения переполнения стека - признаки плохого программиста
@VladykaVladykov
@VladykaVladykov 3 года назад
Интересная стратегия: мусор на входе, мусор на выходе. Хмм, надо подумать о внедрении
@mamkinproger
@mamkinproger 3 года назад
Я уже пакеты с мусором поставил как делает автор) А если серьезно - очень полезное видео) Заставляет задуматься и понять, что мой код - го*но...
@КириллЧе-я5ы
@КириллЧе-я5ы 3 года назад
Паттерн стратегия - поменяйте алгоритм в процессе работы на мусорный...
@arkadysm
@arkadysm 3 года назад
Вообще-то мусор на входе, ошибка на выходе, хотя я тебя понял)
@Alexander-lp2qy
@Alexander-lp2qy 3 года назад
Мусор ломится в квартиру
@dasauser
@dasauser 3 года назад
Жаль, что в жс не придумали тайп хинтинг. Хорошо, что для жс придумали тайпскрипт.
@lexxkrt
@lexxkrt 3 года назад
а в языках с нормальной типизацией такого не произойдет, стоял бы тип uint во входных данных, и сразу отлетели бы некорректные данные на входе
@yaroslav8609
@yaroslav8609 3 года назад
TS в помощь
@qwertymangames1800
@qwertymangames1800 14 дней назад
@@yaroslav8609 ts всё равно транслирует код в js и выполняться код будет в js. Максимум чем ts может помочь - это дать подсказки до запуска кода.
@yuriik.6711
@yuriik.6711 3 года назад
услышал про рекурсию - закрыл видео
@drVatman
@drVatman 3 года назад
Мне кажется, тут уже недостаток джаваскрипта. Слева более понятная с точки зрения алгоритма функция (без специфики языка), но её поведение получается более сложным из-за отсутствия строгих типов. Наверное, хорошим тут был бы третий вариант, с проверкой типа, если мы берем общий случай, а не конкретно джаваскрипт.
@trell_7842
@trell_7842 3 года назад
я 1 кто пытался поймать кадр на 07:12 и очень сильно разочаровался ???((((
@bohdanyatsyshyn1662
@bohdanyatsyshyn1662 3 года назад
С видео становится понятно что не стоит писать на js :/
@placid3495
@placid3495 3 года назад
Спасибо за ролик! Подобной информации надо больше, таких разборов не хватает.
@kalobyte
@kalobyte 3 года назад
еще раз убедился, что яваскрипт гавно как можно было додуматься до нан в качестве результата некорректной операции? а если функция и не должна выдавать числа, а строки там или массив или даже объект?
@niklkelbon3662
@niklkelbon3662 3 года назад
Чет смотрю я на эти видосы и понимаю, что все проблемы решаются использованием С++ где такую хуйню просто не сделать. (и да, просто assert на такую хрень и всё, которого в релизе не будет) (ах да, или принимать unsigned...)
@АнтонЗайцев-д8ы
@АнтонЗайцев-д8ы 2 года назад
Так забавляют ответы про "нормальные языки" ))) Почему вы тогда на своих нормальных языках не пишете фронт))) Просто язык - это инструмент для конкретных задач, вы же не будите долбить стену отвёрткой, для этого придуман перфоратор
@bunnyboss75
@bunnyboss75 3 года назад
Что это за 25 кадр? Я уже чувствую желания писать код разными кисточками на графическом планшете)
@СтаніславСлободян-ч6у
Чтобы "докрутить" "мусор на входе - ничего на выходе", осталось добавить: if (n > 170) return Infinity;
@peregrint
@peregrint 3 года назад
Отличный ролик! Я ещё больше полюбил TypeScript)
@АртП-м7ж
@АртП-м7ж 3 года назад
javascript на входе - мусор на выходе!
@solitarysubscriber6575
@solitarysubscriber6575 3 года назад
правая функция вместо моментального выхода при отрицательном целом будет крутиться до переполнения стека. это что угодно, но не хороший код. можно было бы проверить тип, но динамикодебилы не догадаются. поэтому весь фронтенд в такой жопе, ждём переполнения стека
@S0ERDEVS
@S0ERDEVS 3 года назад
На чем основывается утверждение? Переполнение стека в JS в данном случае произойдет для тебя так же моментально как и выход. Страх ради страха?
@solitarysubscriber6575
@solitarysubscriber6575 3 года назад
@@S0ERDEVS А на медленном компьютере? А если это происходит тысячу раз подряд? Тоже будет "так же моментально"? Что это вообще за больная логика: "компьютер быстрый, давайте делать лишние (!) действия, не писать же нам более аккуратный код в конце концов"? Поверить не могу, что приходится это объяснять серьёзному специалисту. Но, как я уже сказал, это объясняет, почему веб-страницы долго грузятся и медленно работают, а браузеру потреблять 2гб ОЗУ для отображения картинок и текста (!!) считается нормой. Печально, очень печально.
@S0ERDEVS
@S0ERDEVS 3 года назад
@Solitary Subscriber Поверить не могу, что для тебя нормальная ситуация - тысяча исключений подряд, в моей практике вероятность исключительной ситуации в 0.01% - это уже очень много, но даже в таком случае, если посчитать вероятность того что такие события произойдут 1000 раз подряд, то окажется, что это практически нереально (очень уж маленькая вероятность такой ситуации). Т.е. у тебя получается, что ради того чтобы сэкономить процессорное время 1 раз на миллиард вызовов (на самом деле даже больше, но считать точно не хочу), ты в каждом из этих вызовов готов делать доп проверку (которая не бесплатно выполняется). Вот поэтому и получаются медленные приложения, что пихаете в каждую функцию проверки, которых можно избежать, если перестать руководствоваться интуицией, а подучить тервер и посчитать реально насколько вероятно наступление события, ради которого вы вносите неопределенность и сложность в программу, убивая производительность в нормальном потоке выполнения. Еще раз подумай - речь идет не о нормальном потоке исполнения, а о исключительной ситуации, т.е. в нормальном потоке вообще не будут использоваться доп. ресурсы. В твоем же случае ты хочешь экономить ради редкого исключения, повышая нагрузку на нормальный поток.
@niklkelbon3662
@niklkelbon3662 3 года назад
@@S0ERDEVS просто язык гавно вот и всё
@vlatterran
@vlatterran 3 года назад
Из этого всего мы делаем вывод - js плох, ибо у него есть ничего, и другое ничего
@qwertymangames1800
@qwertymangames1800 14 дней назад
NaN есть во многих языках. Это результат вычисления к примеру 0/0 Это число, но не число при этом. Inf/-Inf тоже в любом языке есть, это число в типах с плавающей точкой. undefined фишка js. По сути аналог null, но не null так как у null есть своё отдельное значение в js. А исключение Exeption тоже есть во многих языках, к примеру Java, C# Откуда взялся NaN? Сначала функция вернула просто return; -> undefined. Потом undefined попытались математически умножить с числом и получили число "нечисло", то есть NaN.
@ДобрыйЧеловек-я6о
@ДобрыйЧеловек-я6о 3 года назад
Код хороший. Код плохой. Код злой.
@Кочевник-й3г
@Кочевник-й3г 3 года назад
Образца 1966 года.
@enkryp
@enkryp 3 года назад
Отличный пример того, что !(n > 0) и (n
@MrAnetto
@MrAnetto 2 года назад
Классическое GIGO - garbage in, garbage out. Наглядно
@romanbush5164
@romanbush5164 11 месяцев назад
по чистому коду возвращать null | NaN плохая практика
@СергейПанов-з3ц
@СергейПанов-з3ц 3 года назад
Java программистам не понять проблем Javaскриптизёров...
@Игорь-ч6ф3и
@Игорь-ч6ф3и 3 года назад
Если идти по пути проверок, я б эту функцию завернул в ещё одну функцию, где бы и разместил проверки. Чтоб ещё и рекурсивно их не повторять.
@aMR5AvDeG
@aMR5AvDeG 3 года назад
"мусор на входе - мусор на выходе" мое кредо
@olezhonnv3215
@olezhonnv3215 2 года назад
Ну, в левой функции можно ексепшн обработать и отдавать тоже NaN. Например, сделать влежнную функцию реального рассчета факториала, которую вызывать с трай кетчем, где в кетч блоке результат делать NaN. Ну и тип параметра проверять, чтобы было подходящее число.
@drapasYT
@drapasYT 3 года назад
Благодарность. На редкость много полезного, на одну квадратную минуту видео.
@qwertymangames1800
@qwertymangames1800 14 дней назад
Никто не пишет рекурсии вызывающие переполнение стека. Это ужасный код. Юзаем хвостовые рекурсии вместо этого
@mikhailkh8560
@mikhailkh8560 3 года назад
Обожаю такие выпуски! Всегда есть о чем погуглить и чему поучится после!
@SimpleException
@SimpleException 3 года назад
Автор, спасибо. Действительно очень интересный пример. Но после просмотра меня не покидает чувство, что оба примера плохие. Просто один (правый) получилось вписать в одну из стратегий программирования, а второй пример - нет. Ни один из примеров не выполняет свою функцию с точки зрения математики. Факториа́л - функция, определённая на множестве неотрицательных целых чисел. Ключевой, на мой взгляд, момент - "целые неотрицательные числа". Т.е. пример слева "пытался" выполнить эти условия, но выполнил только половину, а пример справа даже не пытался. Возможно, что это и хорошо, по крайней мере именно эту мысль, как я понял, Вы и пытались донести, но тут скорее применима Теорема Эскобара.
@Algok17
@Algok17 3 года назад
А что на счёт языков со статической типизацией?
@dasauser
@dasauser 3 года назад
А что насчёт них? Они молодцы. Они делают то, что соер предлагает прописывать руками, а именно ограничивать функцию от данных, с которыми она не работает, добавляя полотна проверок. Так что с ними все ок. Т.е. если параметр функции был условно integer n, то при мусоре на входе было бы исключение. И все норм. 3 состояния результата работы функции: число, бесконечность (это вроде как тоже число в жсе, я хз), и экзепшен.
@ForwardMyMonkey
@ForwardMyMonkey 3 года назад
@@dasauser uint
@Algok17
@Algok17 3 года назад
@@dasauser а что на счёт проверки x
@0imax
@0imax 3 года назад
@@Algok17 unsigned int - и число всегда будет неотрицательным.
@Algok17
@Algok17 3 года назад
@@0imax ну это для данного примера подходит, а что если в агрументы передаётся класс, части которого могут быть некорректными и из-за этого не отработает дальнейшая логика?
@KnowingCat
@KnowingCat 3 года назад
обе ф-ции говно, т.к. не прописан тип входящего параметра и тип выходящих данных
@ANTGPRO
@ANTGPRO 3 года назад
Красава. Это правильный ответ.
@ANTGPRO
@ANTGPRO 3 года назад
Либо сделать Number.parseInt / Number.parseFloat.
@edmond-dantes-1796
@edmond-dantes-1796 2 года назад
Мораль видео такова - не нужно писать на джаваскрипт)
@qwertymangames1800
@qwertymangames1800 14 дней назад
Максимально глупый пример. Кто будет делать в рекурсии две ветки if? Ещё и не использовать хвостовую рекурсию позволяя получать исключения переполнения стека. Просто зачем? Ведь все знают про хвостовые рекурсии, это уже стандарт.
@PostoiParovoz
@PostoiParovoz 3 года назад
Оба примера - плохой код. Должна быть валидация входящих данный и должно выбрасывать ошибку, либо в крайнем случае 1 (в зависимости от задачи). Также должно быть преобразование типов - это же JS *!!! Левый код более правильный. Валидация слабая, но она есть! Надо просто сделать это лучше. Потому что потом , когда во время разработки будет пойман результат Exception, хотя по факту будет ожидаться выполнение, а не переполнение, потому что якобы должно поступать небольшое число на вход - вот тогда разработчик "хорошего кода" будет рвать последние волосы на мягкой точке, ища что же не так. Так для примера на 8:00 идёт рассуждение "либо результат, либо Exception". А на каком результате он будет наступать? На 20000, на 10486? А если комп и движок JS из будущего и потянет и даже 100 000 на расчёт? * данная функция из-за особенностей JS автоматически будет приводить всё в числа. Но "0" ноль, она не переварит! Что выдаст factorial("0")? А если математическая функция использует сложение?
@S0ERDEVS
@S0ERDEVS 3 года назад
Очень наивный подход, на практике так не делается, уже в следующем видео на примере redux показал, что боятся исключений не стоит, и умение проектировать как раз в том и заключается - не делать лишних проверок, пытаясь подстелить соломинку.
@PostoiParovoz
@PostoiParovoz 3 года назад
@@S0ERDEVS ага, а потом разгребать багрепорты от пользователей. Вот так джуны почитают вас, ещё и формы проверять не будут, потому что наивный подход на практике. У вас вероятно свой опыт умения проектирования, а на практике - чем больше вариантов учтёшь, чем больше проверок и тестов предусмотришь, тем проще будет поддерживать. Не придётся искать ошибки. И хорошо, если эта функция не жизненноважные. А то может со счёта уйти пару миллиончиков долларов и будешь всю жизнь отрабатывать.
@S0ERDEVS
@S0ERDEVS 3 года назад
@PostoiParovoz причем тут мой опыт? Открой любую публичную популярную библиотеку и посмотри как они написаны. Было бы желание, а информации на счет проектирования более чем достаточно. Если в коде куча проверок и явных приведений - это первый признак, что никто его не проектировал, а код написан по интуиции.
@агатакристи-г3ы
@агатакристи-г3ы 3 года назад
Жень, ударение такое "Сти́вен Макко́ннелл "
@Адриан-у4т
@Адриан-у4т 3 года назад
Лайк за Макконнелла!
@dmitrygurinovich58
@dmitrygurinovich58 3 года назад
Насколько я понял основная идея этого видео в том, что поведение функции должно быть детерминированным. И я с этим полностью согласен. Но примеры на JS лично для меня только добавляют путаницы. Я, признаюсь, плохо знаю JS. Видимо поэтому у меня осталось только больше вопросов, чем ясности: - я правильно понимаю, что в правой функции выбрасываются одинаковые ексепшены для разных инпутов? - Если ексепшены разные - то это мало отличается от левой функции, так как надо их все обработать. - Если они все одинаковые и сообщают о переполнении буфера - то, вроде бы лучше, но не совсем понятно, как это поможет вызывающему коду понять, что он передал неправильный аргумент? - И вообще, если, я увижу, что при передаче неверного аргумента в функцию она выбросила ексепшен, который говорит о том, что она пыталась выполнить свою логику с этим заведомо неверным типом аргумента, мне будет не по себе. Просто представьте, что функция не считает факториал, а обновляет состояние в базе данных, например.
@richarddaniel7088
@richarddaniel7088 3 года назад
Сначала был скептически натроен, но сейчас ставлю лайкос и подписка. Не знаю на сколько ты профи по факту, но темы очень правильные.
@sevsxes
@sevsxes 3 года назад
Сразу видно, автор видел много мусора на входе и на выходе. : )
@klev1983
@klev1983 3 года назад
В плане кода да. В плане юзабилити мусор на входе на выходе купи пожалуйста эти наушники. Найдется все, даже то, что ты не искал.
@nikitosnever2749
@nikitosnever2749 8 месяцев назад
Здравствуйте! Меня волнует один вопрос: вы говорите, что, обработав одну ошибку в правой функции(пример с факториалом), мы обработаем одновременно и остальные. А как же правило, что ошибки мы обрабатываем каждую отдельно? Try{} catch ( SomeError1 e){} catch (SomeError2 e) ….
@КириллЧе-я5ы
@КириллЧе-я5ы 3 года назад
Этакий контракт, за мусор на входе сервер не отвечает, отвечает клиент...
@kotxiiith776
@kotxiiith776 3 года назад
Когда пытаешься написать хороший код на плохом языке...
@KristapsLedins
@KristapsLedins 3 года назад
мусор на входе, мент на выходе
@ИльяЛюбашов
@ИльяЛюбашов 3 года назад
Интересное видео! Спасибо! А как насчет того, чтобы правую часть в try..catch засунуть, и в случае исключения возвращать NaN
@arctan-k
@arctan-k 3 года назад
if (n < 0) throw new IllegalArgumentException();
@almasabdrazak5089
@almasabdrazak5089 3 года назад
чем мне джава нравится int factorial(int n) throws NegativeValueException,IntegerOverFlowException не валидные типы отсечет компилятор , также функция показывает какую ошибку можно ожидать в golang принято возвращать значение и error func factorin(number int) (int,e) в случае ошибки e будет != null , но тут неявно в чем причина ошибки и мне как пользователю метода не понятно что делать с цепочкой вызова
@ПавелИванов-м5ю
@ПавелИванов-м5ю 2 года назад
А потом я должен без обработки warning ни протестировать толком, ни ошибку найти , ни флага не увидеть что ситуация уже вышла где-то за край контроля , потому что никакой генерации warning incorrect incoming data в логах чтобы сразу понять где мина -- не будет в принципе . Считаю обе функции незаконченными в аспекте логики и рациональности именно применения как функции .
@alexarakcheyev9189
@alexarakcheyev9189 3 года назад
Интересно конечно, но по-моему этот конкретный пример чито js заморочка. Например, я начинал с Паскаля, как учебного языка и потом сразу пошли C и С++. Там такое даже принципиально не возможно. Если тип возврата специфицирован, то и будешь сидеть и думать, что же вернуть при ошибке или вообще результат возварщать через указатель или ссылку в аргументах функции. А в return возвращать только код результата или ошибки.
@skiu9578
@skiu9578 3 года назад
Это особенность джаваскрипта, который может вернуть что угодно, а для ошибки у него аж четыре значения, включая null, которые могли бы быть чем-то одним, если бы было различие между значением переменной и состоянием программы. Null и Error можно понять зачем. Но NaN? Немогу сделть, и у меня для этого есть специальное слово. Переменной не присвоено значение, и для этого вот еще одно слово. Null это значение переменной, нет никакой ошибки. Лол.
@anotherone3641
@anotherone3641 3 года назад
расскажи лучше как реализовать стратегию мусор на входе - оффер на выходе. да всем (кроме интервьюеров на техническом собесе) похер какую стратегию реализует кусок говнокода на жабаскрипте. потому что уже при разработке самого интерпретатора жабаскрипта изрядно наговнокодили. С нетерпением жду следующего выпуска: как писать расово правильный код на встроенном в микрософ офис висуал барсике.
@ЗахарИгнатьев-е3э
@ЗахарИгнатьев-е3э 3 года назад
Затея интересная, яп не известный. Это же все самое простое и примитивное, что дается на курсе по алгоритмам. И из квадратичного делается линейный алгоритм исполнения. Но это же правда просто, неделя - две над одним псевдокодом и решено... Запомнил... А вот решение задачи с 4 вложенными циклами и создание линейного алгоритма, это на Яндекс стажировке выдали, второй из 6 задачей, вот тут только мастер поможет) Спасибо.
@takiekakmi7532
@takiekakmi7532 3 года назад
Хм, хоть я и питонист, тем не менее - интересная концепция, особенно при переполнении стека (хотя это будет сделать проблематично - скорее комп положишь...) Ну и отсюда понимание, что питонячий обработчик исключений - просто топчик
@viktor_borodin
@viktor_borodin 3 года назад
Не знаю, на си и c++ - изи, причём если не сталкивался с таким, то можно по первому разу сильно удивиться, когда делаешь какой-то итеративный расчёт.
@antonpankrat4594
@antonpankrat4594 3 года назад
может так еще лучше function factorial(n) { return fact(n); } function fact(n) { if (n === 0) return 1; return n * fact(n-1)); } таким образом мы уберем из рекурсии проверку (многократную) хоть белого хоть черного списка
@enkryp
@enkryp 3 года назад
Такой подход требует, чтобы во время рекурсивных вызовов входные данные оставались корректными, гарантии чего наш код не даёт. Например, при проверке "входное значение должно быть числом большим или равным единице" указанный код крашнется при n=1.2
@eugeneponomarov7429
@eugeneponomarov7429 3 года назад
Да, но у нас вместо одной функции теперь две, что не очень красиво
@antonpankrat4594
@antonpankrat4594 3 года назад
@@enkryp
@fess724
@fess724 3 года назад
Чтобы не создавать 2 глобальные функции лучше поступить так: function factorial(n) { if (!Number.isInteger(n)) { throw new TypeError('Variable n must be and integer type.'); } if (n < 0) { throw new RangeError('Variable n must be positive integer.'); } return (subf = (i) => { if (i === 0) return 1; return i * subf(i - 1); })(n); }
@qwertymangames1800
@qwertymangames1800 14 дней назад
По хорошему факториал вычислять лучше через reduce в функциональном стиле. А если делать нечего и хочешь использовать рекурсий то пожалуйста, используй хвостовую рекурсию, чтобы не вызвать исключение переполнения стека.
@АртП-м7ж
@АртП-м7ж 3 года назад
Меня бы начальник убил бы нахер, если бы я сидел и перебирал все возможные некорректные значения подобных функций. Инвестор деньги немножечко не для этого выделяет всё же.
@TheKwadriga
@TheKwadriga 3 года назад
Мне кажется, что вторая функция тоже плохая. Да, работать она будет предсказуемо, но каждый раз, когда на вход попадает что-то кроме целочисленного значения >= 0 ждать, когда переполнится стек - это так себе идея. С точки зрения производительности это очень плохо. И я не уверен, что она будет работать одинаково на разных ОС и разных архитектурах железа (я, как программист, вообще не должен об этом думать - лучше просто написать функцию так, чтобы: 1) никакого переполнения стека не происходило вообще никогда, 2) было не важно, на какой платформе это будет запускаться. Чтобы этого добиться, пред условием выхода из рекурсии (n === 0), нужно добавить проверку корректности входящих значений. Не уверен, что это корректный код на js, но будем считать, что это некий псевдокод: if (typeof n !== integer || n < 0) { throw new Exception('Invalid parameter'); } if (n
@S0ERDEVS
@S0ERDEVS 3 года назад
Стек на js это условности. Не надо путать со стеком на си. Переполнение стека в js безопасно в силу гарантий самого языка. Что касается производительности то преждевременная оптимизация - зло. В данном случае переполнение стека очень недорогое поведение. И не надо забывать что это исключительная ситуация, если в программе высокие шансы получить вместо данных мусор, то надо разбираться с дизайном системы в целом.
@TheKwadriga
@TheKwadriga 3 года назад
@@S0ERDEVS Ага, т. е., в данном случае можно считать, что сам язык делает эту проверку входящих значений. Ну да, тогда никакого смысла нет проверять самостоятельно и вторая функция вполне удовлетворительна.
@ANTGPRO
@ANTGPRO 3 года назад
@@S0ERDEVS Причем здесь JS к проверке стэка вызовов? не позорься))
@aronin4392
@aronin4392 3 года назад
Блин, я не программист, но автор канала так четко и понятно рассказывает, что даже мне абсолютно все понятно. Респект!
@kalobyte
@kalobyte 3 года назад
скоро тебя осенит, что ты оказывается и программировать можеш бросиш свою унылую работу, возьмеш нотыбук и поедеш в тайланд фрилансить под пальмами
@javavlogger9409
@javavlogger9409 3 года назад
Название видео не соответствует его содержимому. Хороший код - это про правильные имена переменных, форматирование, грамотную архитектуру, принципы SOLID и т. д. А тут просто разбор ошибок в функции.
@enkryp
@enkryp 3 года назад
Судя по всему, вы пропустили (промотали) видео на 1:23-2:00
@КириллЧе-я5ы
@КириллЧе-я5ы 3 года назад
А если не использовать рекурсию в данном примере, а применить цикл, как быстро произойдёт переполнение?..
@AlexRuban...
@AlexRuban... 2 года назад
в java действительно нужно === поставить?)))
@ФагимСадыков-ъ6с
На любом вменяемом языке тип int убрал бы возможность передать передать 1.2, {}, [] остался бы только вариант < 0, uint снимает и её. Поэтому если нужен JS хотя бы используйте TS
@ФагимСадыков-ъ6с
Ну и рекурсивный факториал так себе, надо было сразу подчеркнуть для смотрящих ролик джунов, что тут рекурсия не требуется и простой цикл решает
@АзимАзимов-ч1й
@АзимАзимов-ч1й 3 года назад
Было очень полезно. Больше таких обучающих роликов. Спасибо🙃
@TheHardPotter
@TheHardPotter 3 года назад
Триста? От.... си у программиста
@ВасильСтаврук
@ВасильСтаврук 3 года назад
Дякую за відео
@alexanderskusnov5119
@alexanderskusnov5119 3 года назад
плохая демонстрация - на чёрном фоне.
@Poloskun4ik
@Poloskun4ik 3 года назад
А для чего вообще подобный кусок кода используется?
@kalobyte
@kalobyte 3 года назад
вычиляет факториал - бесполезный абстгактный пример из мудематики, когда хотят показать программирование
@Poloskun4ik
@Poloskun4ik 3 года назад
@@kalobyte да судя по комментам я тут один не понимаю всего праздника жизни)))
@kalobyte
@kalobyte 3 года назад
​@@Poloskun4ik ну это классика же, когда начинают рассказывать про программирование в быдловузе и вместо конкретных кусков кода показывают непонятный факториал если быть точнее, то факториал это классика примера рекурсии типа показать, что функция может вызвать сама себя но за столько десятилетий никто не додумался придумать боле менее наглядный пример рекурсии нежели вычисление бесполезного ряда чисел а я таки один раз использовал рекурсию, что упросило и сократило мой код аж в 3 раза по визуальному объему я аж сам с себя нереально проперся
@ANTGPRO
@ANTGPRO 3 года назад
@@kalobyte ахахах, молодец
@_bogie_
@_bogie_ 3 года назад
Главная ошибка что код написан на js
@adminroot1345
@adminroot1345 3 года назад
Зачем три равно.) Многовато...
@AJIagguH
@AJIagguH 3 года назад
7:12
@yaroslavishchuk
@yaroslavishchuk 3 года назад
+
@andreysakharov6210
@andreysakharov6210 3 года назад
Да
@kirillriman3611
@kirillriman3611 3 года назад
Мудро и познавательно
@returnobject
@returnobject 3 года назад
пример настолько очевидный что можно разобрать за пару минут. 15 минут из пустого в порожнее...
@Uni-Coder
@Uni-Coder 3 года назад
Услышав про мусор, ожидал услышать что-нибудь про контракты. Хотя не знаю, есть ли какое-то подобие контрактов в JS.
@ВіталійКостак-ю9в
@ВіталійКостак-ю9в 3 года назад
Круто... Подписался
@АлександрКостюченко-у4х
спасибо за контент
@LoloKsyu
@LoloKsyu 3 года назад
Питонисты с обработкой явных исключений дико орут
@ANTGPRO
@ANTGPRO 3 года назад
тут все орут, кто хоть что-то знает))
@stanislavsh6582
@stanislavsh6582 3 года назад
На самом деле все довольно сложно. Если более комплексный кейс рассмотреть, допустим с парсингом Http - все будет не так уж и очевидно. А люди из команды еще тебе и скажут, что им лень обрабатывать исключения и потому твой код не должен их бросать. Ну и в итоге - все придет к тому, что у тебя все публичные функции будут выглядеть как-то так: IResult, а в контексте веба - всегда 200 и пусть тот кто получает результат - смотрит, все ли нормально.
@liravesnovaya242
@liravesnovaya242 3 года назад
По поводу лени обработки: пускай тогда просто делают пустой catch раз уж так лень. По мне, подход: "появилась проблема, выдай исключение и умри" в разы лучше мусора на выходе, потому что мусор может потом уйти очень далеко от источника, и источник уже можно и не найти.
@stanislavsh6582
@stanislavsh6582 3 года назад
​@@liravesnovaya242 Да я сам так же считаю(относительно принципа fail-fast), но что поделать, я же не один в команде. Потому и сказал что в конечном итоге все сведется к IResult. Как по мне - тупое решение, потому что не дает до конца понять - что не так, но что поделать.
@johnstrayk5208
@johnstrayk5208 3 года назад
Спасибо, расширили сознание.
@NarkotikAsd
@NarkotikAsd 3 года назад
Спасибо!"!!!!!!!!!!!!!!
@bpospanov
@bpospanov 3 года назад
отличное видео
@BigCrus
@BigCrus 3 года назад
а есть книга, в которой поподробней про все эти принципы (типа мусор на входе - мусор на выходе) можно почитать? это у Макконела написано?
@S0ERDEVS
@S0ERDEVS 3 года назад
Да, про мусор и не только писал Макконнел, у него же про защитное программирование, про контракты лучше всего у Мейера написано, так же можно кое что у Лармана прочитать по безопасному программированию.
@BigCrus
@BigCrus 3 года назад
@@S0ERDEVS понял-принял, спасибо. был бы очень признателен если подскажешь название книг
@ХаимМохави
@ХаимМохави 3 года назад
А ещё будет?
@mormorrowind403
@mormorrowind403 3 года назад
Спасибо, за разбор. Очень познавательно
@МаксимХвостов-м1й
@МаксимХвостов-м1й 3 года назад
Еще один интересный метод реализации - через построение бесконечного списка - обращение к нему производится только по индексу поэтому получается "мусор на входе - исключение на выходе". Пример на Haskell: factorial = scanl (*) 1 [1..] :t factorial -- Тип списка: factorial :: [Integer] factorial !! (-1) -- Обращение к списку: *** Exception: Prelude.!!: negative index factorial !! 3 -- 6 factorial !! 300 -- Большое число не буду сюда копировать. factorial !! 30000 -- Очень большое число.
@wylysypydystyshky
@wylysypydystyshky 3 года назад
Всё понятно, спасибо. ECMAScript - сплошная головная боль. Когда его начал изучать и практиковаться, тогда полдня потратил, чтобы найти ошибку при неявном преобразовании типов - проверял переменную (взятую с тега input ) на равенство нулю, а в самой переменной то-ли пустая строка строка была, то ли "0"... С тех неявное преобразование не люблю. Ученики с трудом въезжают в эту тему. Наоборот, пусть лучше целое 2 и вещественное 2.0 не будут равняться друг другу. Пусть лучше 2 и 2.0 вообще не складываются. Беру на вооружение термины "Белый список" и "Чёрный список" в операторе ветвления. Буду ученикам также объяснять составные логические выражения.
@spappinventor2850
@spappinventor2850 3 года назад
А почему в правой функции не перехватить Exception и вернуть Nan ? И вообще если надо вернуть хорошо или плохо, то надо функции немногие варианты плохо и превратить в одно возвращаемое плохо!
@grafgeleon2420
@grafgeleon2420 2 года назад
Как только услышал пример с рекурсией, рука сама потянулась выключать видосик. Но я решил всё таки посмотреть, включил заново и я не пожалел. Пример реально хороший, объяснения хорошие, того говна что я ожидал услышать НЕ_БЫЛО. Я доволен.
Далее
ТАРАКАН
00:38
Просмотров 855 тыс.
Bearwolf - GODZILLA Пародия Beatrise
00:33
Просмотров 193 тыс.
Чистый код - в книге и по жизни
14:50
ТАРАКАН
00:38
Просмотров 855 тыс.