Просто о Чистом коде и качестве кода (Code Quality & Clean Code)

  Рет қаралды 24,386

webDev

webDev

Күн бұрын

#YauhenK #webDev #ПростоО #CleanCode
Добро пожаловать в 5-й выпуск видео каста «Просто о».
В котором мы с вами поговорим о таких понятиях, как Clean Code и Code Quality. А так же рассмотрим основные правила, которые помогают в написании чистого кода.
✒ Полезные ссылки:
✔ Правила из выпуска: github.com/YauhenKavalchuk/us...
✒ Timeline:
✔ 0:00 - Введение
✔ 1:12 - Требования к переменным
✔ 4:35 - Требования к функциям
✔ 8:45 - Требования к объектам
✔ 9:46 - Требования к классам
✔ 11:00 - Требования к тестам
✔ 11:29 - Требования к асинхронному коду
✔ 12:59 - Форматирование
✒ Полный список готовых и планируемых курсов:
✔ Trello: trello.com/b/R6rD7qq8
✒ Автор курса:
✔ KZfaq: / yauhenkavalchuk
✔ Instagram: / yauhenkavalchuk
✔ Twitter: / yauhenkavalchuk
✔ VK: YauhenKavalchuk
✔ LinkedIn: / yauhenkavalchuk
✔ GitHub: github.com/YauhenKavalchuk
✔ VK (Группа): webdevcom
✒ Поддержать развитие канала: github.com/YauhenKavalchuk/yo...

Пікірлер: 56
@dmitrijponkin
@dmitrijponkin 4 жыл бұрын
Очень интересно и полезно :)) Спасибо Вам!!!
@user-ui5ds7qd8k
@user-ui5ds7qd8k 5 ай бұрын
Очень полезное видео. Спасибо!
@YauhenKavalchuk
@YauhenKavalchuk 5 ай бұрын
Пожалуйста
@maximvinnikov7002
@maximvinnikov7002 4 жыл бұрын
Чистый код - спокойный сон!;) Как всегда, спасибо!
@shahriyor_m14
@shahriyor_m14 3 жыл бұрын
Коротко чётко и ясно =) Респект бро 🥇
@YauhenKavalchuk
@YauhenKavalchuk 3 жыл бұрын
Благодарю)
@4uikina
@4uikina Жыл бұрын
Ясно, чисто, понятно. Должно стать привычкой для каждого.
@YauhenKavalchuk
@YauhenKavalchuk Жыл бұрын
👍
@user-ir2gm8tr8x
@user-ir2gm8tr8x 2 жыл бұрын
Отличная инфа, спасибо!
@YauhenKavalchuk
@YauhenKavalchuk 2 жыл бұрын
Пожалуйста!
@eugeniuszjarocki109
@eugeniuszjarocki109 4 жыл бұрын
все четко и по делу, прям не к чему придраться! Я бы давал ссылку на данный видос девелоперам как эталон хорошего кода :)
@DiamondStudioYouTube
@DiamondStudioYouTube 3 жыл бұрын
Good job 👏
@old-empire
@old-empire 4 жыл бұрын
Более полная информация из видео Оригинал на Анг: github.com/ryanmcdermott/clean-code-javascript Перевод на русский: github.com/ryanmcdermott/clean-code-javascript
@user-ng7jj2mv4l
@user-ng7jj2mv4l 3 жыл бұрын
3:14 я бы тут поспорил, длина имени переменной напрямую зависит от времени ее жизни(величины контекста) => "l" отлично подходит, вот если бы у тебя стрелочная функция состояла строк так из 10 и больше, тогда уместно было бы использовать "location"
@grommaks
@grommaks 4 жыл бұрын
9:15 может показаться что геттеры и сеттеры нужно использовать всегда, я сначала так и подумал) Это справедливо для языков типа php, c# или java. Но в js можно их добавлять тогда, когда будет нужно
@Brick87Game87
@Brick87Game87 3 жыл бұрын
Отличное видео.
@YauhenKavalchuk
@YauhenKavalchuk 3 жыл бұрын
Спасибо
@k0alk0
@k0alk0 4 жыл бұрын
Хорошие советы, спасибо. Единственное, что бросилось в глаза: функция isActiveClient (kzfaq.info/get/bejne/jrpmi856r6-6knU.html) далеко не такая простая, как может показаться из её названия. Выглядит как функция, которая «залезет» в переданный объект и проверит одно-два поля; но на самом деле реализация «идёт» в базу за записью и проверяет уже полученные из базы данные. С separation of concerns и single-responsibility principle у этой конкретной функции не очень.
@siarheilabetsik5658
@siarheilabetsik5658 3 жыл бұрын
Более того, в этом примере вместо одного цикла forEach теперь появился второй цикл (filter). Почему было не оставить один foreach, в котором if(isActiveClient) вызывать?
@Its_Hack
@Its_Hack 3 жыл бұрын
thank u
@YauhenKavalchuk
@YauhenKavalchuk 3 жыл бұрын
My pleasure
@Epenckorn
@Epenckorn 4 жыл бұрын
5:08 - как по мне, версия, обозначенная "Bad", читается куда легче и она решает одну конкретную задачу - выполнение email для всех активных пользователей. Дальнейшая декомпозиция излишня. Кроме того, когда тебе дают чужой проект на 120 файлов, хрен найдёшь этот isActiveClient, его наоборот надо компоновать, а не разбивать. Главные принципы декомпозиции в том, чтобы: - метод был читаем, - были понятны зависимости, - описание всего метода помещалось на одном экране Остальное - это прихоти. 6:19 - Как раз при масштабировании и надо пристыковывать дополнительные функции, вместо внедрения дополнительной логики в первичную. Например есть у вас функция валидации формы. Изначально в ней были только текстовое поле, поле телефона и область текстового ввода. И вы изначально сделали просто одну проверку телефона. Добавилось у вас поле mail и вот тут надо не пихать свитчкейс в функцию валидации, а вынести проверку телефона и mail в отдельные функции, пристыковав их к первичной. И не надо писать отдельную функцию для получения введённых данных, ссылаясь на SRP. Это самый простой пример. 6:52 - Отрицаний бояться - в логику не лезть. Всегда старайтесь писать условие так, чтобы then был короче else, если else предполагается. Конкретно в этом примере Bad не потому, что отрицание в условии, а потому, что функция возвращает значение, которое для наличия then нужно инвертировать. Сам пример говорит о том, чтобы не допускать двойного отрицания.
@drak0an
@drak0an 3 жыл бұрын
Любопытно, почему "писать условие так, чтобы then был короче else, если else предполагается."? Разверните подробнее, пожалуйста.
@Epenckorn
@Epenckorn 3 жыл бұрын
@@drak0an а что тут разворачивать? С нарастанием кода в then может быть запихано ещё несколько десятков строк, включая дополнительные условные операторы со своими else. И чтобы при просмотре кода не пытаться понять, к какому if относится тот или иной else, желательно, чтобы if и его else находились как можно ближе друг к другу. В противном случае единственным способом понять, к какому if относится интересующий вас else, станет скрол туда-сюда и поиск нужной строки. Да, есть подсветка границ блока, но она может скосячить, да и придётся заново искать нужные скобки каждый раз, возвращаясь к этому блоку. Да, есть масштабирование окна редактора, но редактировать код, когда размер символа 5-8 пикселей - такое себе. Куда проще, если if и его else находятся на одном экране. Если же логика подразумевает какие-то операции ТОЛЬКО в случае соответствия условию, то тут и else не нужен.
@serious_psychologist
@serious_psychologist Жыл бұрын
5:05 мне верхний Bad код кажется более понятным чем второй.
@serious_psychologist
@serious_psychologist Жыл бұрын
а функция которая сейчас занимает 10 строк, через год может стать 10 функциями. в общем сами по себе правила вроде понятные, но выводы на основе них можно сделать неоднозначные и обязательно понимать, что это не догма, вот только так и не иначе.
@Wimmful
@Wimmful 4 жыл бұрын
лучше записывать const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000
@grommaks
@grommaks 4 жыл бұрын
@@user-fy5mt9pp9p Не нужно считать, сложнее допустить ошибку)
@grommaks
@grommaks 4 жыл бұрын
@@user-fy5mt9pp9p много книг и документаций рекомендуют время представлять как колво часов в дне * кол минут в часе * кол секунд в минуте * кол миллисекунд в секунде. Дополнительной нагрузки это не вызывает, но сразу виден процесс получения числа.
@YauhenKavalchuk
@YauhenKavalchuk 4 жыл бұрын
Да всё верно написали, математическое умножение часов/дней и т.д. Очень частно используется. Чуть позже, Добавлю этот кейс в репозиторий
@Epenckorn
@Epenckorn 4 жыл бұрын
@@user-fy5mt9pp9p потому что: 1) возможность модификации (вот нужно тебе будет заменить 24 на 8 или на 11 в каком-нибудь калькуляторе рабочего времени для сбора статистики - подставил изменяемую переменную и не надо "const MILLISECONDS_IN_A_WORK_DAY = MILLISECONDS_IN_A_DAY / 24 * 11") 2) читается лучше 3) ошибиться не получится
@p_levin
@p_levin 4 жыл бұрын
Да, всё это норма.
@YauhenKavalchuk
@YauhenKavalchuk 2 жыл бұрын
👍
@drak0an
@drak0an 3 жыл бұрын
5:30 "Не используйте флаги как аргумент функции". Goog не делает то же самое что Bad. Собственно пропущена функция проверки. А когда она будет написана, она будет вызывать две функции и передавать им аргумент имя. Который надо иметь в той же области видимости, что и флаг. И так мы ничего не выигрываем (ну кроме двух названий функций, что часто бывает хорошо, но речь шла не об этом)
@YauhenKavalchuk
@YauhenKavalchuk 3 жыл бұрын
Не совсем так. В идеальном мире нужно создать 3 функции. 2 исполняют какой-то код, а 3-я принимает флаг и в зависимости от него вызывает либо первую, либо вторую. Но на реальных кейсах это игнорируется и всё выполняется в рамках одной функции
@Andredy89
@Andredy89 2 жыл бұрын
@@YauhenKavalchuk Потому что оптимизация ради оптимизации - зло. Так и тут, чисто с человеческой точки зрения - только больше запутаешься.. 3 функции, вместо одной, чтобы проверить флаг.... ну бред же) Такими темпами можно до целого отдельного сервиса с API дорасти, чтобы флаг проверить или парочку))
@frookkiesilver4805
@frookkiesilver4805 4 жыл бұрын
А про html закончился курс или будут еще видео?
@YauhenKavalchuk
@YauhenKavalchuk 4 жыл бұрын
Ещё 2 видео. Этот четверг и следующий вторник
@zzhanat4905
@zzhanat4905 3 жыл бұрын
извините,но звук на заднем фоне сильно мешает(
@YauhenKavalchuk
@YauhenKavalchuk 3 жыл бұрын
Да, я уже понял что звук в видео такого формата был лишним
@testingcoder
@testingcoder 3 жыл бұрын
@@YauhenKavalchuk а мне если честно со звуком больше заходит. Вот ведь, на вкус и цвет фломастеры разные!
@adelkrashenninnikov102
@adelkrashenninnikov102 4 жыл бұрын
7:10 - создавать дополнительный интерфейс вместо сигнатуры функции - ошибка по бритве Оккама. Не вижу проблемы для линтеров указывать на неиспользуемые аргументы, кроме того, линтеры могут указать на недостаток аргументов при использовании этой функции. И не могут этого сделать при передаче всех аргументов как свойства объекта
@user-mu4my8fq2e
@user-mu4my8fq2e Жыл бұрын
У этих правил литературная основа? Это из книги или из опыта?
@YauhenKavalchuk
@YauhenKavalchuk Жыл бұрын
Литературная, книга «чистый код»
@user-os2eb6nm1h
@user-os2eb6nm1h Жыл бұрын
Делайте, пожалуйста, музыку на фоне тише, а то мешает воспринимать информацию)
@YauhenKavalchuk
@YauhenKavalchuk Жыл бұрын
В будущих выпусках учёл это
@MrNagios
@MrNagios 2 жыл бұрын
на каком языке эти примеры?
@YauhenKavalchuk
@YauhenKavalchuk 2 жыл бұрын
JavaScript
@stanislavsh6582
@stanislavsh6582 Жыл бұрын
Может быть я не оч хороший знаток JS, но чет пример на 10:59 - нифига не строитель.
@YauhenKavalchuk
@YauhenKavalchuk Жыл бұрын
🤷‍♂️
@stanislavsh6582
@stanislavsh6582 Жыл бұрын
​@@YauhenKavalchuk Ну, опять же, я может быть не знаю достаточно JS. Но в других языках это выглядит, будто на метод build - будет возвращаться один и тот же инстанс объекта. В контексте билдера - так быть не должно. Билдер - пораждающий паттерн, и при методе build - должен возвращаться новый экземпляр. Может быть в JS - по другому - и будет возвращена копия, но я что-то сомневаюсь. Так вот, если я таки прав и возвращается один и тот же инстанс - воспользовавшись в двух местах программы одним и тем же "билдером" из примера - программист получит очень веселый и довольно трудноуловимый баг, когда у него непонятно почему изменяются свойства объекта.
@serious_psychologist
@serious_psychologist Жыл бұрын
правило что функция должна делать только одно действие - ну кто это придумал? )))))))) сначала себе напридумывают правил, потом страдают.
@YauhenKavalchuk
@YauhenKavalchuk Жыл бұрын
Это не я придумал. Данное видео - это "выжимка" из книги "Чистый код" Роберт Мартин
@serious_psychologist
@serious_psychologist Жыл бұрын
@@YauhenKavalchuk а найдете место где это написано?
Просто о ООП (Парадигмы ООП)
21:14
webDev
Рет қаралды 41 М.
FOOLED THE GUARD🤢
00:54
INO
Рет қаралды 62 МЛН
DO YOU HAVE FRIENDS LIKE THIS?
00:17
dednahype
Рет қаралды 22 МЛН
Can You Draw A PERFECTLY Dotted Line?
00:55
Stokes Twins
Рет қаралды 72 МЛН
Просто о SOLID (Принципы SOLID)
15:54
webDev
Рет қаралды 215 М.
5 советов по написанию функций Python
12:44
FOOLED THE GUARD🤢
00:54
INO
Рет қаралды 62 МЛН