💪Новый поток advanced тренинга Enterprise patterns стартует 2.12. Получите скидку -15% для ранних пташек только до 15.11 - go.foxminded.ua/3NnrttG
@asdclip4 жыл бұрын
Здравствуйте, Сергей. По поводу DIP, небольшое уточнение, если у вас высокоуровневый модуль A зависит от низкоуровнего модуля B и вы вынесете в модуле B интерфейс и теперь у вас A зависит от интерфейса модуля B, то это не будет DIP а скорее OCP. У вас как модуль A зависил от модуля B, так и зависит, только теперь от интерфейса. Смысл DIP - это инвертирования зависимостей без инвертирования потока управления. Поэтому интерфейс для B нужно объявлять в модуле A и получаем теперь, что А зависит только от своего интерфейса. а B уже зависит от А (зависимость инвертирована). Этот подход служит часто для изоляции одних слоев приложения от других, например доменного слоя от инфраструктуры.
@cannibalirk30552 жыл бұрын
Тот случай, когда коммент полезнее видео)) Тоже не мог понять как обращение через интерфейсы решает проблему зависимости модулей верхнего уровня. Решил посмотреть это видео для систематизации информации, но еще больше запутался. А Ваш коммент как раз внёс ясность.
@simonjke Жыл бұрын
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
@tee-hee Жыл бұрын
Реально красивый и полезный коммент, а видео мне вообще непонятно. Что значит встраивать прямо в сервер? Мы же не в одном классе все пишем. Что значит надо будет разрывать зависимости? Как добавление функционала ведет к тому, что надо удалять старый?
@AlexandrGeffest Жыл бұрын
В примере из видео высокоуровневый модуль А - это сервер, а низкоуровневый В - это клиент? И тогда суть в том, чтобы интерфейс, через который мы обращаемся из клиента к северу стал частью клиента, так? То есть, клиент будет вызывать какой-то КлиентСерверИнтерфейс (лежит где-то около клиента). А сервер будет имплементировать КлиентСерверИнтерфейс, который будет брать где-то около клиента? Примерно так?
@AlexLavrik11 ай бұрын
Ребят, уже прошло три года с момента написания ваших комментов. Надеюсь, вы уже поняли, что ОН ВСЕ правильно говорит? )) Человек, показывая на пальцах, просто вводит в курс дела. А для того, чтобы действительно понять, что же такое DIP, нужно будет написать парочку рабочих приложений и только тогда приходит настоящее понимание того, что это, как это все работает и как использовать Dependency Injection, IRepository, Repository, CQRS, Clean Architecture и как все это и создает Dependency Inversion.
@veryaev4 жыл бұрын
Спасибо за видео, все очень понятно! Пока всего два вопроса! 1) Как вас зовут? 2) Большой ли у вас стаж в программировании?
@ifan1464 жыл бұрын
таймкод 0:00
@ZukFA3 жыл бұрын
В голос
@jaquerassone93263 жыл бұрын
Неплохо, рассмеялся, спасибо :)
@sulfur320663 жыл бұрын
до сліз
@suffocateforfucksake3 жыл бұрын
@@ifan146 лол
@writetoyourdestiny4 жыл бұрын
Здравия, Сергей, хотелось бы услышать от вас про unit-тестирование, в частности про: Spy, Mock, Stab и еще вроде Fake.
@aerahtv00004 жыл бұрын
про mock и stub вроде было квкое-то видео, поищи на канале
@alekseytsvetaev62614 жыл бұрын
Да хотелось бы послушать
@eduardmart12373 жыл бұрын
Поддерживаю
@ТатьянаГромова-ы1м2 жыл бұрын
поддерживаю. Тема тестирования очень актуальна. Хочется получить информацию в присущей для вас доступной манере подаче информации
@dmitriygordievskiy4934 жыл бұрын
Спасибо, посмотрев видео наконец-то понял SOLID. В других источниках с которыми сталкивался либо слишком абстрактно пояснено, либо заумно.
@HATCOH44 жыл бұрын
Че ты там понял?
@simplechannel78592 жыл бұрын
Еще даже не посмотрел видео, а уже поставил лайк. Надо завязывать с такой привычкой
@andyvoice4 жыл бұрын
за СОЛИД и двор, лайк в упор
@АндрійСлижук-е9п4 жыл бұрын
Найкраще пояснення SOLID що я чув, набагато краще ніж Шевчук!
@feoktant3 жыл бұрын
Вот когда появится задача добавить авторизацию, в ИДЕ есть кнопка Extract Interface на классе, и делается дальше всё что вы рассказали.
@juliusmalkov96204 жыл бұрын
а можно видео потом про DI & IoC?
@leontapar11 ай бұрын
После размышлений на эту тему я возможно понял суть, но мое умозаключение отличается от того что вы написали выше - как я понял dep-inversion - это не БУКВАЛЬНЫЙ разворот зависимости в противоположную сторону, а её трансформация. Классы низкого уровня реализуют единый интерфейс, в свою очередь параметр(который и представляет зависимость) конструктора класса высокого уровня реализует тот же самый единый интерфейс. Таким образом, какой бы аргумент(зависимость) мы бы не кинули в конструктор, пока аргумент отвечает интерфейсу - класс будет работать. В итоге теперь класс высокого уровня ЗАВИСИТ не от класса низкого уровня, а от интерфейса в конструкторе. В свою очередь классы низкого уровня ТОЖЕ ЗАВИСЯТ от интерфейса. Это значит, что изменения в классе низкого уровня не соответствующие интерфейсу, который связывает его с классом высокого уровня, повлекут за собой изменения этого интерфейса, которые в свою очередь повлекут и изменения в коде класса высокого уровня(Ведь его параметр конструктора ТОЖЕ реализует этот интерфейс). Поэтому считаю конкретно это предложение из коммента выше неверным и вредным для новичков которые его читают: "если мы будем что-то менять в UserRepository, или мы можем изменить имя класса, а можем вообще унаследовать другой класс, то это никак не затронет UserClient , нам не нужно вносить изменения в его код". А в сам пример с UserClient и UserRepository я бы для того, чтобы показать именно суть добавил бы класс UserRepository2, который тоже реализует интерфейс IUserRepository, но по-другому(возможно с другой логикой) - и тогда класс UserClient мог бы работать и с UserRepository и с UserRepository2, и как раз при изменении зависимости, то есть самого передаваемого аргумента в конструкторе код в классе UserClient менять бы НЕ ПРИШЛОСЬ, так как для него UserRepository и UserRepository2 это по сути одно и тоже, но под капотом разное. Вот и получается, что теперь UserClient плевать с каким классом работать, вот только полной независимости от классов низкого уровня он все-таки не получил, по причине того, что при любом изменении в IUserRepository придется менять код в классе UserClient. Надеюсь верно и более-менее понятно написал. Если есть реально шарящие люди в этой теме, то надеюсь отпишут хоть что-то в ответ, так как я новичок и с этой темой поломал уже голову некоторое время чисто из-за того что все пишут, что если применить dep-inversion, то можно менять внутренности более низкоуровневых модулей не парясь об высокоуровневых, так вот я реально голову сломал пытаясь понять - как же они не будут влиять, если они от ОДНОГО ИНТЕРФЕЙСА ЗАВИСЯТ.
@dgavrikov843 жыл бұрын
C наступающем Новым Годом, Сергей. В целом с вами согласен, с единственной оговоркой. Использовать класс через интерфейс нужно при внешнем взаимодействии к этому классу, если понимаете о чем я. Если класс реализует обертку настроек или DTO то не вижу смысла этого делать.
@ivanivanovq29644 жыл бұрын
Наконец послушал про "d". Роберт Мартин в своих лекиях про солид обычно рассказывает только про "sol"
@alexanderbelov68923 жыл бұрын
10:06 Есть такая штука - рефакторинг кода. Делай раз: Создай интерфейсы по принципу SOLID/ISP, которые реализует класс. Делай два: Унаследуй жёсткий класс от всех интерфейсов, чтобы он их реализовывал. Делай три: Измени клиентов, чтобы они использовали новые интерфейсы вместо жёсткого класса. Танцы с бубном окончены.
@FoRGeish4 жыл бұрын
С возможностями современных(ной) IDE писать на каждый чих интерфейс - тоже такое себе занятие, противоречащее KISS'у. Как и с балансом между хард и софт, нужно соблюдать баланс между "все на интерфейсах"/"ни одного интерфейса в проекте". ИМХО
@evgenykuksov62212 жыл бұрын
Бля, просто в душу поразила ваша манера объяснять! Так иногда не хватает грубых слов в общении/объяснении, потому что благодаря им в разы быстрее понимается!) Мое почтение за формат)
@yurim77563 жыл бұрын
О, холивар ) Это всё понятно, но есть некоторые вопросы, просто на подумать. Как раз связанные с тем, чем хреново ооп в принципе по сравнению с функциональщиной. Вот в этом видео прямо показывается, как один из недостатков ООП доводится до совершенства. 1. Так ли часто нужно вставлять новый функционал, который здесь привели в сравнении с тем, что надо всегда солому подстилать и все время делать больше? Например, там вы решили вставить функционал, может раз в полгода, а классов пишете кучу каждый день. И это а) просто заставляет вас делать больше усилий, б) постоянно больше усилий при дебаге или просто при переходах в среде разработки, в попытке выяснить какая реализация используется. А в то же время современные IDE вполне уже не просто текстовые редакторы, и довольно слабый аргумент, что надо лазить потом будет по всему коду, чтобы разорвать при случае зависимость и выставить интерфейс. Т.е. это не утверждение, что данный подход плохо, просто сами попытайтесь оценить в своей работе, в своей среде разработки, в каком случае производительность программиста хуже. 2. Интерфейс уменьшает зависимость, да. Но ее не всегда надо с коробки уменьшать. Программа - это рельсы для поезда. Поезд должен ездить жестко по ним. В первую очередь программа должна быть жесткой, потому как у нее первая задача - работать правильно, выполняя заложенные требования. А уже 2я, или даже 22я, это антагоническая цель - быть гибкой, потому что что-то может измениться в требованиях. Интерфейс - это набор сигнатур методов. А сигнатура - пример сайдэффекта. Т.е. в ООП вообще нет гарантии что передавая один и те же аргументы, вы будете получать одни и те же результаты, потому что дзёбанные объекты имеют состояние (по сути, поля - это глобальные переменные, за которые ругали еще в процедурном подходе). А интерфейс добавляет хардкора в топку, это прям вот идеальный кот в мешке )) Вы еще и имеете возможность подменять реализацию, одна будет у вас в одном случае, другая в другом, и особенно в юнит тестах. Т.е. получается, что вы сознательно в юнит-тестах окружаете код некими конструкциями, которые ТОЧНО будут работать не так, как это работать будет вживую. По сути, что такое сайдэффект. Работа программы зависит, ну типа как от неких глобальных переменных, и черт знает, какие они будут, когда случится бага, и как себя поведет программа в тех или иных случаях. И вы, когда пишете тест, пытаетесь угадать, какие значения переменных в окружении будут в реале, или выставить так, что на ваш взгляд, оно покроет все разные варианты. Много тестов будет просто ради тестов, потому как в реале эти интерфейсы будут только подмножество вариантов своей работы выдавать. А можно и пропустить реальный кейс. (тут я не рассматриваю, что юнит-тесты должны каждую ветку тестить, но смысл, что у вас оверхед будет по тестам). Это так, на подумать, это не критика ;) Не всё так однозначно. Хотя, если так случилось, что выбрали ООП, то вариантов как лучше, не так и много )
@alexkononenko48624 жыл бұрын
Сергей, все правильно, так и пишем, несогласных стараемся убедить :)
@IhorVarfolomeiev-q2h4 жыл бұрын
Было бы интересно послушать о TDD. Спасибо за вашу работу
@anmaner48223 жыл бұрын
@@a.o.yaroslavov А чем он вреден то? Позволяет сначало задать бизнес-логику в виде тестов, а потом уже писать класс, который будет удовлетворять тесты, тем самым, следовать бизнес-логике
@yashkevich81642 жыл бұрын
С интерфейсами бывает еще одна крайность, когда начинают их пилить абсолютно на все в системе. В итоге по мере роста кода и проекта, что бы добраться до того места где выполняется сам код необходимо прокликать кучу методов через ctrl и везде будешь попадаться на интерфейсы, а уже потом заглядывать в класс и идти дальше по цепочке. Должна быть мера все таки
@errandir2 жыл бұрын
На эту тему очень понравилось: kzbin.info/www/bejne/oZ-xkoiJgc2rY7c )
@СтепанСкворцов-ь7и2 жыл бұрын
Ctrl+alt переходит сразу на реализацию
@bandirom4 жыл бұрын
Покажите каждый принцип на практике, на джаве или любо чем)
@MikhailKolesnikov4 жыл бұрын
увы, вызов всего через интерфейсы тоже бывает организован "через одно место". например, когда интерфейс делается вида: void doJob(JobParameters params, Object yet_another_parameter, Long timeout, String log_prefix, int node_id) ну и так далее.... :)
@alekseykouzmenko90964 жыл бұрын
Ну рукожопую жопорукость никогда и никому не победить и не искоренить
@malferov2 жыл бұрын
Как рассказывать про инверсию зависимостей и не рассказать про инверсию зависимостей. Тот, кто знает, что такое DI, тот знает, что такое DI. А кто нет - нет. Вместо отлития в граните «все классы должны использоваться через интерфейсы», может быть, имело смысл показать пример, как инвертируются зависимости. На схеме, скажем.
@Kan0411852 жыл бұрын
хах, полез в комменты на середине видео и понял, что примеров не будет ))
@СергейКарпиченко-с6б4 жыл бұрын
Спасибо большое за видео!
@Redux-lv6vu6 ай бұрын
Большое спасибо за ваши видеоролики
@artyomzheltyshev80594 жыл бұрын
3:25 такие задачи как логирование и профайлинг зачастую делаются через аспекты. На первый взгляд это смотрится довольно лаконично, без кучи самодельных интерфейсов и декораторов; вся магия остаётся под капотом АОП-фреймворков. Сергей, сделайте как-нибудь видео про АОП, пожалуйста, мб есть какие-то подводные камни.
@alekseykouzmenko90964 жыл бұрын
Подводные камни провляются в тот момент когда система перестала работать на отлично. Сложно сайд-эффекты отслеживать.
@Arman_1272 жыл бұрын
Огромное спасибо за видео но не хватает примера для полного понимания
@starfall74313 жыл бұрын
11 минут каких-то историй хотел понять суть DIP - посмотрел монолог но сути так и не уловил было бы неплохо, если бы все это было лаконичнее и без излишних баек
@ИннаЛиксакова-о4н Жыл бұрын
Тут такой рассказчик, он по-другому не умеет
@TeuFortMan3 жыл бұрын
Доходчиво и достаточно коротко!
@УнанСтепанян4 жыл бұрын
Расскажите пожалуйста про самые интересные, на ваш взгляд, принципы, которые описывал Роберт Мартин по мимо принципов SOLID
@ДмитрийСаевский2 жыл бұрын
Спасибо, весь курс хорош)
@P1oN4ik4 жыл бұрын
Спасибо! Очень крутой цикл роликов. обязательно скину друзьям.
@aradox45164 жыл бұрын
Вовремя открыл ютуб (5 сек назад залито). Спасибо за видео.
@kosee4008 Жыл бұрын
залпом посмотрел
@rinatsarmuldin2280 Жыл бұрын
Вы очень крут!!!
@sergijg4 жыл бұрын
К сожалению интерфейсы после релиза системы приходится менять в следствии ее расширения, и иногда весьма интенсивно, и вот тогда начинается просто ад с апдейтом интерфейсов (около сотни). В остальном все достаточно гибко
@gaitavr19924 жыл бұрын
Наверное самый часто нарушаемый принцип)
@СэмФишер-х4д3 жыл бұрын
хорошие лекции, спасибо за ваш труд.
@leonkonig51314 жыл бұрын
Добрый день, очень хотелось бы увидеть все принципы SOLID в виде кода, хорошо бы java.
@igorilich13794 жыл бұрын
В идеале не привязываться в подобных видео к языку. Учимся программировать не на языке, а с использованием языка ) имхо (иначе я бы не смотрел эти ролики)
@МаксимСлободянюк-н9о3 жыл бұрын
Thank you SO MUCH!!!
@gomer38944 жыл бұрын
спасибо за видео, поддержите видео комментариями!
@Alex11Fox4 жыл бұрын
Говорит что надо все делать ч/з интерфейс, тогда что же является софткод?
@ilya94854 жыл бұрын
Тоже возник вопрос на этом месте
@JackFastGame4 жыл бұрын
Да, что-то уже попахивает антипаттерном.
@aliancechel4 жыл бұрын
Подожду ответа с вами
@truenerdofbotva58314 жыл бұрын
Ну, можно ещё вместо каждого метода создавать и передавать при конструировании стратегию, которая этот метод реализует. Тогда код будет ещё мягче.
@dmytromarchuk30234 жыл бұрын
Зростання вашому каналу! Хорошу справу робите!
@MikhailKolesnikov4 жыл бұрын
а в чём глубинный смысл писать на вот этом непонятном языке? если ты прослушал этот ролик то ты 100% понимаешь русский язык и можешь на нём выразиться или, хотя бы, сообразить, что твои вирши не всем будут понятны и воспользоваться гугло-транслейтом.
@dmytromarchuk30234 жыл бұрын
@@MikhailKolesnikov На якій мові хочу - на такій і пишу. "не всем будут понятны" - я пишу не для всіх, а конкретно автору цього відео, а він українську шарить. Так що фак оф
@MaceUA4 жыл бұрын
@@MikhailKolesnikov Абсолютно понятный язык. Не нравится -- проходи мимо, не задерживайся, сталкер.
@meteysh4 жыл бұрын
@@MikhailKolesnikov я, русский, но его писанина мне понятна и даже прикольно, что он так написал :)
@feoktant3 жыл бұрын
Про стабы интересно. После написания такого кода, есть две реализации для поддержки, и один интерфейс. Слова "интерфейсы должны быть стабильны"... На практике изменения чаще говорят "никто никому ничего не должен", и меняешь по итогу все имплементации. Реализовать такой стаб проще через наследование, чем отдельный интерфейс - изменение будет в двух местах, вместо трёх.
@errandir2 жыл бұрын
Я тоже не из лагеря «всё через интерфейсы», но аргумент звучит как предложение экономить на семечках.
@v.oleynik82823 жыл бұрын
ПРОСТО ТОП!! СПАСИБО!!
@antaki932 жыл бұрын
Может быть, я не очень умный, но я посмотрел весь плейлист и по-прежнему не понимаю, почему в описанном случае нельзя просто добавить к классу Server метод authorization() или т.п.? Нужна авторизация - дописываем авторизацию, ну в чём проблема-то?
@FORGIVE123N2 жыл бұрын
Не хватает наглядной демонстрации через блок схемы. Делали на предыдущих принципах, а тут почему-то не стали :(
@alexandr99004 ай бұрын
фломастеры видать окончательно сдохли, а на новые денег нет.
@akame67474 жыл бұрын
Хотелось бы про TDD
@johnins16464 жыл бұрын
Приведите, пожалуйста , примеры DIP, было без DIP так, с DIP стало так...
@z1zzz4 жыл бұрын
Здравствуйте, можете потом снять видео про дизайн паттерны(behavioral, structural), хотя-бы по 2-3 паттерна с каждого. Ещё что такое downcasting и почему его использование это плохо.
@user-jg9ci7be5x3 жыл бұрын
Спасибо! Все понятно.
@LyubomirZalizkiy4 жыл бұрын
@Sergey Nemchinskiy Там SRP в назві
@Eladanius3 жыл бұрын
Ничерта не понимаю, как добавления новых методов в класс сервера аффектит мой класс клиента. Допустим у меня есть объект класса Сервер в классе Клиент. Через него я вызываю необходимые мне методы. Как добавление новых методов в класс Сервер может сломать работу класса Клиент??? Ну добавились новые методы и что? Хочу вызову, хочу нет... Объясните плиз, я вообще не отдупляю плюсы работы с классами через интерфейс!
@SergeyNemchinskiy3 жыл бұрын
Новый метод может, например, принимать новый тип данных. А этот тип данных может быть недоступен для клиентского кода - например пекеджи не обновились. Вот и аффект
@antonkuranov4 жыл бұрын
Ну вот не факт. Бывают функциональные единицы с несколькими зависимостями, которые используются приватно только в данном контексте и не имеют смысла вне его, но которые все же инъектируются через DI. Писать каждый раз по этому поводу новый интерфейс -- это по большей части моральная мастурбация. Тут больше применимы принципы yagni и kiss.
@владимирсенцов-р1ю4 жыл бұрын
Ну не особо надо все вызывать через интерфейс. Если надо выделить интерфейс можно за 5 секунд. Зачем его делать заранее? Хотя вот если у нас библиотека, то ее Api лучше через интерфейсы развязать.
@popuzin3 жыл бұрын
про GRASP бы и закон Деметры послушать
@АнтонСеменюта-ч2п2 жыл бұрын
Ребят, возник вопрос, который прям не дает покоя: - Не противоречит ли принципе DIP паттерну Creator. По DIP надо объекты передавать другим объектам через их интерфейсы, а по Creator'у эти объекты следует создавать там, где они используются. Как разрешить это противоречие?
@ergo_____34912 жыл бұрын
Разрешается противоречие устранением ошибок в понимании принципов) По DIP надо создавать объекты типа интерфейса, который реализует класс объекта, а не передавать что-то. Например, есть класс "МумбаЮмба", который имплементирует интерфейс "МумбаЮмбаИнтерфейс". Теперь в другом классе тебе понадобился объект класса МумбаЮмба. Ты можешь создать его так: МумбаЮмба мумбаЮмба = new МумбаЮмба(); А DIP у тебя просит всего навсего тип переменной указать интерфейсный: МумбаЮмбаИнтерфейс мумбаЮмба = new МумбаЮмба(); Тогда потом в эту переменную ты сможешь отправить объект любого класса, имплементирующего интерфейс МумбаЮмбаИнтерфейс.
@АнтонСеменюта-ч2п2 жыл бұрын
@@ergo_____3491 Разве этого достаточно? У меня, конечно, много ошибок в понимании, но я думал так: Один из примером реализации DIP является dependency injection (здесь уже не inversion). Благодаря этому принципу и надо передавать одни классы в другие через интерфейсы, а не создавать одни внутри других
@botandrei8467 Жыл бұрын
не знаю оговрка это была или нет но -SRP принцип единственной ответственности. Каждый класс должен иметь только одну зону ответственности.
@fel1ow2 жыл бұрын
На 04:55 он говорит "добавить шаблон прокси из гов". Что за гов? Благодарю за ответ.
@SergeyNemchinskiy2 жыл бұрын
Gang of Four (GoF)
@core2mind4 жыл бұрын
Я всегда на Java стараюсь строить взаимодействие слоев через интерфейсы и люто протестую, когда вижу во время ревью, что кто-то делает инъекцию зависимости в переменную типа класса, а не интерфейса. В нормальном коде должно быть удобно менять имплементации. Да в принципе не нужно вызывающему контекст знать детали реадизации.
@Bfiabecksjbdicbsjzkkxnsh3 жыл бұрын
Я только не понял почему в видео про принцип открытости закрытости та же самая инф
@ИннаЛиксакова-о4н Жыл бұрын
Потому что автор сам не разобрался
@juliusmalkov96204 жыл бұрын
во, какраз думал "когда же будет видео про D"))
@НикитаВасилевич-ж6х4 жыл бұрын
GRASP
@nik_fine3 жыл бұрын
А разве интерфейс или декоратор не нарушают принцип единственной ответственности?
@javavlogger94094 жыл бұрын
Миллион лайков этому видео! Как открыл для себя удобство прогр-я через интерфейсы, до сих пор кипятком ссусь от счастья) Хотелось бы подобный ролик еще и про DI/IoC.
@aRRma994 жыл бұрын
годно
@undefined-n5v4 жыл бұрын
Спасибо, ничего непонятно
@adskfksefn4 жыл бұрын
а примеров бы
@lyloo65774 жыл бұрын
Не на каждый класс интерфейс, а на каждый класс, содержащий сложное поведение - интерфейс. Ну не делать же интерфейсы для dto и подобных
@LinDahai884 жыл бұрын
А почему нет? Допустим dto который надо записать в базу или сериализовать куда-то или один большой dto конвертировать в несколько маленьких.. И что всю эту функциональность пихать в одну реализацию? А если завтра потребуется поменять серализацию из json в bin, или xml? ИМХО делаем dto с чистыми данными и дальше декоратором наворачиваем всю эту логику.. Проблема в том что как правило программисты сначала пишут реализацию а потом из нее extract interface. Но на практике чаще всего класс реализует несколько интерфейсов, а вся та реализация которая была написана ранее является частным случаем и если из нее выделять интерфейс то он должен быть не один а несколько. Это вечная проблема: вместо того чтобы идти от общего - подумать, абстрагироваться, декомпозировать абстракции, и потом уже приступать к частному - т.е. к реализации конкретных классов, люди сначала хардкодят чтобы работало а потом думают. Поэтому все и пользуются мощными IDE которые по сути ускоряют скорость написания кода а не улучшают качество мысли. Если бы приходилось кодить в блокноте то тут же хочешь не хочешь а быстрее сначала подумать а потом только писать.
@lyloo65774 жыл бұрын
@@LinDahai88 >И что всю эту функциональность пихать в одну реализацию? Композицию никто не отменял > если завтра потребуется поменять серализацию из json в bin, или xml? Нужны отдельные интерфейсы для json сериализации, отдельный для xml и т. д. > ИМХО делаем dto с чистыми данными и дальше декоратором наворачиваем всю эту логику.. Почему бы нет, не вижу противоречий. Для ясности, общий интерфейс(ы) над всеми дто или логической группой дто - нормально и правильно. По интерфейсу для каждого класса дто - как-то не очень.
@LinDahai884 жыл бұрын
@@lyloo6577 > Нужны отдельные интерфейсы для json сериализации, отдельный для xml и т. д. Не нужны. Иначе это будут интерфейсы отталкивающиеся от реализации а не от клиентского кода. И начнется: если это json то делаем одно иначе если это xml делаем другое иначе если это bin - третье.... Поставьте себя на место разработчика который будет пользоваться Вашим классом: ему нафиг не нужно знать каким способом вы это делаете. Он знает только о массиве байт и о типе из которого этот массив был получен и два метода Serialize/Deserialize. Остальное для него - магия, избавьте его от этого головняка - у него другая задача. Зато если ходите то хоть шифрование прикрутите к своей сериализации - клиент вообще ничего не почувствует. В этом то и смысл интерфейсов сделать так чтобы клиентский код вообще никак не поменялся при изменениях в реализации класса. > Для ясности, общий интерфейс(ы) над всеми дто или логической группой дто - нормально и правильно. Общий интерфейс над группой дто? Т.е. при изменении или добавлении дто-шек будет меняться интерфейс? Или я не так понял или нафига оно надо? Это мы тогда возвращаемся к теме interface segregation. > По интерфейсу для каждого класса дто - как-то не очень Опять таки здесь нет и не должно быть соответствия между дто и интерфейсом. Например класс Pet не реализует интерфейс IPet. Таких интерфейсов быть не должно. Должно быть класс Питомец реализует интерфейсы Гладебильный, Кормибельный и Играбельный. Чувствуете разницу? Один класс но с разными интерфейсами для разных клиентов. Например хозяин может покормить питомца но гости могу только играть и гладить. Так же и с дто-шками - класс один но интерфейсы разные могут быть для разных задач.
@lyloo65774 жыл бұрын
@@LinDahai88 вы сами приводите примеры "Кормибельный", "Играбельный" - видно что ваши классы реализуют сложное поведение, то есть уже не dto. > Например класс Pet не реализует интерфейс IPet. Таких интерфейсов быть не должно. Я примерно об этом же пишу. Но мне сложно придумать пример из реальной жизни когда все поля дто можно подвести под интерфейсы в стиле "Кормибельный", "Играбельный" Если не обращаться к ДТО объекту напрямую то это именно и получится IPet Вы давно в программировании? )
@LinDahai884 жыл бұрын
@@lyloo6577 > Вы давно в программировании? ) 6 лет, C#, Unity3D > Но мне сложно придумать пример из реальной жизни когда все поля дто можно подвести под интерфейсы в стиле "Кормибельный", "Играбельный" Действительно трудно, но та же сериализация.., или например форматирование.... Сами поля дто-шки трудно назвать полноценными методами т.к. это скорее всего геттеры.., так что думаю это можно не считать. ;) Вообще мы тут спорим про dto. Но если задуматься то это уже не ООП, потому что если это чистые данные без логики которая их обрабатывает то где тогда high cohesion?
@artursveshnikov76684 жыл бұрын
Сергей, плиз, го антипаттерны.
@dashkevi4Mike Жыл бұрын
что значит вызывать класс через интерфейс?)
@wayfarer21784 жыл бұрын
так руководству выгодно, что программисты трекают больше времени - больше платит заказчик, сложнее программа - куда ты, заказчик, от нас уйдешь, только мы можем ее саппортить и стоимость смены команды будет для тебя овердорогой
@maxlich91394 жыл бұрын
да ваще странно, обычно руководство в код не лезет. только тимлиды, сениоры и архитекторы
@wayfarer21784 жыл бұрын
@@maxlich9139 обычно в любой компании есть коммуникация. и обычно трекание времени и отслеживание этого действа - это задача больше PM, чем тимлида или архитектора. и обычно руководство прекрасно в курсе, как ускорить или замедлить проект.
@maxlich91394 жыл бұрын
@@wayfarer2178 ну тонкостей программирования они не обязаны знать
@Vectoreal3 жыл бұрын
Где же инверсия? Что инвертируют-то? И при чём тут интерфейсы? :)
@romawar18693 жыл бұрын
что такое юнит тест ?
@Rustam-b7q3 жыл бұрын
8:05 Берете и расширяете функциональность в нужном....шта?
@majeunesse47224 жыл бұрын
Теперь у меня есть принципы, знаете-ли, и я себя не на помойке нашел
@mikhail85962 жыл бұрын
И ЭТО ПО ПРЕЖНЕМУ СЕРГЕЙ НЕМЧИНСКИЙ, ИУУУУУУУУУ 😊
@SlavaCh4 жыл бұрын
Крч все видео в одном предложение: юзайте классы через интерфейсы.
@ИльяЛюбашов4 жыл бұрын
на самом деле тут еще надо понимать, зачем ты это делаешь, это объясняется в видео :) если просто услышать эту фразу и начать применять то можно еще большего говна поесть. Так и под дтошки интерфейсы можна начать пилить
@maxlich91394 жыл бұрын
@@ИльяЛюбашов интерфейсы под дто-шки!? это жестко))) хотя иногда встречается в том или ином виде
@АбдулкаримКайбалиев4 жыл бұрын
Компьютерная инженерия-это IT ? Если пойти в университет на такой факультет,можно ли потом пойти работать программистом ?
@MaceUA4 жыл бұрын
Всё от тебя зависит. Программисты по факту учатся сами, университет только даёт какую-то небольшую базу, плюс знакомства с товарищами по интересам. А так да, специальность айтишная, идти можно -- главное не забывай учиться самостоятельно. Главная ошибка многих поступающих: думать, что университет тебя научит программировать. Не научит. Хотя на его лабораторках и курсовых можно практиковаться.
@ИльяТретьяков-б1т4 жыл бұрын
Программная инженерия, так часто называют. Как и написали выше, больше создадут среду, дадут пищу для размышления, какие-то основы основ. А хочешь программировать - всё сам. Хотя в ВШЭ, как понимаю, все условия, чтобы разработка занимала все курсы обучения.
@vitalyvolovodenko34734 жыл бұрын
Даеш видео о паттернах
@Макс5232 жыл бұрын
OK!
@pyjvm4 жыл бұрын
Не ну прям на каждый класс - это хрень. На важные классы - да, надо.
@МаксимАлексеев-ч4й4 жыл бұрын
Как определить, насколько класс важен? И как определить эту грань, когда он уже недостаточно важен, для описания его интерфейса?
@pyjvm4 жыл бұрын
@@МаксимАлексеев-ч4й это предохраняет от тех случаев, когда класс используют в рандомных местах проекта, а потом его понадобилось изменить. Некоторые классы (почти) никогда не изменяются и используются в 1 месте. Если 3 мест и больше - точно надо, если проходит ось изменений - точно надо. Если есть бешеные джуно-индусы - точно надо. А ещё это касается только больших проектов, всяким сайтописателям хватает интерфейсов у фасадов модулей.
@владимирсенцов-р1ю4 жыл бұрын
Добавляйте интерфейс если почувствовали, что он нужен. IDE это умеет делать. Если делаете библиотеку, то все что торчит из нее наружу должно иметь интерфейс. В коде сервиса такой необходимости нет. Это ваш код и не надо городить абстракции раньше времени.
@denispriyomov60864 жыл бұрын
Ага, когда пишешь на Яве, когда производительность - это ниже твоего достоинства, когда это не говно-код, а ты так видишь... тогда таки да - всё виртуальное и везде интерфейсы. Осталось только, чтоб авторы STL одумались и всё переписали на интерфейсах.
@maxlich91394 жыл бұрын
Единственный минус DI - все превращается в магию, и потом хрен разберешься что откуда берется, и что как с чем связано
@arthurkhasanov89644 жыл бұрын
Что значит замокать ?)))
@alekseykouzmenko90964 жыл бұрын
Использовать фейковый объект вместо реального. Позволяет изолировать часть логики и/или подменить реализацию метода на более простую.
@maxlich91394 жыл бұрын
используется для тестирования или на время, пока сервис с которым ты должен интегрироваться, еще не написан другими разработчиками
@diandjelo4 жыл бұрын
в названии - DIP, в превью - SRP
@SergeyNemchinskiy4 жыл бұрын
Это дизайнер опять ошиблась 😉
@vitall7893 жыл бұрын
Базовые определения не для понимания, а для галочки такое ощущение!
@bahdanshyshkin79184 жыл бұрын
Название поправьте!
@TetyanaAlymova4 жыл бұрын
поправили, спасибо!
@Buarpa4 жыл бұрын
испорчу картину лайков, поставлю 334-ый :D
@Jdivanchik2 жыл бұрын
Как показала практика, "все классы через интерфейсы" это тоже бред. Нет смысла загонять все классы в интерфейсы! К примеру не стоит делать интерфейсы для моделей или скажет для тех же DTO. А тот кто это сделает или будет призывать к этому на мой взгляд так же является нехорошим программистом. В интерфейсы стоит загонять сервисы, провайдеры, репозитории, обработчики.... То есть те классы, которые что-то делают с окружением, а все те классы, которые ничего не делают с окружением в интерфейсы нужно загонять крайне взвешенно, что бы не наплодил слишком много ненужных интерфейсов.
@МаксимЖивотовский-ж8о4 жыл бұрын
Можно пожалуйста книги для новичков про java на русском.
@SergeyNemchinskiy4 жыл бұрын
видео про книги для программиста: kzbin.info/www/bejne/oIC6aJJ_mpmaY9k
@МаксимЖивотовский-ж8о4 жыл бұрын
@@SergeyNemchinskiy благодарю.
@igorilich13794 жыл бұрын
Что там по мок и стаб Кратенько )
@makskors50023 жыл бұрын
DRY тоже надо :)
@SergeyNemchinskiy3 жыл бұрын
Так есть же
@makskors50023 жыл бұрын
@@SergeyNemchinskiy спасибо, нашёл)
@stan52144 жыл бұрын
Декомпозиция предметной области
@annaumrykhina25404 жыл бұрын
плейлист про декомпозицию: kzbin.info/aero/PLmqFxxywkatSezlaoxwFbdBBnAk_JJ__5
@YuriyStakhniak4 жыл бұрын
Дуже цікавить просто і доступно про AOP. Для чого воно, які задачі вирішує, основні принципи.
@alexkhutornyi4034 жыл бұрын
GoF patterns, растолкуй, плиз
@maxlich91394 жыл бұрын
был же целый плейлист
@74530602 жыл бұрын
Вы хотите общаться с девушкой. Девушка, это интерфейс, а блондинка, брюнетка конкретные реализации. Вот вам старший брат говорит, что вам нужно общаться только с девушками одного цвета волос. Дело к свадьбе и она перекрасилась!
@vufer3d4 жыл бұрын
DRY KISS
@Сергей-м1н8ъ4 жыл бұрын
Знаете о каком принципе рассказывают незаслуженно мало? KISS. А программисты, кому легаси досталось, спиваются потом натурально.