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

Поділитися
Вставка
  • Опубліковано 1 гру 2024

КОМЕНТАРІ • 57

  • @СергейКозырев-щ9щ
    @СергейКозырев-щ9щ 10 місяців тому

    Очень полезное видео. Спасибо!

  • @4uikina
    @4uikina 2 роки тому +1

    Ясно, чисто, понятно. Должно стать привычкой для каждого.

  • @АлексейДергачев-ф5ч

    Отличная инфа, спасибо!

  • @shahriyor_m14
    @shahriyor_m14 3 роки тому +2

    Коротко чётко и ясно =) Респект бро 🥇

  • @dmitrijponkin
    @dmitrijponkin 4 роки тому +3

    Очень интересно и полезно :))
    Спасибо Вам!!!

  • @maximvinnikov7002
    @maximvinnikov7002 4 роки тому +3

    Чистый код - спокойный сон!;) Как всегда, спасибо!

  • @eugeniuszjarocki109
    @eugeniuszjarocki109 4 роки тому +3

    все четко и по делу, прям не к чему придраться! Я бы давал ссылку на данный видос девелоперам как эталон хорошего кода :)

  • @rudinandrey
    @rudinandrey Рік тому +1

    5:05 мне верхний Bad код кажется более понятным чем второй.

  • @ДаниилНестеренко-г3ф

    3:14 я бы тут поспорил, длина имени переменной напрямую зависит от времени ее жизни(величины контекста) => "l" отлично подходит, вот если бы у тебя стрелочная функция состояла строк так из 10 и больше, тогда уместно было бы использовать "location"

  • @grommaks
    @grommaks 4 роки тому +7

    9:15 может показаться что геттеры и сеттеры нужно использовать всегда, я сначала так и подумал)
    Это справедливо для языков типа php, c# или java. Но в js можно их добавлять тогда, когда будет нужно

  • @Brick87Game87
    @Brick87Game87 4 роки тому

    Отличное видео.

  • @DiamondStudioYouTube
    @DiamondStudioYouTube 4 роки тому

    Good job 👏

  • @k0alk0
    @k0alk0 4 роки тому +6

    Хорошие советы, спасибо.
    Единственное, что бросилось в глаза: функция isActiveClient (ua-cam.com/video/XT6XkIJIVbA/v-deo.html) далеко не такая простая, как может показаться из её названия. Выглядит как функция, которая «залезет» в переданный объект и проверит одно-два поля; но на самом деле реализация «идёт» в базу за записью и проверяет уже полученные из базы данные. С separation of concerns и single-responsibility principle у этой конкретной функции не очень.

    • @siarheilabetsik5658
      @siarheilabetsik5658 3 роки тому

      Более того, в этом примере вместо одного цикла forEach теперь появился второй цикл (filter). Почему было не оставить один foreach, в котором if(isActiveClient) вызывать?

  • @Epenckorn
    @Epenckorn 4 роки тому +6

    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 не нужен.

    • @amiv220
      @amiv220 Місяць тому

      Всё верно, прям с языка снял.

  • @old-empire
    @old-empire 4 роки тому +5

    Более полная информация из видео
    Оригинал на Анг: github.com/ryanmcdermott/clean-code-javascript
    Перевод на русский:
    github.com/ryanmcdermott/clean-code-javascript

  • @Its_Hack
    @Its_Hack 4 роки тому

    thank u

  • @rudinandrey
    @rudinandrey Рік тому

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

  • @zzhanat4905
    @zzhanat4905 3 роки тому +5

    извините,но звук на заднем фоне сильно мешает(

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 роки тому +1

      Да, я уже понял что звук в видео такого формата был лишним

    • @testingcoder
      @testingcoder 3 роки тому

      @@YauhenKavalchuk а мне если честно со звуком больше заходит. Вот ведь, на вкус и цвет фломастеры разные!

  • @drak0an
    @drak0an 3 роки тому

    5:30 "Не используйте флаги как аргумент функции". Goog не делает то же самое что Bad. Собственно пропущена функция проверки. А когда она будет написана, она будет вызывать две функции и передавать им аргумент имя. Который надо иметь в той же области видимости, что и флаг. И так мы ничего не выигрываем (ну кроме двух названий функций, что часто бывает хорошо, но речь шла не об этом)

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 роки тому +2

      Не совсем так. В идеальном мире нужно создать 3 функции. 2 исполняют какой-то код, а 3-я принимает флаг и в зависимости от него вызывает либо первую, либо вторую. Но на реальных кейсах это игнорируется и всё выполняется в рамках одной функции

    • @Andredy89
      @Andredy89 3 роки тому

      @@YauhenKavalchuk Потому что оптимизация ради оптимизации - зло. Так и тут, чисто с человеческой точки зрения - только больше запутаешься.. 3 функции, вместо одной, чтобы проверить флаг.... ну бред же) Такими темпами можно до целого отдельного сервиса с API дорасти, чтобы флаг проверить или парочку))

  • @ЕкатеринаБелова-ж1р

    Делайте, пожалуйста, музыку на фоне тише, а то мешает воспринимать информацию)

    • @YauhenKavalchuk
      @YauhenKavalchuk  2 роки тому

      В будущих выпусках учёл это

  • @МаксимИсаев-ъ5о

    У этих правил литературная основа? Это из книги или из опыта?

    • @YauhenKavalchuk
      @YauhenKavalchuk  Рік тому +1

      Литературная, книга «чистый код»

  • @frookkiesilver4805
    @frookkiesilver4805 4 роки тому

    А про html закончился курс или будут еще видео?

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 роки тому +1

      Ещё 2 видео. Этот четверг и следующий вторник

  • @p_levin
    @p_levin 4 роки тому

    Да, всё это норма.

  • @Wimmful
    @Wimmful 4 роки тому +17

    лучше записывать const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000

    • @grommaks
      @grommaks 4 роки тому

      @@ЮрийГребенюк-ы6у Не нужно считать, сложнее допустить ошибку)

    • @grommaks
      @grommaks 4 роки тому +1

      @@ЮрийГребенюк-ы6у много книг и документаций рекомендуют время представлять как колво часов в дне * кол минут в часе * кол секунд в минуте * кол миллисекунд в секунде. Дополнительной нагрузки это не вызывает, но сразу виден процесс получения числа.

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 роки тому +3

      Да всё верно написали, математическое умножение часов/дней и т.д. Очень частно используется. Чуть позже, Добавлю этот кейс в репозиторий

    • @Epenckorn
      @Epenckorn 4 роки тому +1

      @@ЮрийГребенюк-ы6у потому что:
      1) возможность модификации (вот нужно тебе будет заменить 24 на 8 или на 11 в каком-нибудь калькуляторе рабочего времени для сбора статистики - подставил изменяемую переменную и не надо "const MILLISECONDS_IN_A_WORK_DAY = MILLISECONDS_IN_A_DAY / 24 * 11")
      2) читается лучше
      3) ошибиться не получится

  • @MrNagios
    @MrNagios 3 роки тому

    на каком языке эти примеры?

  • @adelkrashenninnikov102
    @adelkrashenninnikov102 4 роки тому

    7:10 - создавать дополнительный интерфейс вместо сигнатуры функции - ошибка по бритве Оккама. Не вижу проблемы для линтеров указывать на неиспользуемые аргументы, кроме того, линтеры могут указать на недостаток аргументов при использовании этой функции. И не могут этого сделать при передаче всех аргументов как свойства объекта

  • @stanislavsh6582
    @stanislavsh6582 2 роки тому

    Может быть я не оч хороший знаток JS, но чет пример на 10:59 - нифига не строитель.

    • @YauhenKavalchuk
      @YauhenKavalchuk  2 роки тому

      🤷‍♂️

    • @stanislavsh6582
      @stanislavsh6582 2 роки тому

      ​@@YauhenKavalchuk Ну, опять же, я может быть не знаю достаточно JS. Но в других языках это выглядит, будто на метод build - будет возвращаться один и тот же инстанс объекта.
      В контексте билдера - так быть не должно. Билдер - пораждающий паттерн, и при методе build - должен возвращаться новый экземпляр.
      Может быть в JS - по другому - и будет возвращена копия, но я что-то сомневаюсь.
      Так вот, если я таки прав и возвращается один и тот же инстанс - воспользовавшись в двух местах программы одним и тем же "билдером" из примера - программист получит очень веселый и довольно трудноуловимый баг, когда у него непонятно почему изменяются свойства объекта.

  • @rudinandrey
    @rudinandrey Рік тому

    правило что функция должна делать только одно действие - ну кто это придумал? )))))))) сначала себе напридумывают правил, потом страдают.

    • @YauhenKavalchuk
      @YauhenKavalchuk  Рік тому

      Это не я придумал. Данное видео - это "выжимка" из книги "Чистый код" Роберт Мартин

    • @rudinandrey
      @rudinandrey Рік тому

      @@YauhenKavalchuk а найдете место где это написано?