Принцип Деметры много вопросов вызывает. Вот например создаём мы объект httpClient, вызываем его метод post, получаем объект response, вызываем его метод getBody. Все. Мы ведь нарушили принцип Деметры? А как тогда быть?
Но ведь Response это не часть состояния httpClient, это возвращаемое значение Post(). Так что мы работаем с двумя отдельными классами - httpClient и Response, к обоим глубоко не лезем, не так ли?
@@bennymountain1 ну и получается, что есть закон Деметры, который нельзя нарушать, ну или хотя бы не очень сильно нарушать. Короче, как и все остальное в ООП, требует прагматизма.
Очень хорошо подмечено про дальние вызовы, особенно если посмотреть, как реализован weak_ptr в C++, и там нет возможности обратиться к объекту иначе как object_wp.lock().method(), даже если вы точно знаете, что объект всё ещё жив в момент использования weak_ptr, неужели было сложно добавить оператор -> для данного типа указателей.
про закон диметры. А что делать в такой ситуации. У тебя есть интерфейс iА, реализуется классом cA. У iA есть 3-4 интерфейса и все. Небольшой такой хороший интерфейс. А вот у cA внутри есть объект cB который реализует интерфейс iB. А вот у iB уже 100500 методов. Я таким сталкивался когда работал с тем, что iB это какой-то визуальный компонент у которого 100500 различных метод для кастомизации и рисования. Выше описал абстрактно, пока писал вспомнил про реальный пример: Excel Верхеуровнего у нас доступна рабочая книга. Но чтобы поменять стиль у конкретной ячейки нам надо пройтись по внутренним объектам. Насколько я помню надо получить коллекцию листов, в коллекции найти лист, у листа уже запросить ячейку, у нее уже поменять стиль. На верхнем уровне у рабочий книги ведь нет метода который позволит сразу поменять стиль ячейки
Здравствуйте Сергей, расскажите пожалуйста зачем в таких ОО-языках как C++, C#, Java доступ к переменным класса происходит через get/set методы, а не напрямую
Про то, что поведения не должно быть в dto - это понятно. Но dto - это состояния объектов бизнес логики приложения и один хрен нужно мапить dto на реальные классы. Или есть какой то лучший способ это провернуть (кроме рефлексии) ?
оно понятно, конечно. но когда идёт речь типа active record - плохо (в каком-то смысле) и аргументировано почему, было бы круто сразу тут же услышать как называются альтернативы, которые лучше в каком-то смысле. типа если есть возможность это не используйте, посмотрите в сторону вот этого... было бы как-то чуть полнее. и да, согласен, жабаскрипт - то ещё извращение
Ну про ActiveRecord - понятно. Хорошо, берём второй подход, который используется в Hebirnate Java или в Doctrine и ряде других ORM в PHP. Взяли мы класс предметной области, и половину (а чаще все) его полей обвесили всякими аннотациями, некоторые из которых указывают прямо тип поля в БД. Мы что, не получили зависимости от аннотаций? Мы типа не нарушили SRP? Но после навешивания аннотаций, у нас фактически в этом классе есть информация о том, как хранить его в базе данных. Где профит по сравнению с AR?
@@arman-6172 Про жабу не скажу, а про доктрину читал вариант, что если очень радеешь за чистоту кода, не обвешивай аннотациями, а конфигурируй через xml/yml и т.п. А аннотации (теперь атрибуты) типа да, нарушают, но меньшее зло
"Вы должны в явном виде различать, что из этого класс с поведением, а что - структура без поведения". Особенно таким запутыванием грешат плюсовики, объявляющие классы через struct, потому что им лень писать public.
простым языком : вызовы методов через точку, потом опять через точку это бывает очень удобно при правильной композиции и вложенности одних структур в другие, далеко не всегда это гавно)
Если бы все фирмы этому следовали мы бы в лучшем мире жили бы, а так приходится ругатся и доказывать что ты не идиот , причём каждый раз , уже честно говоря после нескольких безуспешных месяцев разговоров с клиентами начинает надоедать.
Откуда так много поведения у объектов в типичном Enterprise? Доменная модель -- обычно структура данных. Всякие записи, о людях(клиент, пациент, покупатель), какие то там документы связанные с ними, пусть там чек в магазине. Так вот, чек сам себя не считает, он структура данных. Запись о товаре сама себя не обрабатывает -- тоже структура. Пусть собака, какая нибудь, будет. Она же не в игре или симуляции жизни, ей гавкать в коде не нужно, о ней, скорее всего, будет просо запись(вет клиника например), это опять структура данных, эта запись сама себя не отображает, не передает. Вот в геймдеве объекты с поведением уже выглядят логичнее. Там собачка и правда может сама бегать, а мы ей отдаем команды.
@@0imax и зачем? Это как раз ActiveRecord На примерах школьного уровня оно неплохо выглядит. А если нужно применить скидку? А для этого проверить текущие акции, скидочную карту или аккаунт пользователя. Что мы имеем: нет единой формулы расчета, она разбросана по коду -- понять код сложнее, больше точек изменения при новых требованиях. Странные зависимости. Если эти чеки в базе хранить то при загрузке данных им нужно инжектить зависимости, тогда тот кто получает эти данные должен это делать. Это добавит еще ему зависимостей либо на DI контейнер либо на то что нужно заинжектить. Другой пример: Сообщение тоже само себя отправляет? Тогда пусть оно зависит от HttpClient, надо только еще получателя где то взять, давайте базу подключим. А создаваться это сообщение как будет? Само себя примет или кто то создаст? И что мы имеем: две точки взаимодействия с отправкой по сети, работой с базой и прочим. Кривой DI так как сообщение это не зависимость, его нужно создавать, но еще и ему передать зависимости.
@@111shooter1111 Это information expert. Иначе чеку придётся лезть внутрь каждой позиции, спрашивать у неё товар, у товара спрашивать цену, скидку, всё это считать снаружи от тех объектов, которые сами могли бы это посчитать и выдать результат, который осталось бы просто просуммировать. Можно, конечно, всё считать в одном методе, но с увеличением количества стратегий подсчёта он пухнет и превращается в гору ифов, в которой потом хрен разберёшься. В то время как каждый кусочек "размазанного по коду" расчёта остаётся довольно простым. Можно долго теоретизировать о том, как делать лучше, но конкретная задача ставит всё на свои места: где-то проще пробежаться по всему чеку, собрать всё и перемножить/сложить, а где-то проще насетить товар уже с учётом всех скидок и бонусов, а чеку останется лишь всё это просуммировать.
@@0imax В современной разработке ActiveRecord зачастую не оправдан, он плохо дружит с DI и ORM (кроме примеров где действительно надо 2+2). Местами действительно можно и так делать, но это должны быть действительно маленькие сущности, которые не имеют тенденции к росту логики. Например какое то простое дерево где каждая нода дает свой результат беря резульат дочерних, тут выделять какой то класс для обработки действительно смысла не имеет. И задача разработчика находить баланс между overdesign и решением в лоб, которое потом приведет к проблемам при расширении. Есть такие подходы как data-oriented design например, где данные нужно строго отделять от обработки. Или более простое MVC, где модель зачастую не имеет кода.
Добрый. Можете Вы посоветовать как решить эту проблему? Делаю интернет магазин. и на магазин размещаю кнопку с ссылкой на видео, как с магазином работать. Записать видео полноценно смогу только залив магазин с базой на хост. А кнопка-ссылка она же в коде прописана )). Я в этом деле новичок, расскажи как избежать двойного действия. Я думал типа записать пустышку на ютуб, создать не нее ссылку, (а в ютубе перезаписывать видео нельзя, соответственно URL теряется). Захостить магазин, заполнить его и потом перезаписать вместо той пустышки полноценное короткое видео. Ваши видео постоянно смотрю, вот почему-то подумал что Вы Мне бы смогли помочь. Что можете посоветовать?
@@ZendTheExpert это вопрос больше не по коду а про видеоблоги, как их можно было бы сделать исходя из сложившейся у меня ситуации. А мою ситуацию хорошо смог бы понять только разбирающийся в программировании....
"кнопка-ссылка она же в коде прописана" Код в котором прописана ссылка - в файле (или в нескольких файлах). Что вам мешает поставить вместо ссылки знак "#". Захостить магазин. Когда загрузите своё видео на ютуб, получаете на него ссылку и вставляете вместо знака "#", и закачивание на хостинг этот фаил(ы) уже со ссылкой. Или у вас на хостинг доступ "одноразовый"?)
Про Закон Деметры интересно. Если еще и с каким-нибудь хитрым примером неявного нарушения было бы вообще шикарно :)
+
Интересно про закон Деметры. Спасибо!
Интересно будет посмотреть отдельное видео про закон Деметры!
Сергей, предлагаю объединить эти видео в один плейлист)
Супер! Спасибо за информативное видео )
Будет круто, если архитектурный тренд зайдёт и будет побольше разбора архитектурных решений/ошибок
Здравствуйте, снимите пожалуйста видео на тему - Путь от мидла до синьера
Спасибо за знания. Запишите пожалуйста видео, как в реальном коде соблюдать принципы GRASP на java.
+
Комментарий в поддержку этого видео и лайк для продвижения канала. Ну и за закон Деметры.
Интересно про закон Деметры, к сожалению больше одного лайка поставить не могу))
Ничего не понял , но очень интересно))
К сожалению, не было никакого обоснования, почему плохо писать классы с окончанием er. Вроде в самой Java есть StringBuilder - ы всякие и т. д.
Ноги у собаки должны быть приватным компонентом с ограниченным внешним доступом :)
Вижу видос Сергея, ставлю лайк с двух ног!
Принцип Деметры много вопросов вызывает. Вот например создаём мы объект httpClient, вызываем его метод post, получаем объект response, вызываем его метод getBody. Все. Мы ведь нарушили принцип Деметры? А как тогда быть?
Но ведь Response это не часть состояния httpClient, это возвращаемое значение Post(). Так что мы работаем с двумя отдельными классами - httpClient и Response, к обоим глубоко не лезем, не так ли?
@@bennymountain1 ну и получается, что есть закон Деметры, который нельзя нарушать, ну или хотя бы не очень сильно нарушать. Короче, как и все остальное в ООП, требует прагматизма.
Очень хорошо подмечено про дальние вызовы, особенно если посмотреть, как реализован weak_ptr в C++, и там нет возможности обратиться к объекту иначе как object_wp.lock().method(), даже если вы точно знаете, что объект всё ещё жив в момент использования weak_ptr, неужели было сложно добавить оператор -> для данного типа указателей.
про закон диметры. А что делать в такой ситуации. У тебя есть интерфейс iА, реализуется классом cA. У iA есть 3-4 интерфейса и все. Небольшой такой хороший интерфейс.
А вот у cA внутри есть объект cB который реализует интерфейс iB. А вот у iB уже 100500 методов.
Я таким сталкивался когда работал с тем, что iB это какой-то визуальный компонент у которого 100500 различных метод для кастомизации и рисования.
Выше описал абстрактно, пока писал вспомнил про реальный пример:
Excel
Верхеуровнего у нас доступна рабочая книга. Но чтобы поменять стиль у конкретной ячейки нам надо пройтись по внутренним объектам.
Насколько я помню надо получить коллекцию листов, в коллекции найти лист, у листа уже запросить ячейку, у нее уже поменять стиль.
На верхнем уровне у рабочий книги ведь нет метода который позволит сразу поменять стиль ячейки
FileReader вышел из чата
06:51 укол в JS засчитан
JS рулит, не бугурти))
@Keira Errinwright как будто в джс нельзя
Как хорошо, что Вы напоминаете, что Вы Сергей Немчинский! Ваше имя и фамилия въелась в кору моего головного мозга, аааа!! Что Вы наделали?!!!
Это пожизненная инкапсуляция
Дело ж не в том что это убого передавать объект с зависимостями. Дело в том, что чем больше зависимостей, тем сложнее что-то поменять.
Спасибо большое за ваши видео. Расскажите пожалуйста про основы Clean Architecture с примерами из жизни)
Здравствуйте Сергей, расскажите пожалуйста зачем в таких ОО-языках как C++, C#, Java доступ к переменным класса происходит через get/set методы, а не напрямую
Тяжело быть апологетом ООП... По возможности избегайте этого.
Тяжело всех отговаривать от ООП :)
@@0imax это правда
Звісно, що люди люблять дивитися відео про чистий код. Дивишся відео - і думаєш, що таким чином, вже сам став розробником з чистим кодом. :-)
вам эту лекцию в "гугле" прочитать надо было в 2007, когда они GO изобретали. такого наx¥eвертили!!!..
Про то, что поведения не должно быть в dto - это понятно. Но dto - это состояния объектов бизнес логики приложения и один хрен нужно мапить dto на реальные классы. Или есть какой то лучший способ это провернуть (кроме рефлексии) ?
Странная штука этот ваш клин код - никто не видел и не писал, а все говорят)
А какая альтернатива у active record? И там тоже могут быть свои недостатки, раз ar все ещё используют.
хватает альтернатив. От Data Accessor до Data Mapper (ORM)
оно понятно, конечно. но когда идёт речь типа active record - плохо (в каком-то смысле) и аргументировано почему, было бы круто сразу тут же услышать как называются альтернативы, которые лучше в каком-то смысле. типа если есть возможность это не используйте, посмотрите в сторону вот этого... было бы как-то чуть полнее.
и да, согласен, жабаскрипт - то ещё извращение
Ну про ActiveRecord - понятно. Хорошо, берём второй подход, который используется в Hebirnate Java или в Doctrine и ряде других ORM в PHP. Взяли мы класс предметной области, и половину (а чаще все) его полей обвесили всякими аннотациями, некоторые из которых указывают прямо тип поля в БД. Мы что, не получили зависимости от аннотаций? Мы типа не нарушили SRP? Но после навешивания аннотаций, у нас фактически в этом классе есть информация о том, как хранить его в базе данных. Где профит по сравнению с AR?
отличный вопрос! не нашел ответ случайно за два года?)
@@arman-6172 Про жабу не скажу, а про доктрину читал вариант, что если очень радеешь за чистоту кода, не обвешивай аннотациями, а конфигурируй через xml/yml и т.п. А аннотации (теперь атрибуты) типа да, нарушают, но меньшее зло
@@МихаилКрамер-н7ш благодарю! Как будто действительно нужно какой-то баланс ловить
class Nemchinsky extends(Developer, Businessmen, Coach, UA-camr, ...);
implements...
В чем разница между макапом и факапом?
В том что там тебя поимеют, а там нет)
Жаль что нет наглядных примеров
Насчет дальних вызовов - пол javafx в них, и ничего, часть jdk.
Подскажите пожалуйста, никак не могу запомнить. Стараюсь, но из раза в раз не получается запомнить.
Как вас зовут?
Util.java или CommonUtil.java почти во всех проектах есть)))
Пора выпускать энциклопедию с названиями переменных и классов. Бардак-с
"Вы должны в явном виде различать, что из этого класс с поведением, а что - структура без поведения".
Особенно таким запутыванием грешат плюсовики, объявляющие классы через struct, потому что им лень писать public.
Хаахаххахахах
Деметры +
Мой учитель - не uncle Bob, а S. Nemchinskiy 👳
Привет case class-ы
А куда пропала кружка, ммм?!
забыли поставить :)
@@SergeyNemchinskiy Надеемся, что она жива, иначе бундъ)
простым языком : вызовы методов через точку, потом опять через точку это бывает очень удобно при правильной композиции и вложенности одних структур в другие, далеко не всегда это гавно)
Да Немчинский сам не понимает что говорит
@@SecretUA-camAgent не, он норм мужик
@@roman6572 хз, что за мужик, но программист так себе
Если бы все фирмы этому следовали мы бы в лучшем мире жили бы, а так приходится ругатся и доказывать что ты не идиот , причём каждый раз , уже честно говоря после нескольких безуспешных месяцев разговоров с клиентами начинает надоедать.
Откуда так много поведения у объектов в типичном Enterprise? Доменная модель -- обычно структура данных. Всякие записи, о людях(клиент, пациент, покупатель), какие то там документы связанные с ними, пусть там чек в магазине. Так вот, чек сам себя не считает, он структура данных. Запись о товаре сама себя не обрабатывает -- тоже структура. Пусть собака, какая нибудь, будет. Она же не в игре или симуляции жизни, ей гавкать в коде не нужно, о ней, скорее всего, будет просо запись(вет клиника например), это опять структура данных, эта запись сама себя не отображает, не передает.
Вот в геймдеве объекты с поведением уже выглядят логичнее. Там собачка и правда может сама бегать, а мы ей отдаем команды.
Ну вот как раз чек считает себя сам, спрашивая у каждой позиции её сумму, а та берётся из стоимости товара и количества.
@@0imax и зачем? Это как раз ActiveRecord
На примерах школьного уровня оно неплохо выглядит. А если нужно применить скидку? А для этого проверить текущие акции, скидочную карту или аккаунт пользователя.
Что мы имеем: нет единой формулы расчета, она разбросана по коду -- понять код сложнее, больше точек изменения при новых требованиях. Странные зависимости. Если эти чеки в базе хранить то при загрузке данных им нужно инжектить зависимости, тогда тот кто получает эти данные должен это делать. Это добавит еще ему зависимостей либо на DI контейнер либо на то что нужно заинжектить.
Другой пример:
Сообщение тоже само себя отправляет? Тогда пусть оно зависит от HttpClient, надо только еще получателя где то взять, давайте базу подключим.
А создаваться это сообщение как будет? Само себя примет или кто то создаст?
И что мы имеем: две точки взаимодействия с отправкой по сети, работой с базой и прочим. Кривой DI так как сообщение это не зависимость, его нужно создавать, но еще и ему передать зависимости.
@@111shooter1111 Это information expert. Иначе чеку придётся лезть внутрь каждой позиции, спрашивать у неё товар, у товара спрашивать цену, скидку, всё это считать снаружи от тех объектов, которые сами могли бы это посчитать и выдать результат, который осталось бы просто просуммировать.
Можно, конечно, всё считать в одном методе, но с увеличением количества стратегий подсчёта он пухнет и превращается в гору ифов, в которой потом хрен разберёшься. В то время как каждый кусочек "размазанного по коду" расчёта остаётся довольно простым.
Можно долго теоретизировать о том, как делать лучше, но конкретная задача ставит всё на свои места: где-то проще пробежаться по всему чеку, собрать всё и перемножить/сложить, а где-то проще насетить товар уже с учётом всех скидок и бонусов, а чеку останется лишь всё это просуммировать.
@@0imax В современной разработке ActiveRecord зачастую не оправдан, он плохо дружит с DI и ORM (кроме примеров где действительно надо 2+2).
Местами действительно можно и так делать, но это должны быть действительно маленькие сущности, которые не имеют тенденции к росту логики. Например какое то простое дерево где каждая нода дает свой результат беря резульат дочерних, тут выделять какой то класс для обработки действительно смысла не имеет.
И задача разработчика находить баланс между overdesign и решением в лоб, которое потом приведет к проблемам при расширении.
Есть такие подходы как data-oriented design например, где данные нужно строго отделять от обработки. Или более простое MVC, где модель зачастую не имеет кода.
Про извращение - это про JS :))
Там чистейшее ООП :D
больше нас не любит(
Всё, разлюбил батенька))
Хоть бы одну строчку кода написал)
Зачем, если и так всё понятно?
Так сам напиши
Добрый. Можете Вы посоветовать как решить эту проблему? Делаю интернет магазин. и на магазин размещаю кнопку с ссылкой на видео, как с магазином работать. Записать видео полноценно смогу только залив магазин с базой на хост. А кнопка-ссылка она же в коде прописана )). Я в этом деле новичок, расскажи как избежать двойного действия. Я думал типа записать пустышку на ютуб, создать не нее ссылку, (а в ютубе перезаписывать видео нельзя, соответственно URL теряется). Захостить магазин, заполнить его и потом перезаписать вместо той пустышки полноценное короткое видео. Ваши видео постоянно смотрю, вот почему-то подумал что Вы Мне бы смогли помочь. Что можете посоветовать?
Я многое видел, но задавать вопросы по коду в Ютуб комментах это что-то новое...
@@ZendTheExpert это вопрос больше не по коду а про видеоблоги, как их можно было бы сделать исходя из сложившейся у меня ситуации. А мою ситуацию хорошо смог бы понять только разбирающийся в программировании....
"кнопка-ссылка она же в коде прописана"
Код в котором прописана ссылка - в файле (или в нескольких файлах).
Что вам мешает поставить вместо ссылки знак "#". Захостить магазин.
Когда загрузите своё видео на ютуб, получаете на него ссылку и вставляете вместо знака "#", и закачивание на хостинг этот фаил(ы) уже со ссылкой.
Или у вас на хостинг доступ "одноразовый"?)
@@sergeymoskalenko282 Вы немножко не так поняли, или может я новичок и еще так не делал и недоганяю ), но прочтите пожалуйста мой запрос еще раз )
В чём проблема добавить ссылку на ютуб после заливки на хостинг?
Я на украинском читаю. Есть отличное недорогое бумажное издание серии книг Боба
Привет, бро)
Кто ты такой ?
Уж точно не слушать немчинского вода