FizzBuzz четыре варианта решения на JS
HTML-код
- Опубликовано: 9 сен 2024
- #soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwaree...
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/...
GitHub - github.com/soe...
Чат для программистов - / discord
Группа ВК - codeart...
00:00 Введение
01:10 Структурное программирование
04:20 Программирование с флагами
07:15 Функциональное программирование
10:22 Архитектура решения
18:00 ООП
Исходники - www.patreon.com/posts/41484631
Легче без бумаги
Видно, половина комментаторов не поняли, о чем видео... надо было отдельно подчеркнуть, что прелесть ООП не чувствуется на учебных примерах, нужен большой код) На мелких можно только показать принцип, как это выглядит...
@@optimusprime9456 ну это вина демонстратора, который на таком коротком коде пытается показать преимущества ООП. Он же такой пример выбрал.
С другой стороны, если пример будет жирный - все уснут на середине.
Отличный пример ООП. Не знание этих приёмов является частой причиной, по которой люди говорят, что в IT не войти - не берут на работу.
В то же время это отличный пример, как из 10 строчек абсолютно работающего и удовлетворительного кода можно развернуть целый листинг без изменения функциональности.
Если сюда добавить еще продакт оунера, проджект менеджера, тим лида, тестировщика и бухгалтерию - то вокруг этой задачи можно построить IT компанию Fizz Buzz Corp с бюджетом равным бюджету города Саратова.
Иногда достаточно написать 10 строчек работающего кода силами одного программиста и запустить продукт ))
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 цифры и меняется смотри где именно!
Нужно больше архитектуры и ООП на канале, банальные вещи везде разжеваны, а чуть глубже копнешь и всё - тьма.
полностью поддерживаю
Так в этом всё ООП. Красиво там только на примере с кошечкой мяу и собачкой гав-гав. Но попробуй реализовать таким образом хотя бы всё семейство кошачих. Получишь название интерфейсов на 5 строк, по классу на каждый метод или swith-case лапшу внутри (что ересь).
@@crutchmaster9637 ооп ооп рознь. Для разных задач существуют разные архитектурные шаблоны. Для кошечек и собачек обратите внимание на ECS шаблон проектирования. Для API MVC. Для интерфейсов MVVM + flux и т.д.
@@konstantinsemenov1627 ECS для ООП - это всё равно, что делать EAV для РСУБД. Проще говоря, ооп тут будет уже не при чём.
гугли на английском
Извращения из мира программирования, прикольно ) Началось с легкой эротики
Началось с петтинга )
А концовка в виде BDSM
5. Использовать микросервисную архитектуру.
6. Использовать MapReduce, чтобы можно было задачу решить на кластере
:)
Что почитать чтобы заложить правильную архитектуру на старте?
7. Обучить нейроночку.
8. Нейрозапрограммировать собеседующего, что ты выполнил задачу
@@Gregory-vc2vs нейтрализовать собеседующего.
@@evgenasd8892 чистая архитектура. Роберт Мартин
07:17 Какая красота! ФП - райское наслаждение :)))
Мир нуждается в таких видосах! Спасибо сенсей, все круто!
Бритва окамы порезала вены от этого видоса
😂😏
Комменты делятся на два типа:
90% ООП говно, зачем так усложнять?
10% Блин, нужно изучать архитектуру
Приветствую.
Буквально на днях, в одном JS чате, ради прикола написал решение этой задачи в одну строчку в ФП стиле.
Мне сказали, что люди так не пишут, обвинили в ереси и наверное сожги бы на костре, ибо функция то работала, а они не понимали как.
Тут до меня дошло, что они никогда не видели Perl или Lisp :)
Но увидев твой SOLID.... В общем, я понял, что в плане троллинга мне еще есть куда расти.
Браво!
Строчку в студию.
@@moon.trance ну третье решение из видео.
Покажи в одну строчку, пожалуйста. Интересно сравнить с моей.
А я то думал что знаю ооп..........
Вот это да.... Женя выдал.... - тыща к самооценке
Функциональное решение - это гамма эмоций. Сначала такой "ЧЁ Б..?", а потом "ОГО!!! Круто! Тоже так хочу"
Красава! Когда под рукой появилась эта задачка не мог оставить ее в покое, постоянно усложнял реализацию... ты указал на мой пробел, архитектуры реально не хватает, а я концентрировался на структурах и алгоритмах. Красава!)
Очень хорошо обучающий ролик по архитектуре) хотелось бы больше таких) с разными примерами и паттернами)
Я вдохновился вашим примером и тоже наговнякал
console.log(...[...Array(100).keys()].map(i=>(++i%3==0?"Fizz":'')+(i%5==0?"Buzz":'') || i))
Зачем до 100 (от 0 до 100 будет 101 елемент), если после инкремент все равно первым выполняется (а не проверка условия на 0)
@@mykola_antal я просто тестил на 10 элементах, и в итоговом варианте дописал 0 и всё
CodeWars любит подобные примеры))
Жесть! Попробовал то же самое на Пуктоне написать, думал не прожуёт такую дичь. А нет получилось...
print(*map(lambda i: ('Fizz' if i % 3 == 0 else '') + ('Buzz' if i % 5 == 0 else '') or i, range(1, 101)))
Изначально, то что сам придумал, было раза в два длиннее. Никогда бы не додумался, что так можно, если бы этот пример не увидел...
Я бы "Программирование с флагами" , в функции isFizzBuzz вместо явного выражения добавил вызов двух предыдущих. Вот тебе и расширяемость. Вдруг для Fizz условие поменяется? Не менять же его везде
function isFizzBuzz(n)
{
return isFizz(n) && isBuzz(n);
}
Учись=)))!!!Условия можно и в переменную сделать!
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);
Зачем менять условия в условии=)).Их всего лишь два же.Возьмем в локальную либо глобальную переменную и всё!!!После используй их!
@@mikaelgevorgyan4521 Ну ты крут. Что-то вроде анонимных классов. А "!" это ж вроде отрицание? Я в JS не особо, пока что писал только на ++, Delphi, FoxPro, 1C. Но все впереди.
@@mikaelgevorgyan4521 во-первых, работать не будет: ff объявлена через экспрешн ниже места, где используется; fb нужно всё равно оборачивать в фигурные скобки, т.к. у тебя не в одну строку.
Во-вторых, а что ты нового привносишь в уже показанные решения?
@@mikaelgevorgyan4521 ну и return из ff нет.
@@mikaelgevorgyan4521 ff=i, fb=x - а зачем эти двойные присвоения?
В ооп варианте тоже есть фатальный недостаток. Он заключается в названии класса TagNumRulesCollection. Как рос бы лапшекод в первом варианте, также будут расти названия и количество классов с 1 методом в 4-м. Правильнее ли это? Возможно. Но иногда бывает абсолютно избыточно. Встречал такое, что вместо 10 строчек кода делали 20 классов и интерфейсов, в итоге вместо добавления одной строчки надо было наследовать 3 класса. С тех пор у меня психотравма и при виде ООП начинает трясти.
Хотелось бы еще посмотреть на декларативный вариант.
Спасибо за разбор задачи FizzBuzz с примерами решений. Очень полезно и интересно! Даёшь отдельный ролик про SOLID. А может и серию роликов )
Спасибо за видео, почерпнул новое, функциональное программирование мне ближе к сердцу, но по опыту работы с легаси кодом все больше склоняюсь к ООП и понимаю что для бизнеса на серьезных проектах использование различных паттернов и соблюдение солид должно быть прописано в договоре найма сотрудников. К сожалению создание похожих архитектур для меня еще является довольно сложной задачей
Так вот почему все врёмя не хватает новым программам памяти и производительности процессора!!!!
да, потому что от функциональщины куча проверок и потерь на неверных предположениях процессора о ветвлении кода )
@@P1oN4ik Не хватает писателям понимания, что код хороший тогда, когда он интуитивно понятен даде новичку и использует всем известные паттерны. А зная паттерны, вся архитектура как карта, и добавить новое поведение намного быстрее и проще. Не нужно выделываться в сокращениях.
Видео класс!
Vyacheslav Gvorus согласен что зная паттерны- архитектура как карта, Но как научиться самому выбрать верный паттерн для задачи?
@@vyacheslavgvorus3883 Ойщ какие паттерны последняя😁😂🤣,даже смотреть не за хотелось мне!!!Там заворухо классов,в которых не увидел смысла FrizzBuss.Говорит об функциональности,а сам классы пишет=)))!!!Функциональность сила в JS.Функциональность это и есть динамичность и преимущество в нём!!!Просто надо уметь писать.А так же первый вариант был прощще и читабельнее.Просто надо найти подход.А не писать классы 😁😁,даже в реакте мало преимуществ у классов чем в функционале=))!!
@@mikaelgevorgyan4521 А ничо, что это пример? А на простых примерах невозможно понять, в чем смысл ООП. Он хорошо раскрывается только на больших программах.
Спасибо за видео, Соер, был бы рад увидеть на канале больше нативного js и решения часто встречаемых задач)
Нифига он умный👍👍👍
Потрясающее видео, сам натыкался на собеседовании на такую задачу, когда устраивался программистом.
Сейчас раскопал, посмотрел свое решение, делал ifками, но в отдельном для этого классе, старался следовать mvc
Меня все таки взяли, но увидев 4-ое решение, я готов аплодировать стоя. Отличный пример проектирования сложных архитектурных систем на пальцах) Спасибо большое)
Хочется полный разбор с принципами SOLID, чтобы понять их на примере, это всегда проще, чем теория)
Интересно подаете материал, часто стал вдохновляться вашими видео, по больше про js и python!))Если возможно!)
Спасибо большое, давно ищу хоть какую то информацию по разбору архитектуры.
OOP решение (да впрочем и почти все остальные) нарушает ОСНОВНОЙ принцип программирования - KISS.
"...нарушает ОСНОВНОЙ принцип программирования - KISS MY ASS..."
Что за принцип?
Фигня, вопрос лишь в уровне решения и его задачах
@@ms-33 keep it simple, stupid. Короче, не усложняй без надобности.
Вы же понимаете, что это искусственный пример? Намерено взята максимально простая задача, чтоб вы как зритель могли сосредоточится на парадигмах программирования, а не на осознании поставленной задачи? ООП в принципе рассчитано на декомпозицию сложной логики с целью упростить ее понимание. Вне этого контекста это стрельба из пушки по воробьям.
Можно ещё так if(value===1) return 1; if (value===2) return 2: if(value===3) return “Fizz” .... if(value===100) return “Bus”
можно, но не нужно - много лишнего кода в котором нет смысла
Спасибо. Часть про ООП помогла осознать достоинства такого подхода. А так же, минуя джунов и мидлов прыгнуть сразу в синьоры, решив тестовое задание в таком стиле. ;)
Последний вариант прям кайф. Помню на собесе уровня Middle давали такую задачку, что было странно.
Шикарный урок. Спасибо.
Круто! Очень доступно
Почему-то никто не заметил что во втором примере все три оператора if лишние, надо сразу возвращать boolean.
И в ООП MAX_NUM = 100 неверное название, максимальное же по факту 99. Ну и можно его инкапсулировать в еще один класс вместе с циклом, раз уж в ООП стиле делаем.
Какое же это классное видео!
Спасибо!
В последнем примере от дефолтного значение лучше избавиться в find. в TagNameRule можно передавать что-то вроде билдера тега, а не готовый тег. внутри find инстанцировать тег билдером, передавая ему num.
так появится новое правило в коллекции, к которому можно будет написать стратегию TrueCondition.
если find ничего не нашел, возвращать nil
таким способом все правила будут описаны в коллекции правил, а логика дефолтного значения уйдет из того места, где вызывается find
Сторонник первого варианта. Все просто и понятно. Если задача решается просто, зачем усложнять? всеми любимый KISS. Если мы знаем о будущих изменениях, или думаем наперед и предполагаем изменения, то возможно другие подходы лучше. Switch(true) для меня ад. можно например в том же if (isBuzz(i)) структуру не менять.
Если это вопрос на архитектуру - спору нет.
Если вопрос на "сделай" - для меня лучше чем первое решение нет. Разве можно избавится от magic Numbers.
как получить такие навыки в проектировании: что читать, где учить?
можете дать список литературы?
в любом случае спасибо - понял сколько всего нужно изучать
Большие компании, окружение специалистов в этой области на голову выше, и конечно же практика. Литература конечно хорошо, но лучше ее читать во время решения задач или попытке понять почему было принято какое то конкретное решение
А у меня столько раз проектирование не оправдовало дальнейшее расширение проекта, что я поддержу вопрос в комментарии: что почитать чтобы верно определить необходимый паттерн для проектирование архитектуры задачи?
@@mykola_antal спс, но это я и сам понимаю) много работать, много учить, думать и анализировать)
Попробуй "Программист-прагматик", 2е издание
@@ivankiselev8672 спс, посмотрю)
Хотел тоже сделать подобный ролик, но еще добавить рекурсию 😀Теперь видимо не буду 🙂 По ООП хорошо объяснил
Огонь!
Крутяк! Спасибо за видео
Что делать, если не понял ООП подход? Как это вообще, что это? Я пересмотрел уже несколько раз. Что нужно знать, чтобы так мыслить? И как вообще понять, какой подход мне нужен? Подскажите, пожалуйста.
Почитал много комментариев ниже, не особо помогло, конечно, хотелось бы книжку какую-то, но я пробовал читать Мартина про чистую архитектуру, там сложно...
В этом проблема многих програмистов, вот простая же была задача, зачем туда лепить вот это 17:38? От прочтения цикла и пары-тройки ифов ещё никто не умирал, зато думаю постоянно разбирая вот такие Орхитектуры, сделанные для простых задач, можно словить раннюю аневризму
"От прочтения пары-тройки `(десятков)` ифов" умирают часы у других программистов, которым требуется поддержать твой код. Была простая задача, использовали непростой подход. Проблемой видео было решение задачи? Нет, проблемой видео было показать подход к решению задачи. Сегодня ты смотришь на решение ФизБаз, завтра тебе потребуется начать реализацию нового проекта, и тебе сразу станет понятно - понял ты то, что хотел донести автор, или не понял.
@@user-ft9fw5gn3o Да нет, не умирают, зашёл, прочитал, понял, быстро дописал ещё иф если нужно. А чтобы разобраться как блин взаимодействуют классы в той архитектурной колбасе, как раз часы и тратятся.
Проблемой видео не было, но люди насмотрятся таких видео, наслушаются что паттерны это круто и начинают пихать их просто везде.
И видел я такие проекты. Например один из последних, написан по всем канонам Microsoft best practices, паттерны, микросервисы, технологии, вот это всё, реально толково написаны. Чел это писал полтора года, в нерабочее время. А просто и понятно это можно было написать за месяц, во всё то же нерабочее время и поддерживать это смог бы мидл, даже не крепкий, а в итоге поддерживают синьоры, потому что мидлы в нём разобраться просто не могут.
вау-как четко и интересно
не совсем понял что такое тег и что значит тегирование?
Я думал что начал понимать программирование, но господин СОЕР просто взял и поставил на место.
Идеально мне понравилось
Вообще, идея тегирования очень крутая - по сути наша нейросеть работает по методу тегирования, где совокупность определенных связей и весов обозначена каким-то тегом(в данном случае отедльный неройн - это уже тэг) А вся нейросеть - это иерархия тегов. Только имена им никто не дает. А дальше, когда уже тег образовался, по сути он может отдавать своё значения выше или ниже другим, чтобы те образовывали свои на их базе теги. Т.е. если нейрон ответственнен на данном уровне за горизонтальную линию, то это изображение он тегирует тогда, когда видит эту линию на изображении. Только тут ещё и с процентами теги, а не бинарные. (Четкие и нечеткие теги :) )
Может создать свой язык на основе тегов? :) И там будет уже не ООП, а Тегировано Ориентированное Программирование. :)
Соер, оцени FizzBuzz от Мурыча. Тебе понравился!😂
Мой любимый js!
только вчера решал эту задачу на codewars для RSSchool))
почему числа в константы не вывели понятно, но строковые fizz и buzz не лучше ли тут вывести в private final variables?)
Спасибо!
18:36 Что здесь значит нижнее подчеркивание у аргумента?
подчеркиванием принято обозначать protected property в JavaScript
Человеку, который на собеседовании решает эту задачу последним способом, не надо перезванивать.
Смысл fizzbuzz в том, что старые процессоры не имели аппаратного блока деления, и поэтому решения с mod или делением сильно проседали по времени выполнения по сравнению с решениями без. Но видимо это настолько забыто, что даж старичок Соер не в курсе.
Классическое "правильное" решение - это два счетчика для 3 и 5, которые инкрементятся, потом типа counter3 ==3 => print(Fizz); counter3=0
А в JS break на switch, не на цикл for?
За видео плюс!
Не очень понимаю претензий "на фига тут ООП подход"? Понятно, что конкретно в FizzBuzz так никто не делает. А вот когда тебе говорят "результат надо вывести в консоль, но вообще-то мы у заказчика не уточняли"... не грех задуматься над модифицируемостью кода, и тогда ООП - то что доктор прописал
А так и бывает- чёткого ТЗ никто не делает и если писать так как есть, то позже выясняется, когда заказчик предъявляет «ваша программа не работает, переделывайте!», о других деталях, которые типа «подразумевались как само собой разумеющееся», однако тебя никто о них не извещал.
Привет, как тебе такое решение? Как вообще относишься к подобному стилю написания кода?
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();
Крутое видео!)
На 6:24 ESlint ругался бы
if (n % 5 === 0) {
return true
}
return false
попросил бы заменить на
return n % 5 === 0
Я хоть и не eslint, но тоже удивился зачем так писать, мож кто подскажет?
какую книгу надо прочитать чтобы хотя бы примерно приблизиться к такому ООП?)
было интересно. можете рассказать про unit тесты?
а есть что-нибудь про протокольно ориентированного программирования?
SOLID +
Так вот для чего нужны паттерны проектирования: чтобы писать многостраничные портянки ужасного, заумного объектно-ориентированного кода, с кучей аллокаций, фрагментирующих память и насилующих сборщик мусора...
При чём для решения простых задач
осталось только перемешать два последних способа
Я js не знаю, но первые три примера более-менее понятны. Но в ООП такое накрутили... Мне бы понять, приведенный пример кода вообще рабочий или это только некий каркас?
Сделал данную задачку на С# на случай, если тут будут люди, которые захотят сами разобрать принцип работы каждого из стилей без необходимости мучаться с JS =) github.com/Zodt/FizzBuzz/
Первый - твой FizzBuzz, четвертый - FizzBuzz сына маминой подруги
Не JavaScript но пример интересный. Взято где-то из интернета, мне показалось лаконичным. Вариант который печатает только заданные числа
for i = 1; i
Это go
Верно, но пример чисто для наглядности. Вдруг кому-то пригодиться
@@MaximRovinsky чем решение отличается от первого в видео?
отличие первого варианта, что код выводит только те числа, которые нам нужны (а не всех подряд) + другой подход проверки. Пример просто для подумать, для расширение кругозора
Но ведь тут в коде сразу же ошибка. По условию дано 100 чисел. Цикл i = 1; i < 100; i++ работает с 99
В нынешнее время эта задачка не имеет смысла почти, раньше там соль была в том, чтобы не использовать %, так как процессор не имел аппаратного блока деления, а значит операция % была очень затратна, и смысл был в том чтобы в такой простой задаче об этом помнить
сейчас это спиномозговая трата времени
Раньше - это когда?
@@S0ERDEVS во времена популярности x86 и десктопного софта
@az_guitar, а можно все же подробнее, что вы имеете в виду? Ну просто эта задачка стала популярной сильно позже, чем 80е годы прошлого века.
Даже если предположить, что Вы правы и соль в аппаратном делении, то в 1992 появились первые пентиумы и получается, что уже лет 30 эта задачка не актуальна и давно должна кануть в лету.
@@S0ERDEVS в компилируемых языках разница есть до сих пор, так как даже аппаратное деление в пентиумах сильно дороже например инкремента
и оптимальное решение выглядит так, что заводятся два счетчика, для 3 (count3) и для 5 (count5), каждый цикл они инкрементятся, а если count3==3 или count5==5 - значит текущее число делится на 3 или 5, счетчик потом зануляем
В языках типа javascript, php и прочее скорее всего разницы не будет, в языка ближе к железу - будет до сих пор.
Без этой особенности эта задача уровня второй по счету лабораторной на основах программирования
Современные процессоры делают одно деление за 1 такт, можно даже больше чем одно деление, если использовать SIMD инструкции, то и 4 деления в один такт можно запихать.
Но с инкрементом решение интересное, спасибо.
С каждым годом только всë больше разочаровываюсь в ооп. Прав был Алан Кэй =(
Я в javascript =))) функционал люблю.Короче проще и читабельнее!😎😎😎
ООП решение - это не решение задачи про FizzBuzz. Это называется оверинжиниринг. У физбаза одна цель - отсечь людей, которые вообще не умеют писать код, а не найти системного архитектора - для этого есть другие вопросы. Если вас на собеседовании когда-нибудь попросят решить физбаз, никогда не пишите ООП вариант из этого видео.
@Sergey Khval, чего так пафосно-то?
А где стримы можно найти?
Спасибо за видео. Третье решение поставило меня в тупик: сижу и думаю, как это реализовать на Nim lang
у меня получилось что-то такое:
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..
Лапшекод и оверинжиниринг в чистом виде
Использование тэга для вывода чисел отдает костылем. Вам так не кажется?
Во втором примере стоило бы isFizz и isBuzz переиспользовать :)
Почему в функциональном решении gen, fizz и buzz объявлены как константы?
Потому, что в js так можно
В ООП ошибка в выводе будет. дописал немного кода codepen.io/igor-sushko/pen/JjKKwmY
По идее, достаточно return true обернуть для стратегии AND в условие this.conditions.length - 1 == i
Очень понятно объясняешь, спасибо ! Скажи пожалуйста что такое true в switch 4:44. В ней же должно быть i. ???
Это значение, которе будет сравниваться с кейсами.
Свич проверияет все условия по очереди, и где условие выдаёт true, там выходит через break.
А для чего вместо return условие возвращать отдельно true и false разными строками?
@@MisterGenix чтобы уточнить, что функция возвращает булево значение. Для наглядности
Степан Савельев там Соер ниже пояснил уже, что для исключения ложных срабатываний при передаче нечисловых значений
Возникают 2 вопроса:
1. Применяют ли 4 способ в реальной практике на фронте?
2. Почему многие отказываются от парадигмы ООП?
Функциональщина - дикий оверхед. Массив маппится в массив, потом еще форичем на каждый элемент по вызову функции.
А потом на планшете з 1 гигом озу свернул ютуб, открыл фейсбук через хром и все - назад в ютуб уже видео не то, что свернул, а по новой его надо включать.
Ну так, реакт/редакс...
Ну это если язык не поддерживает ленивые вычисления
Для меня ООП подход - это что то что облегчает реализацию. Но разработка такого подхода заключается в том что надо на столько "деградировать" в мышлении что бы декомпозировать. И на простом примере это уже сложно, а если задача реальная, то если не получится "деградировать" то все рассыпится на стадии реализации. Соер как научится "деградировать"?
вот ты мужик любишь джаваскриптик
Это видео наглядно показывает почему ФП вытесняет ООП, особенно на js
8:59 создастся массив от 1 до 99)
Функциональная парадигма, говорите? А почему не на Хаскеле тогда?
themonadreader.files.wordpress.com/2014/04/fizzbuzz.pdf
если вы уже и делаете обучение для новичков, то не учите их писать код, как во 2-м примере ( если (условие) вернуть тру, а нет так вернуть фолс) , кто так пишет ? а вернуть просто результат условия нельзя? чисто оверхед... return условие, так же в функция isFizzBuzz должна просто возвращать результат функции isFizz && isBuzz.
Понять не могу - волосы в синий покрашены или это с цветами в видосе что-то?
С цветокоррекцией что-то
какой паттерн применить нужно и нужен ли воопще паттерн? Лайк что бы Sorer разъяснил, как абстрактно представить задачу с использованием паттерна. Что поможет научить себя?
соер а ты похудел сильно)
Как насчёт принципа читаемости кода?
Вау. Иду покупать патрона для доступа к стримам по архитектуре
22:55 прикольно, а где больше об этом узнать можно? впервые с таким сталкиваюсь
В смысле сложно гарантировать неизменяемость объектов? Object.freeze/seal/...? Это неотменяемые операции. Также сильно разочаровал в части про флаги вид функции с телом аля:
if ()
return true;
return false
Когда достаточно:
return ()
Не всегда достаточно:
function a(n) {
if (n % 5) { return true; }
return false;
}
function b(n) {
return n % 5;
}
a('a') === false; // true
b('a') === false; // false
@@S0ERDEVS это не Boolean Expression.
В данном случае более выразительно будет
return n % 5 !== 0;
@@S0ERDEVS ну и в JS символы это строки длины 1, а не как в C, char-ы, с которыми можно производить арифметические действия.
@@S0ERDEVS Кстати, всегда возможно флаги привести к булеву типу без использования if: используя Boolean(...) или !!(...), например. Ещё чаще можно использовать какой-нибудь осмысленный оператор сравнения.
@Sergey Popov
В том и проблема, что выражение может не являются булевым, а программист посчитает его булевым. И да, можно для каждой ситуации думать является выражение булевым или нет, и использовать разные варианты оформления, а можно автоматизировать навыки и использовать более безопасные конструкции, которые менее восприимчивы к ошибкам программиста. Но все равно, у тебя будет использоваться неявный контракт функции, которая будем меняться в зависимости от условия в return.
Если проще, то в предложенном тобой варианте программист должен контролировать является ли его выражение булевым, в противном случае он нарушит контракт на функцию, в моем случае даже если программист ошибается в выражении и оно оказывается при определенных данных не булевым, контракт функции не меняется.
Тут можно говорить о куче принципов безопасного программирования "явное лучше неявного", "Fail fast"
и т.д., которые сводятся к отсечению вариантов неожиданного поведения и локализации проблемы в одном месте.
В твоем случае, если кто-то решит упростить вариант до "return n % 5;", то в результате появится куча дополнительных состояний на выходе функции. И этим человеком, кстати, можешь быть ты сам, потому что одно дело разбирать простые задачки сосредоточившись на десятке строк, а другое дело писать сотни строчек кода и держать десятки аспектов во внимании.
Это как у профессиональных водителей - круче не тот, кто гоняет быстрее, а тот кто не создает аварийных ситуаций.
Если возможно, выводи код с номерами строк, так на него проще ссылаться
В четвертом примере Java немного расплескалась по JavaScript? Познавательно, но зачем?
Посоветуй что нибудь хорошее по архитектуре?
SICP
Мне эта задача на экзамене в школе 21 попалась)
Этой задаче 100 лет в обед. Классика, хуле.
Напишем в структурном стиле и с флагами. Ну тут вроде как все хорошо читается, НО большие проблемы с расширением, а структурный вариант еще и не протестируешь. А теперь напишем в функциональном стиле! Ну вот написали, да, вот функциональный стиль, идем дальше.
ждём четвёртой реализации на brainfuck :)