Исправляем очень плохой код | Clean Code
Здравствуйте, мои дорогие, это вторая часть видео про клин код, практическая. Наглядно разбираем ошибки и изучаем на практике, что же такое чистый код и принципы его написания.
🔥 Новый поток авторского тренинга Сергея Немчинского GRASP and GoF Design patterns стартует уже 01.02.2024
Регистрация 👉 go.foxminded.ua/4b4M3JI
🧠 Регистрируйся прямо сейчас на менторинг
⬇️ Учись у профи ⬇️
🎓 Менторинг:
JAVA - go.foxminded.ua/3u5V4BF
PYTHON - go.foxminded.ua/48F0dj8
C#/.NET - go.foxminded.ua/3O987tc
ANDROID - go.foxminded.ua/3HoXZbL
FRONT-END (ANGULAR, REACT) - go.foxminded.ua/3O8V62E
SALESFORCE Developer - go.foxminded.ua/47IxGIq
UI/UX дизайн - go.foxminded.ua/3S6s58L
Unreal Engine - go.foxminded.ua/422Ry7S
QA Automation - go.foxminded.ua/3u128Qa
IOS разработка - go.foxminded.ua/3tQ8aTL
PHP - go.foxminded.ua/4be51ho
Unity - go.foxminded.ua/4aV0fFc
NODE.JS - go.foxminded.ua/3S7wc4w
GOLANG - go.foxminded.ua/48XgqQt
Обучение на проекте - go.foxminded.ua/427KoPu
Курсы для новичков - go.foxminded.ua/3O601kQ
🎓Продвинутые курсы для состоявшихся девелоперов:
Enterprise patterns - go.foxminded.ua/3S1g6tn -
Алгоритмы и структуры данных - go.foxminded.ua/424yIwZ
C# NEXT - go.foxminded.ua/4aZcb8V
🔧 Пробное техническое собеседование со специалистом уровня Senior Developer/ Team Leader - go.foxminded.ua/426HL0H
Тайминг:
00:00 - Вступление
00:37 - Названия
06:29 - GRASP and GoF Design patterns
07:03 - Методы
09:42 - Комментарии
13:54 - Плохие комментарии
15:41 - Форматирование
16:23 - Объекты и структуры
18:14 - Классы
19:59 - Правила простого дизайна
👔 Карьерная консультация с Сергеем Немчинским - go.foxminded.ua/48ZGP05
Есть вопросы по обучению в FoxmindEd? Пишите нам в телеграм - t.me/foxminded
Вы можете стать спонсором канала и получать плюшки - / @sergeynemchinskiy
❤ FoxmindEd в Instagram: / foxminded.ua
Сайт FoxmindEd для новичков: go.foxminded.ua/3O9iLQv
Сайт для разработчиков уровня мидл+: go.foxminded.ua/47GqufK
FoxmindEd в ФБ: / foxmindedco
FoxmindEd в Instagram: / foxminded.ua
Мой Telegram: t.me/nemchinskiyOnBusiness
Для деловых запросов: youtube@foxminded.ua
Пікірлер: 104
🔥 Новый поток авторского тренинга Сергея Немчинского GRASP and GoF Design patterns стартует уже 01.02.2024 Регистрация 👉 go.foxminded.ua/4b4M3JI
Сергей, запишите, пожалуйста, видео на тему 'Декомпозиция предметной области'. Существующее видео плохого качества, да и мало кто его найдёт на канале. А тема очень нужная!
@user-ym7zd2ni5o
4 ай бұрын
Поддерживаю, будет очень интересно, с учетом нового опыта и актуальных примеров
@user-ut2lu1kz1v
2 ай бұрын
Да, отличная идея
Было бы интересно узнать от Сергея Немчинского, подробный способ рефакторинга, от Мартина Фаулера, превращение метода в класс.
Спасибо за видео. Такой вопрос: как вы относитесь к такой штуке в VS Code как Codeium, я тут попробовал, мне понравилось, что он за тебя пишет ту часть, которую тебе лень писать, тебе остается только править под свои требования. Какие подводные камни, кроме потакания своей лени?
01:15 Помимо переменной цикла (которая не только 𝑖, но и 𝑗, и даже 𝑘, когда циклы вложенные) есть ещё один случай - когда это координаты, тогда 𝑥, 𝑦 и 𝑧 - вполне нормальные имена. Есть ещё один случай - в языке Perl в функциях сравнения используют однобуквенные переменные 𝑎 и 𝑏, но это уже чисто перловая особенность, которая актуальна только внутри таких функций - в иных местах perlstyle и Perl Best Practices советуют не делать так.
@jewgenijmoldawski3306
3 ай бұрын
Вот еще: c-counter, s-sum, l-length, n-name, e-exception
@shoorick77
2 ай бұрын
@@jewgenijmoldawski3306 мне из всего этого набора часто попадалось только e.
Спасибо большое, интересно было бы так же посмотреть про рефакторинг
@alexandrapersukova
4 ай бұрын
Отлично, запишем
Считается ли нарушением принципа Single Responsibility, если метод одновременно выполняет определенные действия и осуществляет логирование процесса?
Сергей вы с этим циклом роликов про клин код прям в самое время! я только начал искать инфу и обучаться клин кодингу 👍
@alexandrapersukova
4 ай бұрын
Делитесь потом успехами.
Очень наглядно, лаконично и ёмко! Спасибо!
@alexandrapersukova
4 ай бұрын
Спасибо вам!
Сергей, возможно вы сможете рассказать в своем видео. В интернете или у ИИ не смог найти ответ на вопрос. Вот чего я пока что вообще не понимаю: В вакансиях на java developer в требованиях часто указана kafka. Если я java developer, то кроме получения или отправки сообщений в топик kafka, что ещё мне надо знать или уметь?
Все круто , Сергей , если можно , то давайте больше роликов с показание кода и вашем комментированием
Очень понравилось!
9:58 Настал тот час, когда в разговоре Сергея появились украинизмы))
@alexandrapersukova
4 ай бұрын
😅
Интересно, расскажите про рефакторинг
Я джаваскриптизер, понравился анализ. Спасибо!
5:50, я бы сказал AddAndPrint это уже реализационное углубление в названии метода, чем нарушение srp. Что тоже является ошибкой 9:30, стоило бы так-же добавить что рекомендованная длина метода - до 20 линий
Больше примеров богу примеров! Спасибо.
@alexandrapersukova
4 ай бұрын
😊
Сергей, запишите пожалуйста видео как строить код, как разбивать на функции , как выделять классы, конфигурации,
Продолжайте!
@alexandrapersukova
4 ай бұрын
Будем)
Перемнные из одного символа, такие как X и Y, в контексте позиционирования элемента тоже понятны
Не впевнений в останньому прикладі, що створення "під капотом" об"єкта stream, ітерація по ньому обрахування суми (в деякому сенсі reduce) + додаткова робота для GC буде працювати швидше, як стверджує автор, за класичний for-loop. Щодо інших переваг зміненого коду - погоджуюсь.
Как по мне, короткое название метода process() вполне уместно, особенно если класс наследуется от абстрактного AbstractProcessor, где этот метод абстрактный.. Но тогда нужно максимально понятное название подклассов. Тогда такие классы-процессоры можно вызывать, допустим, по расписанию, для выполнения некоторый действий.
Интересно было
@alexandrapersukova
4 ай бұрын
Спасибо
Было бы хорошо поиметь исходный код в гите и его рефакторинг в бранче. Чтобы попытаться самостоятельно повторить весь путь.
А де можна записатись на кар‘єрну консультацію?
@alexandrapersukova
4 ай бұрын
Перше посилання після таймінгу в описі під цим відео
Сергей! Спасибо за прекрасный очередной «урок» в доступном изложении. Clean Code - это то, что очень важно для нас, human’ов. Но что Вы скажете про тренд на то, что AI заменит кодеров и всё то, что для нас важно, станет вообще не важным? Вот первый попавшийся ролик-дискуссия на эту тему kzread.info/dash/bejne/e6drksZsqdK3ps4.html Интересно Ваше мнение на тему актуальности олдскульных подходов. Думаю, оно достойно отдельного разговора.
Интересно узнать про пример рефакторинга от М. Фаулера, про то, как красиво сделать метод классом
@alexandrapersukova
4 ай бұрын
Ваш ответ записан. Сделаем! :)
В интерпретируемых языках короткие имена быстрее обрабатываются ;)
ине всё интересно)☺️
@alexandrapersukova
4 ай бұрын
отлично, включите колокольчик, чтобы не пропускать новые видео и эфиры)
Сергей, это лайк, это подписка, и даже мать его КОЛОКОЛЬЧИК на канал!
@alexandrapersukova
4 ай бұрын
отлично! :)
По поводу первого примера("не сингл респонсибилити") метод возвращает результат. Если просто написать что-то типа System.out.println(d + e); это ж по сути выполнение одной задачи... Почему это не сингл матьевореспонсибилити!? Может в классе больше нечего будет принтить и потому нету смысла создавать отдельный метод...
Блин то класс это только "Моделька и поведение" все остальное от лукавого, то "Используйте simple domain model"
Про тудушки не погоджусь, іноді виникає пробелма, яку потрібно вирішити в іншому таску, щоб скоуп твого таску не розростався, ти ствролєш ТУДУ, але З ПОСИЛАННЯМ на створену таску/багу, яка буде в скоупі якогось релізу або беклозі і буде пофікшена
Вот никогда, кстати, не понимал, зачем джависты в DTO пишут геттеры и сеттеры? Чего там инкапсулировать? Если поменяется формат входящих данных (или исходящих), по любому этот DTO и всё, что с ним связанно, будет переписано. Типа засовывать в DTO логику, чтоб старые геттеры работали с новыми данными? Но он тогда перестаёт быть DTO, разве нет?
@TheLoveKusano
4 ай бұрын
инкапсуляция - одна из основ ооп. и да, через сеттеры можно реализовать валидацию, а через геттеры, например, иммутабельность
@user-nu2jz1sb4s
4 ай бұрын
@@TheLoveKusanoНу если берём чистый паттер DTO, то он ничего валидировать не должен, он должен чисто содержать данные. "Data Transfer Object, в отличие от business object или data access object не должен содержать какого-либо поведения." - из вики.
@jewgenijmoldawski3306
3 ай бұрын
В настоящее время, согласен, это пережиток прошлого т. к. то для чего были getter и setter сейчас решается по-другому.
Скажіть будь-ласка, а оплата частинами можлива? 😁
@alexandrapersukova
4 ай бұрын
Вітаю! Вас цікавить тренінг GRASP and GoF Design patterns? На нього немає оплати частинами як і на інші тренінги. А якщо ви про менторинг, то оплата відбувається помісячно.
@vermilinguas
4 ай бұрын
@@alexandrapersukova дякую за відповідь
@alexandrapersukova
4 ай бұрын
@@vermilinguas І вам! Якщо ще будуть питання, то я буду рада відповісти)
12:50 к черту подробности и комментарии, откуда в этом методе взялась data? В параметрах я её не вижу, а если это член класса, то где this? 🤔
@user-if3cj1uf3d
4 ай бұрын
это поле класса. В джаве для обращения к полю класса this необязательно. this используется только в случае, если есть несколько полей / параметров с таким именем, и нужно явно указать что нужно именно поле класса
@user-vu6hn4ul2i
4 ай бұрын
@@user-if3cj1uf3d прикольно. Выглядит противоречащим философии Java, но, похоже, это так.
@user-if3cj1uf3d
4 ай бұрын
@@user-vu6hn4ul2i не совсем понимаю что ты имеешь ввиду под философией джава. В ней сплошь и рядом встречаются места где что то можно не писать, если это не является необходимым
использование счетчика і в цикле - единственньій случай, когда значение переменной из одной букві всем понятно.. (1:30) class Point {double x, y, z;}; class Vector {double x, y, z;}; ну да, ну да...
Хотим видео про рефакторинг, превращение метода в класс
книга "Чистый код" спорная во многом
Хлопцы, 15:04 - бегом за знаниями - дякуйте
Будет понятно, переменная "х" и "y"))
Мабуть, це найкраще корисне відео на каналі у цьому році. Грунтовне пояснення, доступні приклади. Треба збарегти його собі у закладки, і періодично переглядати.
@alexandrapersukova
4 ай бұрын
ми раді, що вам це відео було корисним
Первый пример как будто обфускатором прошелся
Вітаю! kzread.info/dash/bejne/ZYWNmNybfsy-iZc.html Поясніть будь ласка чому клас User не може мати методів save print а клас UserService має методи saveUser та printUser? На перший погляд можна реалізувати все в класі User. І наче логічніше винести зберігання, видалення, оновлення, редагування юзера в окремі сервіси наприклад SaveUserService і там зробити метод save. Таким чином клас матиме тільки одну причину зміни наприклад оновлення логіки збереження юзера. Дякую)
У меня есть вопрос. Можно учить языки программирования в 14 лет?
@alexandrapersukova
4 ай бұрын
Можно, а почему нет)
@jewgenijmoldawski3306
3 ай бұрын
Я учил детей программированию. Из опыта: в 14 можно, но большинству приходится по ходу дела очень много объяснять вокруг, в зависимости от приложения. Например системы координат, если это игры.
Интересно, лет через десять до жаберов дойдет, что лепить везде геттеры и сеттеры лишено смысла, или так и продолжат цепляться за "а у нас так принято"?
@PredatorAlpha2
4 ай бұрын
У нас, джавистов, часто используется доступ к полям объекта со стороны сторонних библиотек, которые ничего про объект не знают, кроме имени полей - например при сериализации или обработчики вьюх для MVC. И им гораздо быстрее работать через геттеры сеттеры, чем через голую рефлексию. Да и хотел бы я на тебя посмотреть, если тебе понадобиться подменить объект его проксей, например для ленивой загрузки по сети, если на нем не будет геттеров и сеттеров.
@redneck_prm5429
4 ай бұрын
@@PredatorAlpha2 Если библиотека знает имена полей, то зачем там рефлексия? Да и лепить их где попало только на случай "а вдруг нам понадобиться" - как раз приводит к тому, что в итоге лепят уже просто потому, что "так принято", без подключения мозга.
@jewgenijmoldawski3306
3 ай бұрын
Сейчас да, простые геттеры/сеттеры не нужны, т.к. доступ к полям в основном осуществляется через фреймворки. Раньше имело смысл, но эти времена прошли.
Ну последний пример, такое себе... Был нормальный оверлоадинг, простой и понятный любому джуну, купившему вчера книжку по программированию. А такой синтаксический сахар с многоточиями и стримом из библиотеки, нужно пять раз перечитать прежде чем понять и удивиться, нафига так намудрили. И уж точно, в отличие от первого, не понятный программисту, пришедшему из другого языка.
Я би клас із першого прикладу назвав counter а не calculator. Це краще відображає його суть.
1:30 j, k
А я плохим кодом считаю сишные фигурные скобки. Не сами скобки, разумеется, а их расположение: когда открывающая расположена в конце строки, попробуй догадаться, какая из закрывающих в этой (а, может быть, и не в этой вовсе) лестнице к ней относится... Я всегда ставлю открывающую точно над закрывающей. Да, это требует лишней строки, зато код сразу становится читабельным.
@PredatorAlpha2
4 ай бұрын
Вопрос привычки. Я раньше больше любил как Вы, сейчас для себя держусь правила - для коротких блоков до пяти строк без вложенных пишу по сишному, для более длинных и с вложенными - фигурные скобки одна под другой. Исключение - конструкции циклов и начало класса и методов - там по сишному всегда
Сергію, ви ж хоч кажіть, що у вас є україномовний канал, ато я вже половину відео з нього подивився (через рекомендації), і весь час думав, що це відео з цього, основного каналу😅
@alexandrapersukova
4 ай бұрын
Охх. знайшли, підписалися?)
Джиннннееееееееееерикиииии эээхххххе хе хээээээээээ
" ... примеры кода будут на Джаве, ну а какой ещё язык я должен был выбрать ...". К сожалению Мартин Фаулер в переиздании 2019 года выбрал Javasript.. Предатель!
200 строк кода?.. пффф, слабо как-то. На нашем проекте (достался по наследству) методы по 1000-2000 строк, притом это методы в самом контроллере. Прям портянка со всей непростой логикой. Думаю, всем и так понятно, что там со слоями, зависимостями, ответственностями и пр. никому ненужными придумками ))
Про комментарии. Немцыв постоянно на немецком пишут, пишут названия методов на немецком. И ничего. Придет индус и будет матерится? А после индуса мы)?
Ну дуже "початковий" рівень коду.
@alexandrapersukova
4 ай бұрын
так, відео для початківців
Слишком простые и очевидные примеры
а можна таке ж відео тільки Українською? Бо нічого не зрозуміло.
@alexandrapersukova
4 ай бұрын
якщо є запит, то спробуємо зняти. дякуємо за ідеї!
@arttex7yuart763
4 ай бұрын
@@alexandrapersukova ви вважає це ідеєю? Українська мова - це вже ідея? Тоді питання, ви Українська компанія чи ні? Якщо ні, то питань немає, лише одне, для чого прапор у куті використовувати? Якщо ж Українська компанія, то чому за майже 2 роки повномасштабної війни, ви так і не перейшли на державну мову?
@alexandrapersukova
4 ай бұрын
@@arttex7yuart763 У нас є окремий україномовний канал - Сергій Немчинський: Кодерська вітальня. А цей канал для всіх наших глядачів, які не знають української, а на рф, рб ми як і не працювали так і не працюємо.
@user-zi8zw3yf2t
4 ай бұрын
И как же ты так быстро забыл русский язык?
@alexandrapersukova
4 ай бұрын
@@user-zi8zw3yf2t это к чему вопрос?
Немчинский - самый опасный подвид инфоцыгана: если у Мишустина на лице клеймо инфоцыгана, то этот товарищ на вид - вполне адекватен
@user-qh5hz3jo4g
4 ай бұрын
Аргументы?
Сергію, ви ж наче перейшли на українську мову.... Війна ще не закінчилася, ворог той самий, давайте продовжувати робити українське іт україномовним 😢
@smaxim02
4 ай бұрын
Сергій зараз веде два канали. Цей лишився російськомовним, для інших країн, або людей які все ще розмовляють російською. Інший канал ведеться суто українською, частина контенту також перейшла туди. Питання в тому що(я так розумію) канали та ютуб забезпечують більшу частину від притоку клієнтів, а на україномовному зараз лише 10к підписників. Плюс це відразу мінус частина аудиторії з тої самої Прибалтики або Казахстану
@kirillperov3843
4 ай бұрын
Так є окремій українськомовний канал
@alexandrapersukova
4 ай бұрын
@@smaxim02 Все правильно, ми як не працювали з рф і рб так і не будемо, тому цей контент для людей з інших країн, які не володіють українською.