Объекты и структуры по Clean Code. Как писать хороший код?

  Рет қаралды 21,270

Sergey Nemchinskiy

Sergey Nemchinskiy

Күн бұрын

Сегодня обсуждаем Объекты и структуры, а именно: отличия объекта от структуры данных, закон Деметры, Data Transfer Objects и другое.
Тайминг:
00:00 - вступление Сергея Немчинского
02:11 - самое важное, что касается объектов и структур
04:14 - в чем отличие объекта от структуры данных
05:19 - зачем может понадобиться структура данных
07:05 - закон Деметры
10:08 - гибриды
10:27 - Data Transfer Objects
11:40 - Active Record
Курс о котором говорит Сергей: UI/UX дизайн
UI/UX дизайн - bit.ly/3oDk2S4
Курсы для новичков:
JAVA - bit.ly/3fwL4q4
JAVA Start - bit.ly/345jdrr
PYTHON - bit.ly/346ofnL
C# START - bit.ly/3hI5Llj
C#/.NET - bit.ly/3u8ElYD
Инструментарий JAVA - bit.ly/3ytmL4P
Automation QA (Java) - bit.ly/3bIzAyF
ANDROID - bit.ly/3wkBa1m
FRONT-END - bit.ly/3bIFD5Y
SALESFORCE Developer - bit.ly/3udoVT2
GAME DEVELOPMENT - bit.ly/3439KB1
Обучение на проекте - bit.ly/2S7KzdT
Продвинутые курсы для состоявшихся девелоперов:
GRASP and GoF Design patterns - bit.ly/3oAHvTK
Enterprise patterns - bit.ly/3hLNzY6
Другие услуги:
Пробное собеседование - bit.ly/3f79pUh
Карьерная консультация - bit.ly/3yrE1HM
Сайт Foxminded: bit.ly/3wi8pSQ
Foxminded в ФБ: / foxmindedco
FoxmindEd в Instagram: / foxminded.ua
Foxminded в VK: foxminded
Мой Telegram: t.me/nemchinskiyOnBusiness
Для деловых запросов: youtube@foxminded.com.ua

Пікірлер: 94
@kudashevs
@kudashevs 3 жыл бұрын
Про Закон Деметры интересно. Если еще и с каким-нибудь хитрым примером неявного нарушения было бы вообще шикарно :)
@user-ow6dr9ok6c
@user-ow6dr9ok6c Жыл бұрын
+
@deniss7703
@deniss7703 3 жыл бұрын
Интересно про закон Деметры. Спасибо!
@pfiresky
@pfiresky 3 жыл бұрын
Интересно будет посмотреть отдельное видео про закон Деметры!
@alexandrianov8109
@alexandrianov8109 3 жыл бұрын
Здравствуйте, снимите пожалуйста видео на тему - Путь от мидла до синьера
@alexhali6003
@alexhali6003 3 жыл бұрын
Сергей, предлагаю объединить эти видео в один плейлист)
@valbv
@valbv 3 жыл бұрын
Супер! Спасибо за информативное видео ) Будет круто, если архитектурный тренд зайдёт и будет побольше разбора архитектурных решений/ошибок
@jollyroger2757
@jollyroger2757 3 жыл бұрын
Спасибо за знания. Запишите пожалуйста видео, как в реальном коде соблюдать принципы GRASP на java.
@user-ow6dr9ok6c
@user-ow6dr9ok6c Жыл бұрын
+
@MrRomanvideo
@MrRomanvideo 3 жыл бұрын
Комментарий в поддержку этого видео и лайк для продвижения канала. Ну и за закон Деметры.
@nikolayrogoza4240
@nikolayrogoza4240 3 жыл бұрын
Интересно про закон Деметры, к сожалению больше одного лайка поставить не могу))
@Alex-ip9bn
@Alex-ip9bn 3 жыл бұрын
Ничего не понял , но очень интересно))
@user-po5wr1rd4b
@user-po5wr1rd4b 3 жыл бұрын
Спасибо большое за ваши видео. Расскажите пожалуйста про основы Clean Architecture с примерами из жизни)
@nickr6196
@nickr6196 3 жыл бұрын
Ноги у собаки должны быть приватным компонентом с ограниченным внешним доступом :)
@JohnSmith-ml2yg
@JohnSmith-ml2yg 3 жыл бұрын
Вижу видос Сергея, ставлю лайк с двух ног!
@AlexAlex-jk2tn
@AlexAlex-jk2tn Жыл бұрын
Очень хорошо подмечено про дальние вызовы, особенно если посмотреть, как реализован weak_ptr в C++, и там нет возможности обратиться к объекту иначе как object_wp.lock().method(), даже если вы точно знаете, что объект всё ещё жив в момент использования weak_ptr, неужели было сложно добавить оператор -> для данного типа указателей.
@tribacckk
@tribacckk 3 жыл бұрын
про закон диметры. А что делать в такой ситуации. У тебя есть интерфейс iА, реализуется классом cA. У iA есть 3-4 интерфейса и все. Небольшой такой хороший интерфейс. А вот у cA внутри есть объект cB который реализует интерфейс iB. А вот у iB уже 100500 методов. Я таким сталкивался когда работал с тем, что iB это какой-то визуальный компонент у которого 100500 различных метод для кастомизации и рисования. Выше описал абстрактно, пока писал вспомнил про реальный пример: Excel Верхеуровнего у нас доступна рабочая книга. Но чтобы поменять стиль у конкретной ячейки нам надо пройтись по внутренним объектам. Насколько я помню надо получить коллекцию листов, в коллекции найти лист, у листа уже запросить ячейку, у нее уже поменять стиль. На верхнем уровне у рабочий книги ведь нет метода который позволит сразу поменять стиль ячейки
@swimmwatch
@swimmwatch 3 жыл бұрын
К сожалению, не было никакого обоснования, почему плохо писать классы с окончанием er. Вроде в самой Java есть StringBuilder - ы всякие и т. д.
@user-gs6of5vv6r
@user-gs6of5vv6r 3 жыл бұрын
Здравствуйте Сергей, расскажите пожалуйста зачем в таких ОО-языках как C++, C#, Java доступ к переменным класса происходит через get/set методы, а не напрямую
@borisvolokhov6546
@borisvolokhov6546 3 жыл бұрын
Как хорошо, что Вы напоминаете, что Вы Сергей Немчинский! Ваше имя и фамилия въелась в кору моего головного мозга, аааа!! Что Вы наделали?!!!
@user-hy1zi3hu2c
@user-hy1zi3hu2c 3 жыл бұрын
Это пожизненная инкапсуляция
@user-mt9bq2xe1z
@user-mt9bq2xe1z 3 жыл бұрын
Принцип Деметры много вопросов вызывает. Вот например создаём мы объект httpClient, вызываем его метод post, получаем объект response, вызываем его метод getBody. Все. Мы ведь нарушили принцип Деметры? А как тогда быть?
@bennymountain1
@bennymountain1 3 жыл бұрын
Но ведь Response это не часть состояния httpClient, это возвращаемое значение Post(). Так что мы работаем с двумя отдельными классами - httpClient и Response, к обоим глубоко не лезем, не так ли?
@user-mt9bq2xe1z
@user-mt9bq2xe1z 3 жыл бұрын
@@bennymountain1 ну и получается, что есть закон Деметры, который нельзя нарушать, ну или хотя бы не очень сильно нарушать. Короче, как и все остальное в ООП, требует прагматизма.
@a.sorokin
@a.sorokin 3 жыл бұрын
FileReader вышел из чата
@OleksandrKharchenko-rt9hf
@OleksandrKharchenko-rt9hf 3 жыл бұрын
06:51 укол в JS засчитан
@max_mgtow
@max_mgtow 3 жыл бұрын
JS рулит, не бугурти))
@maxlich9139
@maxlich9139 3 жыл бұрын
@Keira Errinwright как будто в джс нельзя
@volodymyrzakolodyazhny7740
@volodymyrzakolodyazhny7740 3 жыл бұрын
Звісно, що люди люблять дивитися відео про чистий код. Дивишся відео - і думаєш, що таким чином, вже сам став розробником з чистим кодом. :-)
@oleksandrkovtunov487
@oleksandrkovtunov487 Жыл бұрын
Дело ж не в том что это убого передавать объект с зависимостями. Дело в том, что чем больше зависимостей, тем сложнее что-то поменять.
@user-us5uf9tt8i
@user-us5uf9tt8i 3 жыл бұрын
вам эту лекцию в "гугле" прочитать надо было в 2007, когда они GO изобретали. такого наx¥eвертили!!!..
@artursveshnikov7668
@artursveshnikov7668 3 жыл бұрын
А какая альтернатива у active record? И там тоже могут быть свои недостатки, раз ar все ещё используют.
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
хватает альтернатив. От Data Accessor до Data Mapper (ORM)
@user-nu2jz1sb4s
@user-nu2jz1sb4s 2 жыл бұрын
Ну про ActiveRecord - понятно. Хорошо, берём второй подход, который используется в Hebirnate Java или в Doctrine и ряде других ORM в PHP. Взяли мы класс предметной области, и половину (а чаще все) его полей обвесили всякими аннотациями, некоторые из которых указывают прямо тип поля в БД. Мы что, не получили зависимости от аннотаций? Мы типа не нарушили SRP? Но после навешивания аннотаций, у нас фактически в этом классе есть информация о том, как хранить его в базе данных. Где профит по сравнению с AR?
@arman-6172
@arman-6172 5 ай бұрын
отличный вопрос! не нашел ответ случайно за два года?)
@user-nu2jz1sb4s
@user-nu2jz1sb4s 5 ай бұрын
@@arman-6172 Про жабу не скажу, а про доктрину читал вариант, что если очень радеешь за чистоту кода, не обвешивай аннотациями, а конфигурируй через xml/yml и т.п. А аннотации (теперь атрибуты) типа да, нарушают, но меньшее зло
@arman-6172
@arman-6172 5 ай бұрын
@@user-nu2jz1sb4s благодарю! Как будто действительно нужно какой-то баланс ловить
@bloodpineapple9057
@bloodpineapple9057 2 жыл бұрын
Подскажите пожалуйста, никак не могу запомнить. Стараюсь, но из раза в раз не получается запомнить. Как вас зовут?
@nicolas267s
@nicolas267s 3 жыл бұрын
Util.java или CommonUtil.java почти во всех проектах есть)))
@adminroot1345
@adminroot1345 3 жыл бұрын
В чем разница между макапом и факапом?
@max_mgtow
@max_mgtow 3 жыл бұрын
В том что там тебя поимеют, а там нет)
@TwilightSun32
@TwilightSun32 3 жыл бұрын
оно понятно, конечно. но когда идёт речь типа active record - плохо (в каком-то смысле) и аргументировано почему, было бы круто сразу тут же услышать как называются альтернативы, которые лучше в каком-то смысле. типа если есть возможность это не используйте, посмотрите в сторону вот этого... было бы как-то чуть полнее. и да, согласен, жабаскрипт - то ещё извращение
@the_minor_emotion
@the_minor_emotion 3 жыл бұрын
class Nemchinsky extends(Developer, Businessmen, Coach, KZfaqr, ...);
@MrRomanvideo
@MrRomanvideo 3 жыл бұрын
implements...
@Kadabra1981
@Kadabra1981 3 жыл бұрын
Насчет дальних вызовов - пол javafx в них, и ничего, часть jdk.
@user-dk5wz4vd6r
@user-dk5wz4vd6r 3 жыл бұрын
Деметры +
@artemhnilov
@artemhnilov 3 жыл бұрын
Тяжело быть апологетом ООП... По возможности избегайте этого.
@0imax
@0imax 3 жыл бұрын
Тяжело всех отговаривать от ООП :)
@artemhnilov
@artemhnilov 3 жыл бұрын
@@0imax это правда
@mikhailefremov8583
@mikhailefremov8583 3 жыл бұрын
Про то, что поведения не должно быть в dto - это понятно. Но dto - это состояния объектов бизнес логики приложения и один хрен нужно мапить dto на реальные классы. Или есть какой то лучший способ это провернуть (кроме рефлексии) ?
@user-hy1zi3hu2c
@user-hy1zi3hu2c 3 жыл бұрын
Пора выпускать энциклопедию с названиями переменных и классов. Бардак-с
@vitalijuskolinko9011
@vitalijuskolinko9011 3 жыл бұрын
Мой учитель - не uncle Bob, а S. Nemchinskiy 👳
@elib2203
@elib2203 3 жыл бұрын
Жаль что нет наглядных примеров
@0imax
@0imax 3 жыл бұрын
"Вы должны в явном виде различать, что из этого класс с поведением, а что - структура без поведения". Особенно таким запутыванием грешат плюсовики, объявляющие классы через struct, потому что им лень писать public.
@codingposture
@codingposture 3 жыл бұрын
Хаахаххахахах
@VaGroz
@VaGroz 3 жыл бұрын
Привет case class-ы
@TedFanat
@TedFanat 3 жыл бұрын
Странная штука этот ваш клин код - никто не видел и не писал, а все говорят)
@roman6572
@roman6572 3 жыл бұрын
простым языком : вызовы методов через точку, потом опять через точку это бывает очень удобно при правильной композиции и вложенности одних структур в другие, далеко не всегда это гавно)
@SecretYouTubeAgent
@SecretYouTubeAgent 3 жыл бұрын
Да Немчинский сам не понимает что говорит
@roman6572
@roman6572 3 жыл бұрын
@@SecretKZfaqAgent не, он норм мужик
@SecretYouTubeAgent
@SecretYouTubeAgent 3 жыл бұрын
@@roman6572 хз, что за мужик, но программист так себе
@gyros9162
@gyros9162 3 жыл бұрын
Про извращение - это про JS :))
@user-ey5xw2nx9s
@user-ey5xw2nx9s 2 жыл бұрын
Там чистейшее ООП :D
@111shooter1111
@111shooter1111 3 жыл бұрын
Откуда так много поведения у объектов в типичном Enterprise? Доменная модель -- обычно структура данных. Всякие записи, о людях(клиент, пациент, покупатель), какие то там документы связанные с ними, пусть там чек в магазине. Так вот, чек сам себя не считает, он структура данных. Запись о товаре сама себя не обрабатывает -- тоже структура. Пусть собака, какая нибудь, будет. Она же не в игре или симуляции жизни, ей гавкать в коде не нужно, о ней, скорее всего, будет просо запись(вет клиника например), это опять структура данных, эта запись сама себя не отображает, не передает. Вот в геймдеве объекты с поведением уже выглядят логичнее. Там собачка и правда может сама бегать, а мы ей отдаем команды.
@0imax
@0imax 3 жыл бұрын
Ну вот как раз чек считает себя сам, спрашивая у каждой позиции её сумму, а та берётся из стоимости товара и количества.
@111shooter1111
@111shooter1111 3 жыл бұрын
​@@0imax и зачем? Это как раз ActiveRecord На примерах школьного уровня оно неплохо выглядит. А если нужно применить скидку? А для этого проверить текущие акции, скидочную карту или аккаунт пользователя. Что мы имеем: нет единой формулы расчета, она разбросана по коду -- понять код сложнее, больше точек изменения при новых требованиях. Странные зависимости. Если эти чеки в базе хранить то при загрузке данных им нужно инжектить зависимости, тогда тот кто получает эти данные должен это делать. Это добавит еще ему зависимостей либо на DI контейнер либо на то что нужно заинжектить. Другой пример: Сообщение тоже само себя отправляет? Тогда пусть оно зависит от HttpClient, надо только еще получателя где то взять, давайте базу подключим. А создаваться это сообщение как будет? Само себя примет или кто то создаст? И что мы имеем: две точки взаимодействия с отправкой по сети, работой с базой и прочим. Кривой DI так как сообщение это не зависимость, его нужно создавать, но еще и ему передать зависимости.
@0imax
@0imax 3 жыл бұрын
@@111shooter1111 Это information expert. Иначе чеку придётся лезть внутрь каждой позиции, спрашивать у неё товар, у товара спрашивать цену, скидку, всё это считать снаружи от тех объектов, которые сами могли бы это посчитать и выдать результат, который осталось бы просто просуммировать. Можно, конечно, всё считать в одном методе, но с увеличением количества стратегий подсчёта он пухнет и превращается в гору ифов, в которой потом хрен разберёшься. В то время как каждый кусочек "размазанного по коду" расчёта остаётся довольно простым. Можно долго теоретизировать о том, как делать лучше, но конкретная задача ставит всё на свои места: где-то проще пробежаться по всему чеку, собрать всё и перемножить/сложить, а где-то проще насетить товар уже с учётом всех скидок и бонусов, а чеку останется лишь всё это просуммировать.
@111shooter1111
@111shooter1111 3 жыл бұрын
​@@0imax В современной разработке ActiveRecord зачастую не оправдан, он плохо дружит с DI и ORM (кроме примеров где действительно надо 2+2). Местами действительно можно и так делать, но это должны быть действительно маленькие сущности, которые не имеют тенденции к росту логики. Например какое то простое дерево где каждая нода дает свой результат беря резульат дочерних, тут выделять какой то класс для обработки действительно смысла не имеет. И задача разработчика находить баланс между overdesign и решением в лоб, которое потом приведет к проблемам при расширении. Есть такие подходы как data-oriented design например, где данные нужно строго отделять от обработки. Или более простое MVC, где модель зачастую не имеет кода.
@romandolmatov9098
@romandolmatov9098 3 жыл бұрын
Добрый. Можете Вы посоветовать как решить эту проблему? Делаю интернет магазин. и на магазин размещаю кнопку с ссылкой на видео, как с магазином работать. Записать видео полноценно смогу только залив магазин с базой на хост. А кнопка-ссылка она же в коде прописана )). Я в этом деле новичок, расскажи как избежать двойного действия. Я думал типа записать пустышку на ютуб, создать не нее ссылку, (а в ютубе перезаписывать видео нельзя, соответственно URL теряется). Захостить магазин, заполнить его и потом перезаписать вместо той пустышки полноценное короткое видео. Ваши видео постоянно смотрю, вот почему-то подумал что Вы Мне бы смогли помочь. Что можете посоветовать?
@ZendTheExpert
@ZendTheExpert 3 жыл бұрын
Я многое видел, но задавать вопросы по коду в Ютуб комментах это что-то новое...
@romandolmatov9098
@romandolmatov9098 3 жыл бұрын
@@ZendTheExpert это вопрос больше не по коду а про видеоблоги, как их можно было бы сделать исходя из сложившейся у меня ситуации. А мою ситуацию хорошо смог бы понять только разбирающийся в программировании....
@sergeymoskalenko282
@sergeymoskalenko282 3 жыл бұрын
"кнопка-ссылка она же в коде прописана" Код в котором прописана ссылка - в файле (или в нескольких файлах). Что вам мешает поставить вместо ссылки знак "#". Захостить магазин. Когда загрузите своё видео на ютуб, получаете на него ссылку и вставляете вместо знака "#", и закачивание на хостинг этот фаил(ы) уже со ссылкой. Или у вас на хостинг доступ "одноразовый"?)
@romandolmatov9098
@romandolmatov9098 3 жыл бұрын
@@sergeymoskalenko282 Вы немножко не так поняли, или может я новичок и еще так не делал и недоганяю ), но прочтите пожалуйста мой запрос еще раз )
@0imax
@0imax 3 жыл бұрын
В чём проблема добавить ссылку на ютуб после заливки на хостинг?
@kartograf490
@kartograf490 3 жыл бұрын
А куда пропала кружка, ммм?!
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
забыли поставить :)
@kartograf490
@kartograf490 3 жыл бұрын
@@SergeyNemchinskiy Надеемся, что она жива, иначе бундъ)
@silkproduction
@silkproduction 3 жыл бұрын
больше нас не любит(
@max_mgtow
@max_mgtow 3 жыл бұрын
Всё, разлюбил батенька))
@orlovskyconsultinggbr2849
@orlovskyconsultinggbr2849 3 жыл бұрын
Если бы все фирмы этому следовали мы бы в лучшем мире жили бы, а так приходится ругатся и доказывать что ты не идиот , причём каждый раз , уже честно говоря после нескольких безуспешных месяцев разговоров с клиентами начинает надоедать.
@maksonic_official
@maksonic_official 3 жыл бұрын
Хоть бы одну строчку кода написал)
@0imax
@0imax 3 жыл бұрын
Зачем, если и так всё понятно?
@max_mgtow
@max_mgtow 3 жыл бұрын
Так сам напиши
@Philip_Just
@Philip_Just 3 жыл бұрын
Я на украинском читаю. Есть отличное недорогое бумажное издание серии книг Боба
@max_mgtow
@max_mgtow 3 жыл бұрын
Привет, бро)
@user-ym1kn2ms5v
@user-ym1kn2ms5v 3 жыл бұрын
Кто ты такой ?
@radikovichkz2470
@radikovichkz2470 Жыл бұрын
Уж точно не слушать немчинского вода
Правильные методы по Clean Code
28:29
Sergey Nemchinskiy
Рет қаралды 77 М.
Khóa ly biệt
01:00
Đào Nguyễn Ánh - Hữu Hưng
Рет қаралды 19 МЛН
Climbing to 18M Subscribers 🎉
00:32
Matt Larose
Рет қаралды 31 МЛН
Универ. 13 лет спустя - ВСЕ СЕРИИ ПОДРЯД
9:07:11
Комедии 2023
Рет қаралды 5 МЛН
The day of the sea 🌊 🤣❤️ #demariki
00:22
Demariki
Рет қаралды 52 МЛН
Программист, ты должен писать плохой код
21:51
Какими должны быть Классы по Clean Code?
11:50
Sergey Nemchinskiy
Рет қаралды 21 М.
The Best Linux Distro for You
11:23
ForrestKnight
Рет қаралды 585 М.
Khóa ly biệt
01:00
Đào Nguyễn Ánh - Hữu Hưng
Рет қаралды 19 МЛН