Принцип хорошего кода DRY (dont repeat yourself)

  Рет қаралды 70,858

Sergey Nemchinskiy

Sergey Nemchinskiy

Күн бұрын

Принцип DRY (dont repeat yourself) или "не повторяйся" был сформулирован Энди Хантом и Дэйвом Томасом в их книге The Pragmatic Programmer. Он помогает писать хороший код.
В этом видео о том, в чем заключается принцип DRY, где он используется, в каких случаях использование принципа "dont repeat yourself" вредно.
Курс, о котором идет речь в видео: ANDROID - bit.ly/3h1GXks
Другие курсы для новичков:
JAVA - bit.ly/2FadPKX
JAVA Start - bit.ly/2F5qsXu
Инструментарий JAVA - bit.ly/3m9tuuK
Automation QA (Java) - bit.ly/35fVtCH
ANDROID - bit.ly/3h1GXks
C#/.NET - bit.ly/3h8JGbC
C# START - bit.ly/2Zg4iss
PYTHON - bit.ly/2EZqVL7
FRONT-END - bit.ly/3lYyHFo
WORDPRESS Developer - bit.ly/3jSLd7E
SALESFORCE Developer - bit.ly/2GvOI5s
UI/UX дизайн - bit.ly/2ZdbTIw
Project management - bit.ly/3jSKR0P
Обучение на проекте - bit.ly/3h5gGS7
Продвинутые курсы для состоявшихся девелоперов:
GRASP and GoF Design patterns - bit.ly/3bBkidz
Enterprise patterns - bit.ly/2GDvFX8
Сайт Foxminded: bit.ly/2R5mGA0
Foxminded в ФБ: / foxmindedco
FoxmindEd в Instagram: / foxminded.ua
Foxminded в VK: foxminded
Мой Telegram: t.me/nemchinskiyOnBusiness
Мой блог: www.nemchinsky.me
0:00 вступление Сергея Немчинского
0:22 в чем заключается принцип DRY (don’t repeat yourself)
5:45 про использование генераторов кода, автоматических систем компиляции
7:25 единственный источник истины (single source of truth (SSOT)
7:58 рекламная пауза
8:55 применение принципа DRY
11:38 WET - «Write Everything Twice» или «We enjoy typing»
11:58 когда DRY не работает

Пікірлер: 232
@eugenem.2263
@eugenem.2263 3 жыл бұрын
Согласен, не стоит повторять самого себя. Согласен, не стоит повторять самого себя.
@div3975
@div3975 3 жыл бұрын
Согласен с предыдущим оратором, поэтому просто сошлюсь на его слова.
@user-bj1ik2qz5z
@user-bj1ik2qz5z 3 жыл бұрын
Интересно про монолит, очень! Запишите в формате типа Монолит VS Микросервисы Да и вообще, расскажите про оба подробно, а потом это сравнение или наоборот.
@matvejyoutube4424
@matvejyoutube4424 3 жыл бұрын
+
@LinderVortex
@LinderVortex 3 жыл бұрын
Да госпаде) если ОЧЕНЬ интересно, то у Немчинского есть на этом канале несколько видео, в каждом одна и та же лекция прямо про это. Он в одном видео так и сказал: "мои зрители не знают, что я снимал раньше, поэтому имеет смысл повторять те же темы каждый год". И натурально повторяет) Прям можно прогресс видеть, что изменилось, а что излагает как прошлый раз.
@AlexS-gn9tq
@AlexS-gn9tq 3 жыл бұрын
не так давно был стрим где этой теме было посвящено не мало времени
@sfoxer
@sfoxer 3 жыл бұрын
@Владислав Бахмацкий иди своей дорогой, сталкер)
@lionlinux
@lionlinux 3 жыл бұрын
"нижний плечевой пояс" - супер!
@olegkovalenko2797
@olegkovalenko2797 3 жыл бұрын
"Принцип диареи" - звучит просто отпад)))))
@user-cw2hf9nz6f
@user-cw2hf9nz6f 3 жыл бұрын
Только на днях наткнулась в вакансии на требование "Понимание базовых принципов разработки SOLID, KISS, DRY;" и тут же решила пересмотреть существующие видосы на эту тему😄 Немчинскому респект за полезную и нужную информацию!!! 👍
@alexandernifanin7366
@alexandernifanin7366 3 жыл бұрын
Предлагали целоваться насухую?
@Sergey82428
@Sergey82428 3 жыл бұрын
Принцип великолепный, но есть и исключения. Например, создаем мы мобильное приложение, в нем есть разные экраны. Между некоторыми экранами мы видим схожие черты, и мы выделяем единый модуль, который настраивается клиентским кодом на разных экранах по-разному. А потом внезапно заказчик мутитрует этот модуль на всех экранах в совершенно разные стороны. Приходится или люто расширять интерфейс и возможности по кастомизации (что снижает эффективность обобщения, ведь мы хотели сделать этот модуль автономным и забыть о нем), или докидывать вспомогательные классы и перебалансировать модуль (рушим принцип OpenClosed и переписываем половину модуля заново). А можно просто не бежать впереди паровоза и не обобщать раньше времени то, в чем ты не уверен. Иногда оставить в разных местах почти одинаковый код - неплохое решение.
@user-yh7zc9ke4s
@user-yh7zc9ke4s 3 жыл бұрын
Потом в каждую из копий кода вносить правки, так утомляет, лучше уж наколхозить вставок, чем это
@sergejskozlovics9667
@sergejskozlovics9667 3 жыл бұрын
да, видео про монолитные системы было бы кстати; можно ещё подискутировать почему монолитное ядро линукс вытеснило модулярные и гибридные ядра, популярные в то время
@Pchelinskii_Sergei
@Pchelinskii_Sergei 3 жыл бұрын
Не заметил в видео информации и монолитных системах.
@SpaSergo
@SpaSergo 3 жыл бұрын
@@Pchelinskii_Sergei 11:05
@yuriyuldashev9513
@yuriyuldashev9513 3 жыл бұрын
Дискутировать в общем то и неочем, проект gnu так и не смог создать нормально работающее микроядро, а работать было надо, вот и взяли монолит Линуса. Microsoft сделали микроядро, но были просадки по скорости, поэтому впихнули в ядро графическую подсистему, получилось гибридное ядро.
@pvhnexsys
@pvhnexsys 3 жыл бұрын
Класс! Какой порядок в голове после Ваших видео!
@user-ji7xx4nk2b
@user-ji7xx4nk2b 2 жыл бұрын
Про генерацию кода. Android Studio жестко на него завязан. Половина современных библиотек зависит от кода, генерируемого плагинами Gradle.
@Daniilnew
@Daniilnew 3 жыл бұрын
Интересно про монолит!) Вообще спасибо за то, что Вы есть.
@Vlad-em1bx
@Vlad-em1bx 2 жыл бұрын
Очень интересное объяснение. Особенно интересно по примеры когда DRY не применим. О том где это не применимо еще ни от кого кроме уважаемого автора не слышал. Спасибо.
@JohnGrave
@JohnGrave 3 жыл бұрын
Голосую за видео про преимущества монолитных систем!
@maksp.5366
@maksp.5366 3 жыл бұрын
Спасибо. Стараюсь вникать в "правильные" правила кодинга ))) И просто интересно
@leonl2794
@leonl2794 3 жыл бұрын
Немного удивила позиция Сергея насчет автогенерации кода. Впрочем, я думаю, его мнение справедливо в первую очередь для бэкенда. А вот на Андроиде как минимум тот же Dagger (DI-фреймворк) формирует зависимости модулей именно статическим путем - генерацией кода. И да, он вполне читабельный. Раньше, как мне известно, для этих целей использовалась рефлексия, но это было чревато снижением производительности и отсутствием возможности отладки до запуска и компиляции, т.е. если для какого-то модуля недостает какого-то другого, то в случае с автогенерацией это можно выяснить при компиляции. Для меня это огромный плюс. Я и так хорошо поломал голову над DI, когда его осваивал, если бы ошибки всплывали только в рантайме - понадобилось бы больше времени на набивание шишек и выяснения того, как нужно сделать так, чтобы заработало. А еще ORM (Room) формирует огромный сгенерированный говнокод для взаимодействия с SQLite, а разработчик лишь пишет Dao-интерфейс с SQL-командами в аннотации, а все остальное генерирует annotation processor. Насколько я знаю, на бэкенде (в Spring вроде бы) используется именно рефлексия для DI. Но там и масштабы другие и производительности хватает для всяких рант-тайм штук.
@user-jc8ne3ph6f
@user-jc8ne3ph6f 3 жыл бұрын
Спасибо большое за видео!) Очень круто подаёте информацию!))
@t2elzeth
@t2elzeth 3 жыл бұрын
обожаю ваши учебные видео. продолжайте!
@Sergiusnick
@Sergiusnick 3 жыл бұрын
Я бы выделили еще пару мест-исключений: 1. Написание юнит-тестов. Простой тест без наследований, импортов и вызовов функций легко читается, легко и быстро можно понять, что там сломалось 2. Сериализаторы. Их проще каждый раз создавать заново, чем наследовать, изменяя список полей. При большом дереве наследования легко запутаться
@aerahtv0000
@aerahtv0000 3 жыл бұрын
Дякую, Сергiй! Якраз шукав iнфу про це, чудове пояснення!
@alexandernifanin7366
@alexandernifanin7366 3 жыл бұрын
Ну как, чудодейственные пояснения помогли - код превратился в DRY?
@azamatk4302
@azamatk4302 3 жыл бұрын
Мне приходилось дублировать код в Angular. В нескольких компонентках код был схож на ~70%. Да, можно было схожий код запихнуть в отдельную компонетку и ее использовать во всех тех компонентках. Все это хорошо, но я понимал, что при первой же доработке любой их этих компоненток придется все переделывать. Там было логично оставить дублирующий код.
@cyrilanisimov
@cyrilanisimov 3 жыл бұрын
Вот мы тут DRY обсуждаем, а в винде 10 две панели управления - вот вам и драй)
@alex_chugaev
@alex_chugaev 3 жыл бұрын
В точку. Сильно бесит
@user-tt9ur4vt4j
@user-tt9ur4vt4j 3 жыл бұрын
Это несколько вьюшек для одного объекта настройки. Значения настроек-то в обоих панелях не отличаются = принцип не нарушен.
@meduzka
@meduzka 3 жыл бұрын
@@user-tt9ur4vt4j паттерн посредник
@andreikashin
@andreikashin 3 жыл бұрын
no
@cyrilanisimov
@cyrilanisimov 3 жыл бұрын
Дорофеев Сергей да-да, особенно список установленных программ один, да
@valde_mar
@valde_mar 3 жыл бұрын
Сергей, ещё интересно было бы про Code Smell посмотреть. Википедия википедией, но ваши объяснения с примерами из жизни/опыта прекрасны.
@ovinnickoffandrej
@ovinnickoffandrej 4 ай бұрын
Убедили! Никогда не буду повторять себя в коде, чтобы потом там не искать свои копипасты. Спасибо!!!
@vova2966
@vova2966 3 жыл бұрын
Спасибо за видео 🙂
@romantsyupryk3009
@romantsyupryk3009 3 жыл бұрын
Большое вам спасибо за это видео.
@Dmitrii-Zhinzhilov
@Dmitrii-Zhinzhilov 2 жыл бұрын
Сергей, благодарю!
@gustaugutter9477
@gustaugutter9477 3 жыл бұрын
фон - огонь
@kovtunshu
@kovtunshu 3 жыл бұрын
Чашка на столе тоже
@fritt_wastaken
@fritt_wastaken 3 жыл бұрын
Ещё пример нарушения dry - когда один и тот же модуль написан на разных языках, например под процессор и под видеокарту. Не всегда удаётся эти две имплементации как-то обобщить
@user-pu8db6oy8e
@user-pu8db6oy8e Жыл бұрын
Спасибо, очень понятно
@yurim7756
@yurim7756 3 жыл бұрын
Что-то мне сегодня ютуб вас подкидывает ) Вам весьма повезло, если считаете, что программисты знают что надо этот DRY использовать. Для баз данных еще есть какое-то понимание, почему там нельзя дублировать данные. А вот, как только начинают класс писать, С ХОДУ, вот прямо как только подумал, что классу что-то надо, сразу скопировал данные в поля класса. Не из источника брать, а только дублировать )) Мало того, и код дублируют, причем настойчиво, думая что это хорошо, доказывая что это хорошо, и иногда думая, что это я старый и не шарю в мегакрутом подходе для сервисов и микросервисов )) Это вроде в сервисах не может быть общего кода. Т.е. настойчиво, в рамках одной системы, пишут компоненты, где вот тупо одно и то же несколько раз написано. А потому что сервис. А потому что в каком-то странном их воображении, так безопаснее, мол они независимые, у них только интерфейс. Зато, когда приходит требование изменять, надо во всех модулях менять. На счет генерации кода, я пользую, сам пишу генераторы или трансляторы. Но это когда никак иначе. Например, для какой-то своей ORM, надо классы для мапа в базу данных. Вообще, отношусь где-то так. Генерация лучше чем ничего, т.е. чем дублировать работу руками. То что там говнокод генерится, не страшно, главное что без ошибок. На то она и генерация, не для людей. Но, при этом, чаще всего, надо смотреть в сторону, а нет ли баги в архитектуре, раз нужна генерация. Потому что в первую очередь надо приводить саму архитектуру к такому виду, чтобы не нужно было дублировать что-либо, а генерация говорит о том, что автоматизировали рутину. Но наверное, ее вообще не должен код требовать.
@nooftube2541
@nooftube2541 3 жыл бұрын
Вот кстати на счёт изменение кода во всех местах - это не всегда так. Очень часто бывает так что изменение нужно только в одном месте (по разным причинам, но зачастую потому что это другая часть программы и мы не хотим ее трогать)
@vadmall85
@vadmall85 3 жыл бұрын
Про монолит интересно!
@iliys1994
@iliys1994 3 жыл бұрын
было бы интересно посмотреть на примеры кода
@sergem2794
@sergem2794 3 жыл бұрын
Отличное видео.
@mrfreelancerpaul6679
@mrfreelancerpaul6679 3 жыл бұрын
Супер, фисташковые обои!
@alekseytsvetaev6261
@alekseytsvetaev6261 3 жыл бұрын
Про сравнение монолита и микросервиса было бы интересно)
@mikhaillucky8130
@mikhaillucky8130 3 жыл бұрын
интересно было бы услышать мнение о таких принципах разработки как TDD, и возможно других, связанных с тестированием.
@andrewzaitsev6668
@andrewzaitsev6668 3 жыл бұрын
Еще пример возможно нарушающий DRY, это CQRS + ES и построение представлений в отдельной бд, то есть данные в итоге имеют разную структуру но по факту повторяются.
@andrewzaitsev6668
@andrewzaitsev6668 3 жыл бұрын
На клиенте и на сервере можно сделать единые валидационные правила. Fluent Validation в помощь, достаточно лишь вызывать метод validate(model);
@grafougen4563
@grafougen4563 3 жыл бұрын
11:15 Сергей: "Монолит - хорошая полезная штука" Где-то в далеке послышались злые звуки Соера
@user-br4gt7xu2j
@user-br4gt7xu2j 3 жыл бұрын
где-то в высоте..
@user-md3xy2kc5l
@user-md3xy2kc5l 3 жыл бұрын
Дублирование в легаси может появиться не с пустого места и решать какие-то проблемы. В частности при переходе/миграции между разными платформами часто делают поэтапный переход с поддержкой двух параллельно развивающихся систем. Авто-генерация тоже не грех. Особенно, если генерация API идёт через JSON-схему. Это позволяет отвязать API от реализации на конкретном языке и платформе. Ещё дублирование может быть вызвано оптимизациями запросов в БД, либо потребностью хранить в истории операций дополнительную информацию, не относящимися к самой операции (например, баланс счёта до и после операции, а не только сумму списания/зачисления), тоже самое и про дублирующиеся проверки на фронте и бэке.
@iluhakhurtin
@iluhakhurtin 3 жыл бұрын
Михаил Братухин примерно то же самое хотел написать. Как правило все эти дубляжи не просто так берутся.
@khusamalfas2121
@khusamalfas2121 3 жыл бұрын
Сергей Спасибо за видео. Какой тип паттерна архитектуры программного обеспечения можно использовать для (DRY). Пожалуйста, пример с открытым исходным кодом
@vadim0morozov
@vadim0morozov 3 жыл бұрын
Здравствуйте, Сергей. А что по поводу автогенерации кода в Entity Framework - Database First?
@vasiliyfofanov2605
@vasiliyfofanov2605 3 жыл бұрын
Про генерацию кода - можно поспорить, а лучше послушать мнение от Сергея по поводу DSL(Domain Specific Language). Иногда проще разработать небольшой язык и описать систему на нем, а далее сгененрировать код на общем языке(Java, C# и тд) У JetBrains прям целая платформа есть MPS для этого Обычно DSL понятен не только программисту, но и аналитику, тестеру, клиенту. В идеале сами требования транслируются прямо в код на общем языке Ждем видео по DSL
@eugene3685
@eugene3685 3 жыл бұрын
В одном из проектов был бизнес леер. На основе его паблик метов, генерировался прокси, который вклчючал в себя логирование, откат трансакций, выполнение на другом потоке и многое другое. Перегенерирование случалось когда изменялись сигнатуры публичных методов. Вот для чего это нужно. И работало все как часы. Вот вам еще пример автогенерации, который мне кажеться очень крут. При добавлении обектов, генерируются их билдеры, спомощью которых, можно легко создать нужный объект и написать тест.
@Oleksii_Leshchenko
@Oleksii_Leshchenko 3 жыл бұрын
Про монолиты тоже прослушал бы
@vv_a13nchik_vv24
@vv_a13nchik_vv24 3 жыл бұрын
Давай делай про монолит, ждем
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Что думаете по поводу дубликации кода в DTO модели и более тяжелой ее версии для юая?
@Kadabra1981
@Kadabra1981 3 жыл бұрын
Сергей, а как быть если генерирование кода используется для проектов на нескольких языках? Скажем есть firmware на CPP и GUI на JAVA- и там и там одинаковые сущности с одинаковым поведением, генерация позволяет синхронизировать изменения в описании сущности сразу в 2 языках.
@alexdec2109
@alexdec2109 3 жыл бұрын
Можно пожалуйста в таком же формате про Закон Деметры.
@SpaSergo
@SpaSergo 3 жыл бұрын
Хочу видео Монолит vs Микросервисы.
@user-so3eg1rw8l
@user-so3eg1rw8l 3 жыл бұрын
Писал бакалаврскую по микросервисам, было бы интересно посмотреть как в монолите можно решить те проблемы, которые привели к микросервисам
@smarthedgehog3185
@smarthedgehog3185 3 жыл бұрын
Крассава :) Осталось ещё YAGNI
@badbear6179
@badbear6179 3 жыл бұрын
Студия шикарная
@user-ot7wm6vo8j
@user-ot7wm6vo8j 3 жыл бұрын
Монолит интересно, ждем видео.
@immortal-spirit-13
@immortal-spirit-13 3 жыл бұрын
Спасибо :) класссс 👍
@vitalyromas6752
@vitalyromas6752 3 жыл бұрын
Багато корисного. Дякую.
@makskaraban6142
@makskaraban6142 3 жыл бұрын
Расскажите про монолит!!!
@helpletmego4216
@helpletmego4216 2 жыл бұрын
сергей: DRY субтитры: ✨ Dior ✨
@SergeyNemchinskiy
@SergeyNemchinskiy 2 жыл бұрын
ахаха
@Fiard2
@Fiard2 2 жыл бұрын
Автогенерация частенько нужна в сетевых протоколах между разными языками, и должна производится на этапе сборки проекта, а кодеген не должен отдаваться под СКВ, это просто промежуточный артефакт сборки (ну, если мы рассматриваем систему нормальных людей). Иногда кодеген нужен и для всякого сетевого транспорта низкого уровня в рамках одного языка, когда нужны сложные взаимодействия и нужно быстродействие, поэтому никакого доступа к рефлекшну и подобных вещей допускать нельзя, а хочется всякие данные прямо таки упаковывать поБИТно в поток, при этом описывая свои данные по-человечески, удобными декораторами и т.п. Естественно, сгенеренный код НЕ меняется вручную НИКОГДА. Если нужно расширить его функционал, нужно расширять саму кодо-генерацию. Однако кейсы, когда это действительно нужно - есть.
@user-xb7wq5kp5l
@user-xb7wq5kp5l 3 жыл бұрын
если база хранится в одной базе "долгого хранения", а для быстрого поиска в виде дерева в другой БД, реалтайм. нарушение? если сделано осознанно из-за ограничения по времени выполнения запроса. запись в обе БД из одного скрипта.
@typahastler8547
@typahastler8547 3 жыл бұрын
Хочу видео про монолит
@borisoffdenis
@borisoffdenis 3 жыл бұрын
В этой самой книге, которую вы упоминаете (The Pragmatic Programmer), есть глава о том, что надо использовать автогенерацию кода). Вроде в разделе The Basic Tools. Книга в целом хорошая, но местами устарела. А ваш видос - это лайк!
@olegscherbakov5984
@olegscherbakov5984 3 жыл бұрын
Здравствуйте, я Сергей Немчинский и я расскажу вам как не повторять каждый раз "Здравствуйте, я Сергей Немчинский" :-)
@crackinglad7644
@crackinglad7644 3 жыл бұрын
вот захочется Сергею сменить имя, после чего зайдёт в ютуб - а плейлист весь красный, придётся в каждом видео менять..
@user-cw5gp8lu4e
@user-cw5gp8lu4e 3 жыл бұрын
По поводу монолита и микросервиса, пролейте свет для малоопытных пожалуйста)
@UserArtem
@UserArtem 3 жыл бұрын
Здравствуйте. Есть у меня такой вопрос. Нарушает ли (или имеет ли отношение к) принципы DRY такой кусок кода. this.variableA.variableAA = someValue this.variableA.variableAB = someValue2 this.variableA.variableAC = someValue3 this.variableA.variableAD = someValue4 Вопрос в том должна ли бить вынесена this.variableA в отдельную переменную во избежание дубликаций val myVariable = this.variableA myVariable..variableAA = someValue ...
@DimaVort
@DimaVort 3 жыл бұрын
Стало интересно: а распределенные базы данных - это нарушение принципа dry? Ведь одни и те же данные лежат в разных местах, плюс еще изза ошибок обмена или репликации могут не сходиться.
@Satmek
@Satmek 3 жыл бұрын
Расскажите про монолит
@valeriisloboda6150
@valeriisloboda6150 3 жыл бұрын
Щодо генерації коду, я б не був таким категоричним. Ми на проєктах використовуємо typescript generator, який генерує з java DTO їх аналоги в typescript. Нічого поганого в тому нема, хоч і наш фронт-енд ПОВНІСТЮ залежить від згенерованих класів. Ніяких проблем з тим нема, навіть більше того, то нас береже від помилок з літерувками. Другий приклад. Ми мали проєкт, де була купа табличок, в яких була купа фільтрів. Але була вимога до нашого API, що практично кожен метод який повертав дані для таблички, мав піти продубльований, щоб він ще й повертав ті самі дані в CVS файлі. Ми написали модуль, який генерував контроллери, в яких були ті самі методи, але з суфіксом '.../csv'. Код там був так собі, але зате ми скоротили кодову базу на 30%.
@NikolayForostiy
@NikolayForostiy 3 жыл бұрын
я за монолит!
@kirill2974
@kirill2974 3 жыл бұрын
Запишите, пожалуйста, почему обычно монолит лучше микросервисов.
@frontistes
@frontistes 3 жыл бұрын
Про генерацию 👍👍👍👍👍 Наболело
@andreikashin
@andreikashin 3 жыл бұрын
"на моем компе работает" (С)
@romannikulin6145
@romannikulin6145 3 жыл бұрын
@@acd2377 студентов? неееет. Это любой, кто делает некую деятельность в коллективе, где в итоге должны объединить всю вашу работу ещё с кем-то
@Wave_ch
@Wave_ch 3 жыл бұрын
А ведь у меня в универе реально были такие случаи, но только с файлами Microsoft Office (к примеру, на моём компе документ отображается правильно, а на компах в универе нет)
@user-tm6li9el4o
@user-tm6li9el4o 3 жыл бұрын
@sergey, если есть свичеры в андроид с другого языка, есть вариант найма в СПб, опыт на андроид не обезателен, надо только желание учить его)
@MrStealthWarrior
@MrStealthWarrior 3 жыл бұрын
Следуя принципу DRY нужно не уходить совсем в фанатизм. Переиспользоваться должна логика, а не просто код. Если код похож, но является частью выполнения различных задач - это не кандидат на попытку куда-то его вынести.
@xm4dn355x
@xm4dn355x 3 жыл бұрын
Сергей, Вы забыли апостроф в названии видео в слове "don't"
@naivais
@naivais 3 жыл бұрын
@Sergey Nemchinskiy DRY - по-английски - ди-аа(эр)-вай (читайте по буквам), а лучше всё-таки "драй "
@user-iy8gp5ec6c
@user-iy8gp5ec6c 3 жыл бұрын
Услышал ваше мнение о кодогенерации, однако, небезизвестный Алан Кей сотоварищи продвигает STEPS, система с иерархической кодогенерацией. Каково ваше мнение об этой системе?
@Merk462
@Merk462 3 жыл бұрын
Постоянно вижу дублирование кода, в некоторых CMS большие куски кода дублируются десятки раз. Это очень плохо, т.к. они с этим живут десятки лет. Да и у меня это иногда само собой получается. А бывают случаи, когда более правильно скопировать метод и переписать часть функционала, и при этом не выносить общий кусок в третий метод. При этом получится 2 метода с частично дублированнм кодом. Но дублированние данных - это скорее нонсенс.
@stepanstulov9871
@stepanstulov9871 3 жыл бұрын
Real time играм, которые интерполируют на клиенте пока сервер не ответил, не обязательно нарушать принцип dry. Принцип dry про непереписывание кода дважды. Но один и тот же код два раза в двух местах исполнять вполне нормальо ничего не нарушая. Просто его нужно вынести в переиспользунмый модуль. Некоторые высокоуровневые сетевые фреймворки в некоторых игровых движках типа Unet в Unity вообще позволяют не думать сервер ты или клиент, ты просто пишешь что происходит в общем, а дальше все само разделяется (ок, это слегка упрощение конечно). Если бэк и фронт на совсем разных технологиях, то тут дублирование логики нужно или действительно переписывать или брать/изобретать некие декларативки с генераторами кода. Типа как какой нибудь ProtoBuf. Если они есть конечно.
@nameundef8076
@nameundef8076 3 жыл бұрын
Можно для той же проверки использовать одни и те же регексы.
@sakharuk
@sakharuk 3 жыл бұрын
Лайк за келих )
@MrLobash
@MrLobash 3 жыл бұрын
Вопрос, а что про модульность? Тоесть если в моем проекте есть сущность "Новости", и есть ... "Статьи", они очень похожи архитектурно, но предметно разные. Если я выведу всё в переиспользование то изменение Новостей изменит Статьи, но если не переиспользовать то местами будет 1в1 одинаковый код.
@user-ym2gd8kh2c
@user-ym2gd8kh2c 3 жыл бұрын
Но вы же будете в рантайме создавать два разных экземпляра объектов, поэтому они будут жить своей независимой жизнью. А вот класс, который будет создавать объекты и для статей и для новостей будет один.
@user-sd4ql7od1o
@user-sd4ql7od1o 3 жыл бұрын
​@@user-ym2gd8kh2c я к тому веду, что абстрактно - это разные сущности, и если две (и более) сущности будут зависеть от реализации (так совпало что логика в них одинаковая) то мы нарушаем DIP, и если придет программист Петя и поправит "новость" думая что поступает правильно, цепляет ещё и "статьи" и ему от тестирования приходит ошибка с левого модуля. и т.о. модульность тоже нарушается (правим один модуль, не так работает другой)
@ShadeAlina
@ShadeAlina 3 жыл бұрын
"Автогерерация ... срань господня" - плюсую =)
@user-wv9ds4ft6d
@user-wv9ds4ft6d 3 жыл бұрын
Очень нравятся видео этого автора, но вот не соглашусь с тем, что если код повторяется, то его нужно обязательно натянуть на DRY. Очень частый случай, в моей практике, когда начинаешь писать код (проект или компонент еще молодой и не оброс деталями). Коды очень похожи, повторяются некоторые шаги, но есть и различия. Прежде чем начинать делить, дробить чтобы соблюсти DRY нужно проаналазировать причины для изменения (как раз SRP) если код будет меняться с разной скоростью, если он будет меняться по разным причинам и в будущем еще и планируется, что его будут поддерживать разные команды со своими ТЗ, то беспрекословное следование принципу DRY очень усложняет развитие. В какой то книге я даже читала что этот случай называется: случайное дублирование. И ни раз я сталкивалась с ситуацией когда на начальном этапе коды очень схожи, их выносят в переиспользуемый блок, а потом начинается прирастание всякими if else. И проблемами со слиянием.И еще неприятнее: если нарушается вариантность при поддержке разными командами. Может, конечно я лишь подтвердила мысль обозначенную в последнем разделе видео. Если так, то извиняюсь
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
полиморфизм. паттерны и т.д. - вас спасут
@M0ToR
@M0ToR 3 жыл бұрын
Сергей, у вас отличные видео, и подача, и материал - на высоте, более того - вы в теме преподавания, а значит вы знаете цену самосовершенствованию, к тому же у вас учатся люди. Ваши ошибки, даже мелкие - осядут в головах тех, кто вас слушает, даже такая мелочь, как произношение DRY. Вы выкладываете видео на платформе, на которой есть носители практически любого языка. Написав “don’t repeat yourself” в поиске, можно получить однозначный ответ - как правильно произносить термин, принесенный из другого языка, если термин не авторский - вряд ли есть место авторскому произношению.
@user-cx7gv9oc2t
@user-cx7gv9oc2t 3 жыл бұрын
Забавно, смотрел конференцию основателя Nginx который против DRY. По крайней мере в администрировании nginx
@Andrew-7324
@Andrew-7324 3 жыл бұрын
Давай про копролит, ой, про монолит
@user-ii2zn7he6r
@user-ii2zn7he6r 3 жыл бұрын
Пример с табличками плохой. Хранилища данных часто создаются не так, чтоб программистам было удобно, а чтоб запросы и BI приложения быстро работали. Если очень нужно, то архитектор данных вполне может разместить те-же данные в нескольких таблицах. Не говорю что это прямо хорошо с точки зрения программиста, скорее о том, что так часто бывает.
@eduardtsuranov712
@eduardtsuranov712 Жыл бұрын
"Нашел колонку" :) - по идее должна быть документация, что тут лежит то, а вот тут это, и надо делать так то и так-то
@user-nj3gk2nn6b
@user-nj3gk2nn6b 3 жыл бұрын
Вы привели пример какого-то такого себе программиста и его проект с базой данных, - - - -> где информация дублируется, - - - - - - - -> но в коде надо вручную вписывать два раза. Может лучше просто написать подпрограмму, которая вставляет в два места? [face palm]
@aleksandrsavvopulo4510
@aleksandrsavvopulo4510 2 жыл бұрын
Считаю что DRY не применим к случаю дублирования кода/данных если это нарушает SRP.
@maksp.5366
@maksp.5366 3 жыл бұрын
Если "монолит" это что то про логику и принцип постоения сервера или ядра системы, "ну и вот это все" ... Я бы послушал )
@alexsokol1086
@alexsokol1086 3 жыл бұрын
srp не задевает dry никак. srp это когда fun doStuff() { // generating stuff ... ... // processing stuff ... ... } никаких дупликаций нет, но один метод выполняет несколько шагов (и хорошо, когда они никак не пересекаются, а то они могут смешаться, могут одни переменные из прошлого шага уходить в следующий, и столько всего ещё может быть). хороший вариант будет таким fun doStuff() { val stuff = generateStuff() processStuff(stuff) } такой код становится понятным и читаемым без комментариев (которые к слову зачастую тоже ошибки, комментарии стоит делать только у методов, но не у строчек кода, если функция pure, то комментарий к функции должен всё объяснять) часто srp всякие геймдевы нарушают, которые не особо заботятся о кодстиле и сначала генерят локацию, а потом расставляют на ней каких-нибудь человечков, в лучшем случае, добавляя комментарии
@idea_man
@idea_man 3 жыл бұрын
Лайк за "нижний плечевой пояс". Орнул.
@maxzeman8219
@maxzeman8219 3 жыл бұрын
В реляционных базах данных ж 1НФ 2НФ ... бойса-кодда итд, интересно много л ли программистов про это знает
@albrehtdurer557
@albrehtdurer557 3 жыл бұрын
Хотим про Монолит!!!
@borisnedovis3296
@borisnedovis3296 3 жыл бұрын
Познавательное видео. Не задумывались снять видео об построение инфрастуктуры проекта в целом ? Спасибо!
@alexanderlex-s933
@alexanderlex-s933 3 жыл бұрын
Спасибо за обзор, Сергей. Не согласен с принципом - нужно или не нужно дублировать данные - если это дает прирост производительности к их чтению-записи на больших объемах - дублировать (кусками) - это решение. Например, 1С основана на принципе дублирования данных. Когда в базе за месяц миллион документов создаются, то любое чтение-запись этого миллиона займет неделю.
@nameundef8076
@nameundef8076 3 жыл бұрын
Это уже кэш, который хорошая система автоматически должна генерить и поддерживать до актуального состояния
@jgkdmdevienjjgg8866
@jgkdmdevienjjgg8866 3 жыл бұрын
одна и та же логика для валидации на фронте и на бэке, логика над данными в актуальной системе и в миграции (которая валидна на какой то момент времени только, а дальше ее могут менять). код, оптимизированный на что-то в одном месте и в других местах общего вида код. на самом деле кучу таких примеров можно найти и иногда копи-паста лучше чем упоротый dry в вакууме. нету универсального подхода) все эти подходы о которых идет речь это скорее то к чему следует стремиться, но оно никогда не работает на практике в его стерильном определении
@Merk462
@Merk462 3 жыл бұрын
Да, и я про то-же. Если есть система, которая генерирует классы/методы, время ограничено, бьюджет так-же, дальнейшее развитие и доработка очень маловероятны, то смысла не имеет рефакторить такой проект. Утверждение, что дублирование кода недопустимо - верно только для дорогих систем с длительной поддержкой и разработкой. Для одноразовых дешевых поделок (которых большиснтво в Вебе) это не верно.
@homo-ergaster
@homo-ergaster 3 жыл бұрын
@@Merk462 одноразовые дешевые поделки вообще писать смысла нет. Берется какой-нибудь Salesforce или Bitrix или вообще Wordpress и тупо натягивается на клиентский дизайн-макет. Или даже тупо покупается готовый шаблон. Для этого даже прогер не нужен.
@Merk462
@Merk462 3 жыл бұрын
@@homo-ergaster Менеджер, угадал?
@homo-ergaster
@homo-ergaster 3 жыл бұрын
@@Merk462 хреновый из тебя экстрасенс
@reznic.a
@reznic.a 3 жыл бұрын
Про монолит +
@thelensky
@thelensky 3 жыл бұрын
Данные прежде всего
Почему нельзя возвращать NULL?
22:11
Sergey Nemchinskiy
Рет қаралды 115 М.
WHY IS A CAR MORE EXPENSIVE THAN A GIRL?
00:37
Levsob
Рет қаралды 14 МЛН
How I prepare to meet the brothers Mbappé.. 🙈 @KylianMbappe
00:17
Celine Dept
Рет қаралды 56 МЛН
100❤️ #shorts #construction #mizumayuuki
00:18
MY💝No War🤝
Рет қаралды 20 МЛН
Dynamic #gadgets for math genius! #maths
00:29
FLIP FLOP Hacks
Рет қаралды 19 МЛН
Принцип хорошего кода YAGNI ("You aren't gonna need it")
15:08
Как форматировать код правильно?  Clean Code
20:58
6 способов выучиться на программиста
17:42
Sergey Nemchinskiy
Рет қаралды 467 М.
WHY IS A CAR MORE EXPENSIVE THAN A GIRL?
00:37
Levsob
Рет қаралды 14 МЛН