FizzBuzz четыре варианта решения на JS

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

Комментарии • 253

  • @S0ERDEVS
    @S0ERDEVS  4 года назад +12

    00:00 Введение
    01:10 Структурное программирование
    04:20 Программирование с флагами
    07:15 Функциональное программирование
    10:22 Архитектура решения
    18:00 ООП
    Исходники - www.patreon.com/posts/41484631

    • @KostiaBazrov
      @KostiaBazrov 4 года назад

      Легче без бумаги

    • @optimusprime9456
      @optimusprime9456 4 года назад +2

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

    • @vasilyh4588
      @vasilyh4588 4 года назад +2

      @@optimusprime9456 ну это вина демонстратора, который на таком коротком коде пытается показать преимущества ООП. Он же такой пример выбрал.
      С другой стороны, если пример будет жирный - все уснут на середине.

    • @iuriiankudinov9131
      @iuriiankudinov9131 4 года назад

      Отличный пример ООП. Не знание этих приёмов является частой причиной, по которой люди говорят, что в IT не войти - не берут на работу.
      В то же время это отличный пример, как из 10 строчек абсолютно работающего и удовлетворительного кода можно развернуть целый листинг без изменения функциональности.
      Если сюда добавить еще продакт оунера, проджект менеджера, тим лида, тестировщика и бухгалтерию - то вокруг этой задачи можно построить IT компанию Fizz Buzz Corp с бюджетом равным бюджету города Саратова.
      Иногда достаточно написать 10 строчек работающего кода силами одного программиста и запустить продукт ))

    • @mikaelgevorgyan4521
      @mikaelgevorgyan4521 4 года назад +1

      const fb=(x,y,z)=>for(let i = 0;i{
      let a = i%y,b = i%z;
      (!a && !b)? 'FizzBuzz':( !a)? 'Fizz':(!b)? 'Buzz': i;
      }
      fb(100,3,5);😎😎😎
      А вот так ещё динамичнее может не хотим было деления на 5 и 3.Может хотим не 100 было,а 50 либо 400 и т.д!Предётся менять в твоих примерах менять почти везьде=)),а так даёшь 3 цифры и меняется смотри где именно!

  • @cover24158
    @cover24158 4 года назад +174

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

    • @adentube746
      @adentube746 4 года назад +6

      полностью поддерживаю

    • @crutchmaster9637
      @crutchmaster9637 4 года назад +11

      Так в этом всё ООП. Красиво там только на примере с кошечкой мяу и собачкой гав-гав. Но попробуй реализовать таким образом хотя бы всё семейство кошачих. Получишь название интерфейсов на 5 строк, по классу на каждый метод или swith-case лапшу внутри (что ересь).

    • @konstantinsemenov1627
      @konstantinsemenov1627 4 года назад +1

      @@crutchmaster9637 ооп ооп рознь. Для разных задач существуют разные архитектурные шаблоны. Для кошечек и собачек обратите внимание на ECS шаблон проектирования. Для API MVC. Для интерфейсов MVVM + flux и т.д.

    • @crutchmaster9637
      @crutchmaster9637 4 года назад

      @@konstantinsemenov1627 ECS для ООП - это всё равно, что делать EAV для РСУБД. Проще говоря, ооп тут будет уже не при чём.

    • @user-vc7hw9co5b
      @user-vc7hw9co5b 3 года назад

      гугли на английском

  • @MrTandem31
    @MrTandem31 4 года назад +117

    Извращения из мира программирования, прикольно ) Началось с легкой эротики

    • @zmeygavrilych
      @zmeygavrilych 4 года назад +8

      Началось с петтинга )

    • @JohnWickMovie
      @JohnWickMovie 3 года назад +3

      А концовка в виде BDSM

  • @ArtemKuznetsovTV
    @ArtemKuznetsovTV 4 года назад +53

    5. Использовать микросервисную архитектуру.
    6. Использовать MapReduce, чтобы можно было задачу решить на кластере
    :)

    • @evgenasd8892
      @evgenasd8892 4 года назад +2

      Что почитать чтобы заложить правильную архитектуру на старте?

    • @P1oN4ik
      @P1oN4ik 4 года назад +19

      7. Обучить нейроночку.

    • @Gregory-vc2vs
      @Gregory-vc2vs 4 года назад +20

      8. Нейрозапрограммировать собеседующего, что ты выполнил задачу

    • @narzaru
      @narzaru 4 года назад +5

      @@Gregory-vc2vs нейтрализовать собеседующего.

    • @andrewalyabyev7923
      @andrewalyabyev7923 3 года назад +2

      @@evgenasd8892 чистая архитектура. Роберт Мартин

  • @CHERNOMORGAMES
    @CHERNOMORGAMES 4 года назад +24

    07:17 Какая красота! ФП - райское наслаждение :)))

  • @user-sj4oy1el5y
    @user-sj4oy1el5y 4 года назад +6

    Мир нуждается в таких видосах! Спасибо сенсей, все круто!

  • @hellothere9195
    @hellothere9195 4 года назад +42

    Бритва окамы порезала вены от этого видоса

  • @user-vu6hn4ul2i
    @user-vu6hn4ul2i 3 года назад +18

    Комменты делятся на два типа:
    90% ООП говно, зачем так усложнять?
    10% Блин, нужно изучать архитектуру

  • @evgeniym29
    @evgeniym29 4 года назад +4

    Приветствую.
    Буквально на днях, в одном JS чате, ради прикола написал решение этой задачи в одну строчку в ФП стиле.
    Мне сказали, что люди так не пишут, обвинили в ереси и наверное сожги бы на костре, ибо функция то работала, а они не понимали как.
    Тут до меня дошло, что они никогда не видели Perl или Lisp :)
    Но увидев твой SOLID.... В общем, я понял, что в плане троллинга мне еще есть куда расти.
    Браво!

    • @moon.trance
      @moon.trance 4 года назад +3

      Строчку в студию.

    • @user-vu6hn4ul2i
      @user-vu6hn4ul2i 3 года назад

      @@moon.trance ну третье решение из видео.

    • @1kvolt1978
      @1kvolt1978 2 года назад

      Покажи в одну строчку, пожалуйста. Интересно сравнить с моей.

  • @fpv_am
    @fpv_am 4 года назад +24

    А я то думал что знаю ооп..........
    Вот это да.... Женя выдал.... - тыща к самооценке

  • @Vnikny
    @Vnikny 4 года назад +4

    Функциональное решение - это гамма эмоций. Сначала такой "ЧЁ Б..?", а потом "ОГО!!! Круто! Тоже так хочу"

  • @clumsy_weirdo
    @clumsy_weirdo 4 года назад +3

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

  • @LRXAORLOV
    @LRXAORLOV 3 года назад +1

    Очень хорошо обучающий ролик по архитектуре) хотелось бы больше таких) с разными примерами и паттернами)

  • @zcbesaba
    @zcbesaba 4 года назад +14

    Я вдохновился вашим примером и тоже наговнякал
    console.log(...[...Array(100).keys()].map(i=>(++i%3==0?"Fizz":'')+(i%5==0?"Buzz":'') || i))

    • @mykola_antal
      @mykola_antal 4 года назад

      Зачем до 100 (от 0 до 100 будет 101 елемент), если после инкремент все равно первым выполняется (а не проверка условия на 0)

    • @zcbesaba
      @zcbesaba 4 года назад

      @@mykola_antal я просто тестил на 10 элементах, и в итоговом варианте дописал 0 и всё

    • @McNeelone
      @McNeelone 4 года назад

      CodeWars любит подобные примеры))

    • @mantrida
      @mantrida 3 года назад

      Жесть! Попробовал то же самое на Пуктоне написать, думал не прожуёт такую дичь. А нет получилось...
      print(*map(lambda i: ('Fizz' if i % 3 == 0 else '') + ('Buzz' if i % 5 == 0 else '') or i, range(1, 101)))
      Изначально, то что сам придумал, было раза в два длиннее. Никогда бы не додумался, что так можно, если бы этот пример не увидел...

  • @timurdanilenko3582
    @timurdanilenko3582 4 года назад +32

    Я бы "Программирование с флагами" , в функции isFizzBuzz вместо явного выражения добавил вызов двух предыдущих. Вот тебе и расширяемость. Вдруг для Fizz условие поменяется? Не менять же его везде
    function isFizzBuzz(n)
    {
    return isFizz(n) && isBuzz(n);
    }

    • @mikaelgevorgyan4521
      @mikaelgevorgyan4521 4 года назад

      Учись=)))!!!Условия можно и в переменную сделать!
      const fb=x=>for(let i = 0;i{
      let a = i%5,b = i%3;
      (!a && !b)? 'FizzBuzz':( !a)? 'Fizz':(!b)? 'Buzz': i;
      }
      fb(100);
      Зачем менять условия в условии=)).Их всего лишь два же.Возьмем в локальную либо глобальную переменную и всё!!!После используй их!

    • @timurdanilenko3582
      @timurdanilenko3582 4 года назад +1

      @@mikaelgevorgyan4521 Ну ты крут. Что-то вроде анонимных классов. А "!" это ж вроде отрицание? Я в JS не особо, пока что писал только на ++, Delphi, FoxPro, 1C. Но все впереди.

    • @user-vu6hn4ul2i
      @user-vu6hn4ul2i 3 года назад

      @@mikaelgevorgyan4521 во-первых, работать не будет: ff объявлена через экспрешн ниже места, где используется; fb нужно всё равно оборачивать в фигурные скобки, т.к. у тебя не в одну строку.
      Во-вторых, а что ты нового привносишь в уже показанные решения?

    • @user-vu6hn4ul2i
      @user-vu6hn4ul2i 3 года назад

      @@mikaelgevorgyan4521 ну и return из ff нет.

    • @petrvictorovich
      @petrvictorovich 2 года назад

      @@mikaelgevorgyan4521 ff=i, fb=x - а зачем эти двойные присвоения?

  • @crutchmaster9637
    @crutchmaster9637 4 года назад +7

    В ооп варианте тоже есть фатальный недостаток. Он заключается в названии класса TagNumRulesCollection. Как рос бы лапшекод в первом варианте, также будут расти названия и количество классов с 1 методом в 4-м. Правильнее ли это? Возможно. Но иногда бывает абсолютно избыточно. Встречал такое, что вместо 10 строчек кода делали 20 классов и интерфейсов, в итоге вместо добавления одной строчки надо было наследовать 3 класса. С тех пор у меня психотравма и при виде ООП начинает трясти.
    Хотелось бы еще посмотреть на декларативный вариант.

  • @rinatvaliullov3247
    @rinatvaliullov3247 4 года назад +1

    Спасибо за разбор задачи FizzBuzz с примерами решений. Очень полезно и интересно! Даёшь отдельный ролик про SOLID. А может и серию роликов )

  • @ev_geniy17
    @ev_geniy17 4 года назад +2

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

  • @VladykaVladykov
    @VladykaVladykov 4 года назад +52

    Так вот почему все врёмя не хватает новым программам памяти и производительности процессора!!!!

    • @P1oN4ik
      @P1oN4ik 4 года назад +3

      да, потому что от функциональщины куча проверок и потерь на неверных предположениях процессора о ветвлении кода )

    • @vyacheslavgvorus3883
      @vyacheslavgvorus3883 4 года назад +4

      @@P1oN4ik Не хватает писателям понимания, что код хороший тогда, когда он интуитивно понятен даде новичку и использует всем известные паттерны. А зная паттерны, вся архитектура как карта, и добавить новое поведение намного быстрее и проще. Не нужно выделываться в сокращениях.
      Видео класс!

    • @evgenasd8892
      @evgenasd8892 4 года назад

      Vyacheslav Gvorus согласен что зная паттерны- архитектура как карта, Но как научиться самому выбрать верный паттерн для задачи?

    • @mikaelgevorgyan4521
      @mikaelgevorgyan4521 4 года назад +1

      @@vyacheslavgvorus3883 Ойщ какие паттерны последняя😁😂🤣,даже смотреть не за хотелось мне!!!Там заворухо классов,в которых не увидел смысла FrizzBuss.Говорит об функциональности,а сам классы пишет=)))!!!Функциональность сила в JS.Функциональность это и есть динамичность и преимущество в нём!!!Просто надо уметь писать.А так же первый вариант был прощще и читабельнее.Просто надо найти подход.А не писать классы 😁😁,даже в реакте мало преимуществ у классов чем в функционале=))!!

    • @optimusprime9456
      @optimusprime9456 4 года назад

      @@mikaelgevorgyan4521 А ничо, что это пример? А на простых примерах невозможно понять, в чем смысл ООП. Он хорошо раскрывается только на больших программах.

  • @DraginAnatoliy
    @DraginAnatoliy 4 года назад +1

    Спасибо за видео, Соер, был бы рад увидеть на канале больше нативного js и решения часто встречаемых задач)

  • @user-ri5jr2xm3d
    @user-ri5jr2xm3d 4 года назад +8

    Нифига он умный👍👍👍

  • @karimkimsanbaev7932
    @karimkimsanbaev7932 4 года назад

    Потрясающее видео, сам натыкался на собеседовании на такую задачу, когда устраивался программистом.
    Сейчас раскопал, посмотрел свое решение, делал ifками, но в отдельном для этого классе, старался следовать mvc
    Меня все таки взяли, но увидев 4-ое решение, я готов аплодировать стоя. Отличный пример проектирования сложных архитектурных систем на пальцах) Спасибо большое)
    Хочется полный разбор с принципами SOLID, чтобы понять их на примере, это всегда проще, чем теория)

  • @M27B_our_victory
    @M27B_our_victory 4 года назад +1

    Интересно подаете материал, часто стал вдохновляться вашими видео, по больше про js и python!))Если возможно!)

  • @overparser
    @overparser 4 года назад

    Спасибо большое, давно ищу хоть какую то информацию по разбору архитектуры.

  • @vasilyh4588
    @vasilyh4588 4 года назад +17

    OOP решение (да впрочем и почти все остальные) нарушает ОСНОВНОЙ принцип программирования - KISS.

    • @user-vd4ng2hu3t
      @user-vd4ng2hu3t 4 года назад +5

      "...нарушает ОСНОВНОЙ принцип программирования - KISS MY ASS..."

    • @ms-33
      @ms-33 4 года назад

      Что за принцип?

    • @LWHikarik
      @LWHikarik 4 года назад

      Фигня, вопрос лишь в уровне решения и его задачах

    • @dimeliora
      @dimeliora 4 года назад +3

      @@ms-33 keep it simple, stupid. Короче, не усложняй без надобности.

    • @bubblesort6368
      @bubblesort6368 4 года назад +5

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

  • @SlavaCh
    @SlavaCh 4 года назад +2

    Можно ещё так if(value===1) return 1; if (value===2) return 2: if(value===3) return “Fizz” .... if(value===100) return “Bus”

    • @vlad-yelnikov
      @vlad-yelnikov 4 года назад

      можно, но не нужно - много лишнего кода в котором нет смысла

  • @eugenijusmargalikas6237
    @eugenijusmargalikas6237 3 года назад

    Спасибо. Часть про ООП помогла осознать достоинства такого подхода. А так же, минуя джунов и мидлов прыгнуть сразу в синьоры, решив тестовое задание в таком стиле. ;)

  • @ArchakovBlog
    @ArchakovBlog 4 года назад +3

    Последний вариант прям кайф. Помню на собесе уровня Middle давали такую задачку, что было странно.

  • @user-is9fv5bi7x
    @user-is9fv5bi7x 3 года назад

    Шикарный урок. Спасибо.

  • @old-empire
    @old-empire 4 года назад +1

    Круто! Очень доступно

  • @drovoseg
    @drovoseg 4 года назад +2

    Почему-то никто не заметил что во втором примере все три оператора if лишние, надо сразу возвращать boolean.
    И в ООП MAX_NUM = 100 неверное название, максимальное же по факту 99. Ну и можно его инкапсулировать в еще один класс вместе с циклом, раз уж в ООП стиле делаем.

  • @andreyzhukov2821
    @andreyzhukov2821 4 года назад +3

    Какое же это классное видео!
    Спасибо!

  • @Veujin
    @Veujin 4 года назад +1

    В последнем примере от дефолтного значение лучше избавиться в find. в TagNameRule можно передавать что-то вроде билдера тега, а не готовый тег. внутри find инстанцировать тег билдером, передавая ему num.
    так появится новое правило в коллекции, к которому можно будет написать стратегию TrueCondition.
    если find ничего не нашел, возвращать nil
    таким способом все правила будут описаны в коллекции правил, а логика дефолтного значения уйдет из того места, где вызывается find

  • @Mitreskotv
    @Mitreskotv 4 года назад +2

    Сторонник первого варианта. Все просто и понятно. Если задача решается просто, зачем усложнять? всеми любимый KISS. Если мы знаем о будущих изменениях, или думаем наперед и предполагаем изменения, то возможно другие подходы лучше. Switch(true) для меня ад. можно например в том же if (isBuzz(i)) структуру не менять.
    Если это вопрос на архитектуру - спору нет.
    Если вопрос на "сделай" - для меня лучше чем первое решение нет. Разве можно избавится от magic Numbers.

  • @McMeil
    @McMeil 4 года назад +17

    как получить такие навыки в проектировании: что читать, где учить?
    можете дать список литературы?
    в любом случае спасибо - понял сколько всего нужно изучать

    • @mykola_antal
      @mykola_antal 4 года назад +2

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

    • @evgenasd8892
      @evgenasd8892 4 года назад +2

      А у меня столько раз проектирование не оправдовало дальнейшее расширение проекта, что я поддержу вопрос в комментарии: что почитать чтобы верно определить необходимый паттерн для проектирование архитектуры задачи?

    • @McMeil
      @McMeil 4 года назад

      @@mykola_antal спс, но это я и сам понимаю) много работать, много учить, думать и анализировать)

    • @ivankiselev8672
      @ivankiselev8672 4 года назад

      Попробуй "Программист-прагматик", 2е издание

    • @McMeil
      @McMeil 4 года назад

      @@ivankiselev8672 спс, посмотрю)

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

    Хотел тоже сделать подобный ролик, но еще добавить рекурсию 😀Теперь видимо не буду 🙂 По ООП хорошо объяснил

  • @a.osethkin55
    @a.osethkin55 3 года назад

    Огонь!

  • @user-rq3oz7ug8j
    @user-rq3oz7ug8j 3 года назад

    Крутяк! Спасибо за видео

  • @qwe-rty-
    @qwe-rty- 3 года назад +1

    Что делать, если не понял ООП подход? Как это вообще, что это? Я пересмотрел уже несколько раз. Что нужно знать, чтобы так мыслить? И как вообще понять, какой подход мне нужен? Подскажите, пожалуйста.
    Почитал много комментариев ниже, не особо помогло, конечно, хотелось бы книжку какую-то, но я пробовал читать Мартина про чистую архитектуру, там сложно...

  • @user-mb4xy2cz3t
    @user-mb4xy2cz3t 4 года назад +4

    В этом проблема многих програмистов, вот простая же была задача, зачем туда лепить вот это 17:38? От прочтения цикла и пары-тройки ифов ещё никто не умирал, зато думаю постоянно разбирая вот такие Орхитектуры, сделанные для простых задач, можно словить раннюю аневризму

    • @user-ft9fw5gn3o
      @user-ft9fw5gn3o 4 года назад

      "От прочтения пары-тройки `(десятков)` ифов" умирают часы у других программистов, которым требуется поддержать твой код. Была простая задача, использовали непростой подход. Проблемой видео было решение задачи? Нет, проблемой видео было показать подход к решению задачи. Сегодня ты смотришь на решение ФизБаз, завтра тебе потребуется начать реализацию нового проекта, и тебе сразу станет понятно - понял ты то, что хотел донести автор, или не понял.

    • @user-mb4xy2cz3t
      @user-mb4xy2cz3t 4 года назад +4

      ​@@user-ft9fw5gn3o Да нет, не умирают, зашёл, прочитал, понял, быстро дописал ещё иф если нужно. А чтобы разобраться как блин взаимодействуют классы в той архитектурной колбасе, как раз часы и тратятся.
      Проблемой видео не было, но люди насмотрятся таких видео, наслушаются что паттерны это круто и начинают пихать их просто везде.
      И видел я такие проекты. Например один из последних, написан по всем канонам Microsoft best practices, паттерны, микросервисы, технологии, вот это всё, реально толково написаны. Чел это писал полтора года, в нерабочее время. А просто и понятно это можно было написать за месяц, во всё то же нерабочее время и поддерживать это смог бы мидл, даже не крепкий, а в итоге поддерживают синьоры, потому что мидлы в нём разобраться просто не могут.

  • @sayeretjob
    @sayeretjob 4 года назад

    вау-как четко и интересно

  • @semenpetrov9456
    @semenpetrov9456 4 года назад +2

    не совсем понял что такое тег и что значит тегирование?

  • @anazkomult
    @anazkomult 4 года назад

    Я думал что начал понимать программирование, но господин СОЕР просто взял и поставил на место.

  • @stranger271271
    @stranger271271 4 года назад

    Идеально мне понравилось

  • @alexsanderdolov1945
    @alexsanderdolov1945 4 года назад +2

    Вообще, идея тегирования очень крутая - по сути наша нейросеть работает по методу тегирования, где совокупность определенных связей и весов обозначена каким-то тегом(в данном случае отедльный неройн - это уже тэг) А вся нейросеть - это иерархия тегов. Только имена им никто не дает. А дальше, когда уже тег образовался, по сути он может отдавать своё значения выше или ниже другим, чтобы те образовывали свои на их базе теги. Т.е. если нейрон ответственнен на данном уровне за горизонтальную линию, то это изображение он тегирует тогда, когда видит эту линию на изображении. Только тут ещё и с процентами теги, а не бинарные. (Четкие и нечеткие теги :) )
    Может создать свой язык на основе тегов? :) И там будет уже не ООП, а Тегировано Ориентированное Программирование. :)

  • @cafedead
    @cafedead 8 месяцев назад +1

    Соер, оцени FizzBuzz от Мурыча. Тебе понравился!😂

  • @dmitriyart2989
    @dmitriyart2989 4 года назад

    Мой любимый js!

  • @AndreiVvedenskii
    @AndreiVvedenskii 4 года назад +1

    только вчера решал эту задачу на codewars для RSSchool))

  • @user-br4gt7xu2j
    @user-br4gt7xu2j 4 года назад +1

    почему числа в константы не вывели понятно, но строковые fizz и buzz не лучше ли тут вывести в private final variables?)

  • @ms-33
    @ms-33 4 года назад

    Спасибо!

  • @megaman13able
    @megaman13able 4 года назад +3

    18:36 Что здесь значит нижнее подчеркивание у аргумента?

    • @vlad-yelnikov
      @vlad-yelnikov 4 года назад +1

      подчеркиванием принято обозначать protected property в JavaScript

  • @HeroRc
    @HeroRc 3 года назад +1

    Человеку, который на собеседовании решает эту задачу последним способом, не надо перезванивать.

  • @arseniyzuev353
    @arseniyzuev353 2 года назад +1

    Смысл fizzbuzz в том, что старые процессоры не имели аппаратного блока деления, и поэтому решения с mod или делением сильно проседали по времени выполнения по сравнению с решениями без. Но видимо это настолько забыто, что даж старичок Соер не в курсе.
    Классическое "правильное" решение - это два счетчика для 3 и 5, которые инкрементятся, потом типа counter3 ==3 => print(Fizz); counter3=0

  • @AnonAristotel
    @AnonAristotel 3 года назад

    А в JS break на switch, не на цикл for?
    За видео плюс!

  • @user-no3rr2wk2g
    @user-no3rr2wk2g 4 года назад +2

    Не очень понимаю претензий "на фига тут ООП подход"? Понятно, что конкретно в FizzBuzz так никто не делает. А вот когда тебе говорят "результат надо вывести в консоль, но вообще-то мы у заказчика не уточняли"... не грех задуматься над модифицируемостью кода, и тогда ООП - то что доктор прописал

    • @antonioarizo4881
      @antonioarizo4881 4 года назад

      А так и бывает- чёткого ТЗ никто не делает и если писать так как есть, то позже выясняется, когда заказчик предъявляет «ваша программа не работает, переделывайте!», о других деталях, которые типа «подразумевались как само собой разумеющееся», однако тебя никто о них не извещал.

  • @simplewebdev1098
    @simplewebdev1098 3 года назад

    Привет, как тебе такое решение? Как вообще относишься к подобному стилю написания кода?
    class FizzBuzz {
    constructor(length) {
    this.arr = new Array(length).fill(null);
    this.fizz = this._fillByCondition(3, 'Fizz');
    this.buzz = this._fillByCondition(5, 'Buzz');
    }
    _fillByCondition = (cond, title) => () => {
    this.arr.forEach((item, index) => {
    this.arr[index] = (index + 1)%cond ? item : item ? item + title : title;
    });
    return this;
    }
    fillEmptyIndices = () => {
    this.arr.forEach((item, index)=> this.arr[index] = item ? item : index + 1);
    return this;
    }
    print = () => {
    this.arr.forEach((item) => console.log(item));
    return this;
    }
    }
    new FizzBuzz(100).fizz().buzz().fillEmptyIndices().print();

  • @nickml5138
    @nickml5138 4 года назад

    Крутое видео!)
    На 6:24 ESlint ругался бы
    if (n % 5 === 0) {
    return true
    }
    return false
    попросил бы заменить на
    return n % 5 === 0

    • @MisterGenix
      @MisterGenix 4 года назад

      Я хоть и не eslint, но тоже удивился зачем так писать, мож кто подскажет?

  • @AlexanderSavchenko91
    @AlexanderSavchenko91 3 года назад

    какую книгу надо прочитать чтобы хотя бы примерно приблизиться к такому ООП?)

  • @asdffewfew
    @asdffewfew 4 года назад +1

    было интересно. можете рассказать про unit тесты?

  • @uranproject
    @uranproject 2 года назад

    а есть что-нибудь про протокольно ориентированного программирования?

  • @maxpapirovnyk4304
    @maxpapirovnyk4304 3 года назад

    SOLID +

  • @nyannyan8243
    @nyannyan8243 4 года назад +3

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

    • @user-mb4xy2cz3t
      @user-mb4xy2cz3t 4 года назад

      При чём для решения простых задач

  • @VseNikiSukaZanyaty
    @VseNikiSukaZanyaty 4 года назад +4

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

  • @vasalib
    @vasalib 4 года назад

    Я js не знаю, но первые три примера более-менее понятны. Но в ООП такое накрутили... Мне бы понять, приведенный пример кода вообще рабочий или это только некий каркас?

  • @vorontsovru270895
    @vorontsovru270895 4 года назад +1

    Сделал данную задачку на С# на случай, если тут будут люди, которые захотят сами разобрать принцип работы каждого из стилей без необходимости мучаться с JS =) github.com/Zodt/FizzBuzz/

  • @vasya.k1n6
    @vasya.k1n6 4 года назад

    Первый - твой FizzBuzz, четвертый - FizzBuzz сына маминой подруги

  • @MaximRovinsky
    @MaximRovinsky 4 года назад +1

    Не JavaScript но пример интересный. Взято где-то из интернета, мне показалось лаконичным. Вариант который печатает только заданные числа
    for i = 1; i

    • @sergeys4732
      @sergeys4732 4 года назад +1

      Это go

    • @MaximRovinsky
      @MaximRovinsky 4 года назад

      Верно, но пример чисто для наглядности. Вдруг кому-то пригодиться

    • @user-vu6hn4ul2i
      @user-vu6hn4ul2i 3 года назад

      @@MaximRovinsky чем решение отличается от первого в видео?

    • @MaximRovinsky
      @MaximRovinsky 3 года назад

      отличие первого варианта, что код выводит только те числа, которые нам нужны (а не всех подряд) + другой подход проверки. Пример просто для подумать, для расширение кругозора

  • @tarpaha
    @tarpaha 3 года назад +1

    Но ведь тут в коде сразу же ошибка. По условию дано 100 чисел. Цикл i = 1; i < 100; i++ работает с 99

  • @tsunamiminsk
    @tsunamiminsk 4 года назад +2

    В нынешнее время эта задачка не имеет смысла почти, раньше там соль была в том, чтобы не использовать %, так как процессор не имел аппаратного блока деления, а значит операция % была очень затратна, и смысл был в том чтобы в такой простой задаче об этом помнить
    сейчас это спиномозговая трата времени

    • @S0ERDEVS
      @S0ERDEVS  4 года назад

      Раньше - это когда?

    • @tsunamiminsk
      @tsunamiminsk 4 года назад

      @@S0ERDEVS во времена популярности x86 и десктопного софта

    • @S0ERDEVS
      @S0ERDEVS  4 года назад

      @az_guitar, а можно все же подробнее, что вы имеете в виду? Ну просто эта задачка стала популярной сильно позже, чем 80е годы прошлого века.
      Даже если предположить, что Вы правы и соль в аппаратном делении, то в 1992 появились первые пентиумы и получается, что уже лет 30 эта задачка не актуальна и давно должна кануть в лету.

    • @tsunamiminsk
      @tsunamiminsk 4 года назад +4

      @@S0ERDEVS в компилируемых языках разница есть до сих пор, так как даже аппаратное деление в пентиумах сильно дороже например инкремента
      и оптимальное решение выглядит так, что заводятся два счетчика, для 3 (count3) и для 5 (count5), каждый цикл они инкрементятся, а если count3==3 или count5==5 - значит текущее число делится на 3 или 5, счетчик потом зануляем
      В языках типа javascript, php и прочее скорее всего разницы не будет, в языка ближе к железу - будет до сих пор.
      Без этой особенности эта задача уровня второй по счету лабораторной на основах программирования

    • @S0ERDEVS
      @S0ERDEVS  4 года назад

      Современные процессоры делают одно деление за 1 такт, можно даже больше чем одно деление, если использовать SIMD инструкции, то и 4 деления в один такт можно запихать.
      Но с инкрементом решение интересное, спасибо.

  • @maxgreen3643
    @maxgreen3643 4 года назад +7

    С каждым годом только всë больше разочаровываюсь в ооп. Прав был Алан Кэй =(

    • @mikaelgevorgyan4521
      @mikaelgevorgyan4521 4 года назад

      Я в javascript =))) функционал люблю.Короче проще и читабельнее!😎😎😎

  • @transglukator
    @transglukator 4 года назад +1

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

    • @S0ERDEVS
      @S0ERDEVS  4 года назад

      @Sergey Khval, чего так пафосно-то?

  • @GoldiPlatinum
    @GoldiPlatinum 4 года назад

    А где стримы можно найти?

  • @drygdryg2
    @drygdryg2 4 года назад

    Спасибо за видео. Третье решение поставило меня в тупик: сижу и думаю, как это реализовать на Nim lang

    • @levovix
      @levovix 3 года назад

      у меня получилось что-то такое:
      proc gen(n: int, w: string): proc(num: int): string =
      return proc(num: int): string =
      if num mod n == 0: w else: ""
      let fizz = gen(3, "Fizz")
      let buzz = gen(5, "Buzz")
      for i in 1..

  • @etoyonker
    @etoyonker 10 месяцев назад

    Лапшекод и оверинжиниринг в чистом виде

  • @iloveclimbru
    @iloveclimbru 4 года назад

    Использование тэга для вывода чисел отдает костылем. Вам так не кажется?

  • @uncle-xxi
    @uncle-xxi 4 года назад

    Во втором примере стоило бы isFizz и isBuzz переиспользовать :)

  • @igor_quantumman
    @igor_quantumman 4 года назад

    Почему в функциональном решении gen, fizz и buzz объявлены как константы?

    • @user-vu6hn4ul2i
      @user-vu6hn4ul2i 3 года назад

      Потому, что в js так можно

  • @igorsushko1356
    @igorsushko1356 3 года назад +2

    В ООП ошибка в выводе будет. дописал немного кода codepen.io/igor-sushko/pen/JjKKwmY

    • @chepudila9607
      @chepudila9607 3 года назад

      По идее, достаточно return true обернуть для стратегии AND в условие this.conditions.length - 1 == i

  • @user-nr7vt6it5y
    @user-nr7vt6it5y 4 года назад +1

    Очень понятно объясняешь, спасибо ! Скажи пожалуйста что такое true в switch 4:44. В ней же должно быть i. ???

    • @yehorazyrankulov553
      @yehorazyrankulov553 4 года назад

      Это значение, которе будет сравниваться с кейсами.

    • @zhenshuang
      @zhenshuang 4 года назад +2

      Свич проверияет все условия по очереди, и где условие выдаёт true, там выходит через break.

    • @MisterGenix
      @MisterGenix 4 года назад

      А для чего вместо return условие возвращать отдельно true и false разными строками?

    • @user-ft9fw5gn3o
      @user-ft9fw5gn3o 4 года назад +1

      @@MisterGenix чтобы уточнить, что функция возвращает булево значение. Для наглядности

    • @MisterGenix
      @MisterGenix 4 года назад

      Степан Савельев там Соер ниже пояснил уже, что для исключения ложных срабатываний при передаче нечисловых значений

  • @anzarsh
    @anzarsh 4 года назад +1

    Возникают 2 вопроса:
    1. Применяют ли 4 способ в реальной практике на фронте?
    2. Почему многие отказываются от парадигмы ООП?

  • @olezhonnv3215
    @olezhonnv3215 4 года назад +2

    Функциональщина - дикий оверхед. Массив маппится в массив, потом еще форичем на каждый элемент по вызову функции.
    А потом на планшете з 1 гигом озу свернул ютуб, открыл фейсбук через хром и все - назад в ютуб уже видео не то, что свернул, а по новой его надо включать.
    Ну так, реакт/редакс...

    • @JohnWickMovie
      @JohnWickMovie 3 года назад

      Ну это если язык не поддерживает ленивые вычисления

  • @deniskulakov682
    @deniskulakov682 4 года назад +1

    Для меня ООП подход - это что то что облегчает реализацию. Но разработка такого подхода заключается в том что надо на столько "деградировать" в мышлении что бы декомпозировать. И на простом примере это уже сложно, а если задача реальная, то если не получится "деградировать" то все рассыпится на стадии реализации. Соер как научится "деградировать"?

  • @asd-sl1kv
    @asd-sl1kv 4 года назад +1

    вот ты мужик любишь джаваскриптик

  • @fun6789
    @fun6789 4 года назад

    Это видео наглядно показывает почему ФП вытесняет ООП, особенно на js

  • @rellez5442
    @rellez5442 4 года назад +1

    8:59 создастся массив от 1 до 99)

  • @egorselyanin9739
    @egorselyanin9739 3 года назад

    Функциональная парадигма, говорите? А почему не на Хаскеле тогда?
    themonadreader.files.wordpress.com/2014/04/fizzbuzz.pdf

  • @user-ch1vx2yp5s
    @user-ch1vx2yp5s 4 года назад

    если вы уже и делаете обучение для новичков, то не учите их писать код, как во 2-м примере ( если (условие) вернуть тру, а нет так вернуть фолс) , кто так пишет ? а вернуть просто результат условия нельзя? чисто оверхед... return условие, так же в функция isFizzBuzz должна просто возвращать результат функции isFizz && isBuzz.

  • @daniilzyubin2865
    @daniilzyubin2865 4 года назад +1

    Понять не могу - волосы в синий покрашены или это с цветами в видосе что-то?

    • @lollopin3362
      @lollopin3362 4 года назад

      С цветокоррекцией что-то

  • @evgenasd8892
    @evgenasd8892 4 года назад

    какой паттерн применить нужно и нужен ли воопще паттерн? Лайк что бы Sorer разъяснил, как абстрактно представить задачу с использованием паттерна. Что поможет научить себя?

  • @kuzymaks180
    @kuzymaks180 4 года назад

    соер а ты похудел сильно)

  • @kyrylo_alekseev
    @kyrylo_alekseev 4 года назад

    Как насчёт принципа читаемости кода?

  • @alikhanmukhanaliyev2857
    @alikhanmukhanaliyev2857 4 года назад

    Вау. Иду покупать патрона для доступа к стримам по архитектуре

  • @user-sn7pp1uz6m
    @user-sn7pp1uz6m 4 года назад

    22:55 прикольно, а где больше об этом узнать можно? впервые с таким сталкиваюсь

  • @SergeyPopovX
    @SergeyPopovX 4 года назад +3

    В смысле сложно гарантировать неизменяемость объектов? Object.freeze/seal/...? Это неотменяемые операции. Также сильно разочаровал в части про флаги вид функции с телом аля:
    if ()
    return true;
    return false
    Когда достаточно:
    return ()

    • @S0ERDEVS
      @S0ERDEVS  4 года назад

      Не всегда достаточно:
      function a(n) {
      if (n % 5) { return true; }
      return false;
      }
      function b(n) {
      return n % 5;
      }
      a('a') === false; // true
      b('a') === false; // false

    • @SergeyPopovX
      @SergeyPopovX 4 года назад

      @@S0ERDEVS это не Boolean Expression.
      В данном случае более выразительно будет
      return n % 5 !== 0;

    • @SergeyPopovX
      @SergeyPopovX 4 года назад

      @@S0ERDEVS ну и в JS символы это строки длины 1, а не как в C, char-ы, с которыми можно производить арифметические действия.

    • @SergeyPopovX
      @SergeyPopovX 4 года назад

      @@S0ERDEVS Кстати, всегда возможно флаги привести к булеву типу без использования if: используя Boolean(...) или !!(...), например. Ещё чаще можно использовать какой-нибудь осмысленный оператор сравнения.

    • @S0ERDEVS
      @S0ERDEVS  4 года назад

      @Sergey Popov
      В том и проблема, что выражение может не являются булевым, а программист посчитает его булевым. И да, можно для каждой ситуации думать является выражение булевым или нет, и использовать разные варианты оформления, а можно автоматизировать навыки и использовать более безопасные конструкции, которые менее восприимчивы к ошибкам программиста. Но все равно, у тебя будет использоваться неявный контракт функции, которая будем меняться в зависимости от условия в return.
      Если проще, то в предложенном тобой варианте программист должен контролировать является ли его выражение булевым, в противном случае он нарушит контракт на функцию, в моем случае даже если программист ошибается в выражении и оно оказывается при определенных данных не булевым, контракт функции не меняется.
      Тут можно говорить о куче принципов безопасного программирования "явное лучше неявного", "Fail fast"
      и т.д., которые сводятся к отсечению вариантов неожиданного поведения и локализации проблемы в одном месте.
      В твоем случае, если кто-то решит упростить вариант до "return n % 5;", то в результате появится куча дополнительных состояний на выходе функции. И этим человеком, кстати, можешь быть ты сам, потому что одно дело разбирать простые задачки сосредоточившись на десятке строк, а другое дело писать сотни строчек кода и держать десятки аспектов во внимании.
      Это как у профессиональных водителей - круче не тот, кто гоняет быстрее, а тот кто не создает аварийных ситуаций.

  • @mou8285
    @mou8285 4 года назад

    Если возможно, выводи код с номерами строк, так на него проще ссылаться

  • @DimonEx
    @DimonEx 4 года назад

    В четвертом примере Java немного расплескалась по JavaScript? Познавательно, но зачем?

  • @user-vu6hn4ul2i
    @user-vu6hn4ul2i 3 года назад

    Посоветуй что нибудь хорошее по архитектуре?

    • @snky_
      @snky_ 3 года назад

      SICP

  • @shamilsalakhutdinov5519
    @shamilsalakhutdinov5519 4 года назад

    Мне эта задача на экзамене в школе 21 попалась)

    • @user-vu6hn4ul2i
      @user-vu6hn4ul2i 3 года назад

      Этой задаче 100 лет в обед. Классика, хуле.

  • @palychbasist
    @palychbasist 4 года назад

    Напишем в структурном стиле и с флагами. Ну тут вроде как все хорошо читается, НО большие проблемы с расширением, а структурный вариант еще и не протестируешь. А теперь напишем в функциональном стиле! Ну вот написали, да, вот функциональный стиль, идем дальше.

  • @mmclist9926
    @mmclist9926 4 года назад

    ждём четвёртой реализации на brainfuck :)