☑️ АРГУМЕНТЫ ФЛАГИ
Очень часто при расширении существующего функционала или даже создании нового разработчики добавляют аргументы флаги в функции. Скорее всего вы встречали такой код, возможно даже сами его пишете.
Рассмотрим пример кода (очень близко к тому, который я встретил в реальном проекте), который делает запрос за данными, получает список пользователей, и выводит их на страницу:
Этот код используется во многих частях проекта, чтобы его не дублировать, мы вынесем его в отдельную функцию. Обычная практика DRY.
Все хорошо, но клиент требует показывать лоадер при обновлении пользователей (т. е. при вызове данной функции). Но лоадер нужно показывать не всегда, а только при вызове из определенных мест в коде. Простым решением может показаться добавление флага (или даже нескольких):
В зависимости от переданного аргумента выполняется конкретная логика: либо мы отображаем список пользователей без лоадера либо с ним.
Получившийся код оказывается очень сложным для чтения, для понимания и нарушает множество принципов проектирования. Чтобы понять, что делают эти методы нам нужно заглядывать в названия параметров функции. Потому что вызов UserFacade.update(true) и UserFacade.update(false) не дают абсолютно никакого понимания о том, что происходит внутри.
Мне встречались подобные методы принимающие 4(!) аргумента, 3 из которых были флагами. Выглядело это примерно так:
Мало того, что аргументов слишком много, так еще и совершенно не понятно что они делают.
Этот метод использовался во многих местах, а время на рефакторинг не было, я переписал его так, чтобы он принимал объект.
Теперь можно понять что мы меняем без перехода к исходникам, но стало не намного лучше.
Улучшить код в примере с UserFacade можно следующим образом. Переписать UserFacade и userComponent так, чтобы они не принимали флаги.
Код стал чище, понятнее, а функции теперь вообще не принимают никаких аргументов.
И в подтверждение моих слов цитата из книги Роберта Мартина «Чистый код»:
«Аргументы-флаги уродливы. Передача логического значения функции — воистину ужасная привычка. Она немедленно усложняет сигнатуру метода, громко провозглашая, что функция выполняет более одной операции…»
Очень часто при расширении существующего функционала или даже создании нового разработчики добавляют аргументы флаги в функции. Скорее всего вы встречали такой код, возможно даже сами его пишете.
Рассмотрим пример кода (очень близко к тому, который я встретил в реальном проекте), который делает запрос за данными, получает список пользователей, и выводит их на страницу:
const users = await userService.fetch();
userComponent.render(users);
Этот код используется во многих частях проекта, чтобы его не дублировать, мы вынесем его в отдельную функцию. Обычная практика DRY.
const UserFacade = {
update: async () => {
const users = await userService.fetch();
userComponent.render(users);
}
}
Все хорошо, но клиент требует показывать лоадер при обновлении пользователей (т. е. при вызове данной функции). Но лоадер нужно показывать не всегда, а только при вызове из определенных мест в коде. Простым решением может показаться добавление флага (или даже нескольких):
const UserFacade = {
update: async (showLoader = false) => {
if (showLoader) { // показываем лоадер если нужно
userComponent.renderLoader(true);
}
const users = await userService.fetch();
userComponent.render(users);
userComponent.renderLoader(false); // скрываем лоадер в любом случае
}
}
UserFacade.update
и userComponent.renderLoader
теперь принимают флаги true
и false
.В зависимости от переданного аргумента выполняется конкретная логика: либо мы отображаем список пользователей без лоадера либо с ним.
Получившийся код оказывается очень сложным для чтения, для понимания и нарушает множество принципов проектирования. Чтобы понять, что делают эти методы нам нужно заглядывать в названия параметров функции. Потому что вызов UserFacade.update(true) и UserFacade.update(false) не дают абсолютно никакого понимания о том, что происходит внутри.
Мне встречались подобные методы принимающие 4(!) аргумента, 3 из которых были флагами. Выглядело это примерно так:
SomeFacace.updateSomeData(uuid, true, false, true)
Мало того, что аргументов слишком много, так еще и совершенно не понятно что они делают.
Этот метод использовался во многих местах, а время на рефакторинг не было, я переписал его так, чтобы он принимал объект.
SomeFacace.updateSomeData(uuid, {
showLoader: true,
updateCases: false,
scrollToCase: true
});
Теперь можно понять что мы меняем без перехода к исходникам, но стало не намного лучше.
Улучшить код в примере с UserFacade можно следующим образом. Переписать UserFacade и userComponent так, чтобы они не принимали флаги.
const UserFacade = {
updateWithLoader async () => {
userComponent.showLoader();
await this.update();
userComponent.hideLoader();
},
update: async () => {
const users = await userService.fetch();
userComponent.render(users);
}
}
Код стал чище, понятнее, а функции теперь вообще не принимают никаких аргументов.
И в подтверждение моих слов цитата из книги Роберта Мартина «Чистый код»:
«Аргументы-флаги уродливы. Передача логического значения функции — воистину ужасная привычка. Она немедленно усложняет сигнатуру метода, громко провозглашая, что функция выполняет более одной операции…»
☑️ ВОПРОСЫ НА СОБЕСЕДОВАНИИ #3
Третья статья про вопросы на собеседовании, в этот раз про СSS каскад.
Два предыдущих поста про вопросы на собеседовании:
#1 https://t.me/frontend_tips/16
#2 https://t.me/frontend_tips/27
Третья статья про вопросы на собеседовании, в этот раз про СSS каскад.
Два предыдущих поста про вопросы на собеседовании:
#1 https://t.me/frontend_tips/16
#2 https://t.me/frontend_tips/27
Telegraph
ВОПРОСЫ НА СОБЕСЕДОВАНИИ #3
На всех собеседованиях и в тестах на знание Frontend проверяется знание каскада CSS. Сегодня разберем несколько моментов в которых часто допускают ошибки: 🔻 Задание #1 При таком CSS:
☑️ РУКОВОДСТВО ПО ФОРМАТИРОВАНИЮ ТЕКСТА В HTML & CSS
Знакома ситуация на картинке ниже?
Решаем проблему с выпаданием текста за контейнер правильно и красиво.
Перед ознакомлением просьба ответить на один вопрос:
Знаете ли вы о существовании тега
Знакома ситуация на картинке ниже?
Решаем проблему с выпаданием текста за контейнер правильно и красиво.
Перед ознакомлением просьба ответить на один вопрос:
Знаете ли вы о существовании тега
wbr
в HTML?Telegraph
Сложности с переносом строк. HTML & CSS приёмы.
Встречаются ситуации когда у контейнера недостаточно ширины для размещения контента внутри. Как на картинке выше. Существует множество приёмов для форматирования текста который вылезает за пределы блока. Разберем хорошие и не очень средства расположения текста…
☑️ JavaScript tips & tricks #1 Массивы
Полезные практики написания кода связанные с массивами, которые делают код более лаконичным.
Полезные практики написания кода связанные с массивами, которые делают код более лаконичным.
Telegraph
JavaScript tips & tricks #1 Массивы
✅ Обрезать массив.Альтернативой методу slice можно переопределить его свойство length следующим образом: ✅ Оставить уникальные элементы массива. До ES6 выделение уникальных значений потребовало бы намного больше кода, чем в примере выше. ✅ Фильтровать ложные…
☑️ Разбор одного из вопросов, которые мне задавали на собеседовании на должность senior front-end developer в международные и украинские конторы.
Собственно сам вопрос с объяснениями.
Собственно сам вопрос с объяснениями.
Telegraph
Асинхронность, микрозадачи и Event loop в одном вопросе
Этот популярный вопрос на собеседованиях по JavaScript встречается в разных вариациях, но суть примерно одинакова. Прочитайте следующий пример кода и скажите в каком порядке произойдет вывод сообщений. Вероятно вы знаете, или слышали что-то про v8, однопоточность…
☑️ Тесты на знание JavaScript
Встречали такие тесты, в которых приведены примеры кода и нужно сказать что он вернет после исполнения?
Их часто задают на собеседованиях или даже до, чтобы отсеять кандидатов.
Так же, стало модно создавать такие в разных компаниях для привлечения внимания разработчиков (и сбора контактов конечно же).
На очередной такой я наткнулся на dou_ua.
Возможно, некоторые из вас видели Luxoft JavaScript quiz (была реклама на главной) или даже проходили его.
Вопросы были подобраны из разных областей JS и как по мне, тест получился интересным.
Я сделал разбор некоторых технических вопросов c объяснениями.
Welcome: https://telegra.ph/Ocherednoj-JavaScript-test-12-25
Встречали такие тесты, в которых приведены примеры кода и нужно сказать что он вернет после исполнения?
Их часто задают на собеседованиях или даже до, чтобы отсеять кандидатов.
Так же, стало модно создавать такие в разных компаниях для привлечения внимания разработчиков (и сбора контактов конечно же).
На очередной такой я наткнулся на dou_ua.
Возможно, некоторые из вас видели Luxoft JavaScript quiz (была реклама на главной) или даже проходили его.
Вопросы были подобраны из разных областей JS и как по мне, тест получился интересным.
Я сделал разбор некоторых технических вопросов c объяснениями.
Welcome: https://telegra.ph/Ocherednoj-JavaScript-test-12-25
Telegraph
Разбор Luxoft JavaScript quiz
Совсем недавно компания Luxoft проводила JS Quiz, ссылка на который висела на главной странице dou.ua. В котором можно было выиграть футболку или повербанк. К слову, я выиграл футболку, так как у меня было 13 правильных ответов (из 15 возможных). Не хватило…
Вернулся после долгого перерыва и продолжаю делать контент с новым графиком.
Ждите статьи по понедельникам и четвергам 🗓
Идей для постов собралось много!
Stay tuned 📡
Про особенности JavaScript ходят легенды. Сегодня постараемся прояснить одну из них.
Ждите статьи по понедельникам и четвергам 🗓
Идей для постов собралось много!
Stay tuned 📡
Про особенности JavaScript ходят легенды. Сегодня постараемся прояснить одну из них.
Telegraph
Function и Object экземпляры друг друга
Объяснение, почему Function является экземпляром Object, и наоборот.
☑️ МЕТОДЫ ПРИМИТИВОВ И БОКСИНГ В JAVASCRIPT
Все типы данных в JavaScript делятся на примитивы и объекты. Примитивы не могут иметь собственных свойств и методов, объекты могут. Почему свойства работают на примитивах и что такое боксинг.
Все типы данных в JavaScript делятся на примитивы и объекты. Примитивы не могут иметь собственных свойств и методов, объекты могут. Почему свойства работают на примитивах и что такое боксинг.
Telegraph
Методы примитивов и боксинг в JavaScript
Из документации:
☑️ ЧТО ТАКОЕ ECMASCRIPT И ЧЕМ ЭТО ОТЛИЧАЕТСЯ ОТ JAVASCRIPT
Язык JavaScript изначально так назвали в надежде извлечь выгоду из успеха Java.
Позднее JavaScript прошел стандартизацию в ECMA International.
Это привело к появлению нового языкового стандарта, известного как ECMAScript.
Проясняем разницу между ES и JS здесь.
Язык JavaScript изначально так назвали в надежде извлечь выгоду из успеха Java.
Позднее JavaScript прошел стандартизацию в ECMA International.
Это привело к появлению нового языкового стандарта, известного как ECMAScript.
Проясняем разницу между ES и JS здесь.
Telegraph
Разница между JavaScript & ECMAScript
JavaScript - это язык сценариев (скриптов) для улучшения взаимодействия пользователя с веб-страницей. Но что такое ECMAScript? Какая связь между ECMAScript и JavaScript? Когда я гуглил о ECMAScript, я обнаружил много использованных однострочных определений…
☑️ ДЕКЛАРАТИВНОЕ И ИМПЕРАТИВНОЕ ПРОГРАММИРОВАНИЕ
На волне популярности React и прочих библиотек/фреймворков люди забывают о читаемости и думают только о красоте кода. Почему стоит смотреть на этот вопрос по другому - тут.
На волне популярности React и прочих библиотек/фреймворков люди забывают о читаемости и думают только о красоте кода. Почему стоит смотреть на этот вопрос по другому - тут.
Telegraph
Никого не волнует ваш стиль программирования
Окей, некоторых людей да, но не ваш компьютер.
☑️ АЛЬТЕРНАТИВЫ РЕШЕНИЯ ТИПИЧНЫХ ЗАДАЧ
Если максимально декомпозировать любую задачу – она сводится к похожим, конкретным кускам кода, которые мы пишем каждый день.
Собрал несколько альтернативных вариантов решения таких задач.
Если максимально декомпозировать любую задачу – она сводится к похожим, конкретным кускам кода, которые мы пишем каждый день.
Собрал несколько альтернативных вариантов решения таких задач.
Telegraph
Альтернативы решения типичных задач
Мне часто приходится выступать в роли ментора: в офисе (для junior разработчиков) на курсах (для совсем начинающих) И в связи с этим приходится читать много javascript кода написанного неопытными разработчиками. Также, схожий код часто встречается у разработчиков…
☑️ ДОСТУПНЫЙ FRONT-END #1
Цикл статей для улучшения доступности приложений.
Будем разбирать как сделать так, чтобы вашим сайтом/веб-приложением хотелось пользоваться.
Первая статья про упрощение взаимодействия с формами.
Цикл статей для улучшения доступности приложений.
Будем разбирать как сделать так, чтобы вашим сайтом/веб-приложением хотелось пользоваться.
Первая статья про упрощение взаимодействия с формами.
Telegraph
HTML-атрибуты для упрощения двухфакторной аутентификации
В этой статье мы рассмотрим и атрибуты HTML, которые помогут ускорить двухфакторную аутентификацию пользователей. Обычная форма Когда вы реализуете двухфакторную аутентификацию для веб-приложения, возможно, вам потребуется форма для ввода пользователем однократного…
Привет, спасибо, что читаете!
Появилась идея коротких постов. С упором на визуальный контент и не занимающий много времени на прочтение и осмысление. В телеграмм мне нравится делать большие посты с детальным разбором и описанием или переводить интересные статьи. Есть же вещи, про которые хочется рассказать, но для отдельного поста информации маловато, а собрать что-то схожее не совсем получается.
Для этих целей теперь есть инстаграмм WiseJS.
Многие из вас меня знают только по постам здесь. Исправим это постом знакомства.
PS: Небольшой quiz в стори!
Появилась идея коротких постов. С упором на визуальный контент и не занимающий много времени на прочтение и осмысление. В телеграмм мне нравится делать большие посты с детальным разбором и описанием или переводить интересные статьи. Есть же вещи, про которые хочется рассказать, но для отдельного поста информации маловато, а собрать что-то схожее не совсем получается.
Для этих целей теперь есть инстаграмм WiseJS.
Многие из вас меня знают только по постам здесь. Исправим это постом знакомства.
PS: Небольшой quiz в стори!
Instagram
𝗙𝗿𝗼𝗻𝘁-𝗲𝗻𝗱|𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁|𝗛𝗧𝗠𝗟|𝗖𝗦𝗦
#пост_знакомство ⠀ Всем привет👋 Меня зовут Погребняк Максим, я профессиональный js-разработчик и Front-end ментор. И сегодня я расскажу некоторые факты о себе: ⠀ - моя карьера разработчика началась с курсов по Front-end; ⠀ - имею степень магистра и мое высшее…
☑️ ВЕБДОСТУПНІСТЬ HTML #2
Який сенс використовувати тег
Пост українською 🇺🇦.
Який сенс використовувати тег
section
і чому вам треба звернути увагу на article
.Пост українською 🇺🇦.
Telegraph
article чи section?
З появою стандарту HTML5 ми почали більше дбати про доступність та семантику вебсторінок. Більшість розробників надають перевагу тегам і , та зовсім не використовють . Чому так? Це одна з вічних таємніць веброзробки, як і «чому це white-space: nowrap…
☑️ ЗАЧЕМ _ В АТРИБУТЕ target у ССЫЛОК
Атрибут
Но почему его значения начинаются с
Атрибут
target
определяет, где открывать документ, на который указывает ссылка.Но почему его значения начинаются с
_
?Telegraph
Почему значения атрибута target="_blank" начинается с подчеркивания
HTML-ссылки создаются с помощью элементов . Ссылки представляют собой связь между двумя ресурсами, одним из которых является текущий документ. По умолчанию, при переходе по ссылке документ открывается в текущем окне или фрейме. При необходимости, это условие…
☑️ CONTEXT и SCOPE
Проводил недавно собеседования.
Спрашивал про scope и context в JavaScript.
Примерно половина людей думает что это одно и то же, а другая половина путается и теряется.
Особенно важно обратить внимание начинающим разработчикам.
Разбираемся вместе.
Проводил недавно собеседования.
Спрашивал про scope и context в JavaScript.
Примерно половина людей думает что это одно и то же, а другая половина путается и теряется.
Особенно важно обратить внимание начинающим разработчикам.
Разбираемся вместе.
Telegraph
Разница между контекстом (context) и областью видимости (scope) в JavaScript
Спрашивая данный вопрос на собеседованиях, начинающие и даже некоторые опытные разработчики путают эти, казалось бы, базовые понятия. Scope – область видимости Область видимости определяет, есть ли у вас доступ к переменной. До введения let и const область…
☑️ ОТРИЦАТЕЛЬНЫЙ margin
Существует несколько точек зрения на использование отрицательного значения, как резко негативное, так и положительное.
Разбираемся в том, что же это такое: хак или обычное значение?
Существует несколько точек зрения на использование отрицательного значения, как резко негативное, так и положительное.
Разбираемся в том, что же это такое: хак или обычное значение?
Telegraph
Все что следует знать про отрицательные margin в CSS
В верстке мы повсеместно используем CSS свойство margin для внешних отступов и горизонтального выравнивания. Вероятно вы встречали, или использовали и отрицательные margin.
☑️ 10 способов скрыть элементы в CSS
Иногда появляется необходимость скрыть некоторые элементы с сайта (блоки, картинки, DIV и так далее), либо просто скрыть текст при помощи CSS. Для этого существует несколько различных способов, которые отличаются по эффекту. Далее вы можете узнать о них.
Иногда появляется необходимость скрыть некоторые элементы с сайта (блоки, картинки, DIV и так далее), либо просто скрыть текст при помощи CSS. Для этого существует несколько различных способов, которые отличаются по эффекту. Далее вы можете узнать о них.
Telegraph
10 способов скрыть элементы в CSS
Существует несколько способов скрыть элемент в CSS, но они отличаются тем, как они влияют на доступность, анимацию, производительность и обработку событий. Анимация Некоторые опции скрытия CSS – это все или ничего. Элемент либо полностью видим, либо полностью…
🎉 КАНАЛУ 1 ГОД 🎉
Спасибо что читаете!
В связи с этим, и пролонгацией карантина я решил сделать бесплатный онлайн курс по front-end разработке.
Заинтересовало?
Детали в соответствующем канале: https://t.me/free_front_end
Спасибо что читаете!
В связи с этим, и пролонгацией карантина я решил сделать бесплатный онлайн курс по front-end разработке.
Заинтересовало?
Детали в соответствующем канале: https://t.me/free_front_end