Спасибо за видео, очень круто! Я бы во втором рефакторинге (где if-else), заменил вызов двух функций на один, просто подменял бы итерируемый объект перед вызовом, тем самым убрал ы еще часть дублирования и уменьшил на один уровень вложенность iter_object = len(data) if len(data) >= units: iter_object = units for i in range(iter_object): write_to_db_and_sendimessage(city, data, i, message)
@@databox4279 строчку про range? Ну если вдруг это сложно читать - нужно срочно качать навыки а к языкам фп лучше вообще не подходить. А мне читается гораздо лучше чем iter_object
Огонь!!!! В конце со словом Адрес, как раз показана типичная проблема дублирования кода/информации и почему от этого нужно избавляться. Автор кода продублировал и видимо истинность условия проверил и на этом успокоился (код же по его мнению одинаковый, а опечатку и не видит, глаз замылен)
Очень полезное видео для начинающих разработчиков, продолжайте далее вести эту тему. Намного лучше тем аналогичные "типичные ошибки" у других разработчиков-блогеров
Думаю в первом кейсе рефакторинга в эту кастомную огромную функцию для добавления каких-то данных в рещультат лучше было бы установить дефолтные значения для "кастомных" полей. Кастомные поля у нас user_max_value, user_min_value и check_price_per_month (который добавили для удобности, пусть будет). В первые два поля установить значение по умолчанию в None, а третье в False. И тогда их просто не придётся передавать в первом варианте, а во втором кастомном, можно сказать навороченном, уже будем передавать. Ну и конечно написать комментарий при каких условиях эти данные передать и что они делают :)
В последнем случае два цикла не нужны и два вызова функции (можно вообще без нее) Достаточно: for i in range(units) if len(data) >=units else range(len(data)): ... тут уже или функция или оставить заполнение если полагаются еще варианты, то тогда патеерн матчинг напрашивается
Спасибо. Ну PyCharm работает в рамках одного проекта. Если внутри проекта надо переместить класс , функцию или файл , мы используем секцию refactoring. Если вам зачем-то надо внешний модуль к себе копировать (что я не рекомендую) , то надо все зависимость руками копировать тоже
Можно в группе в Тг спросить в разделе books. Лично я все на работе изучаю, гуглю , читаю доку. По Джанго , единственное что изучать стоит это Orm, все остальное ну совсем мало инфы и можно в процессе разобраться. По питону, ну люди читают Марка Лутца, это чтобы прям глубоко копнуть . Это если тема устройства языка интересна. Я люблю куры на udemy смотреть на Английском. Но не по питону.
Спасибо огромное. А по сервакам например, как правильно настроить nginx, gunicorn, daphne, какие-нибудь хитрости или как-то упростить есть возможность деплой? Или же может у тебя есть советы по работе с celery. Стоит ли знать углубленно celery для работы, на собесе однажды спрашивали. Часто ли ты использовал в работе многопоточку или асинк? И опять же вопрос насколько углубленно надо знать по-твоему мнению? Интересно поспрашивать, услышать твое мнение, если не сложно, спасибо!@@SeniorPomidorDeveloper
Да все надо знать углублено, но углублено знать все невозможно) Как настроить сервер? Отличный вопрос для комментария под видео )) у меня по этому поводу тут целый курс лежит ) Celery надо знать, но по ней в принципе настроек не много и инфы там не много. Частично я о ней рассказал в курсе «оптимизация». Асинхронное программирование в продакшн использовал редко , но буду больше. А вот про проблемы параллельных тасков я опять таки рассказывал в курсе . Они все тут лежат .
26:22 write_to_db_and_send_message(city, data, i, message) - две одинаковые строки в if else - это считается дублирование кода? на мой взгляд считается. Как понять грань, когда можно оставить две одинаковые строки в коде у году легкости чтения, и когда нужно избавляться от дублирующихся строк? в этой функции и могут поменяться количество аргументов и тогда нужно изменять вызов функции в двух местах if /else . Или конкретно в этом случае это не является дублированием? Прокомментируйте этот момент в след видео. Вызов функций считается дублированием кода, если он одинаков в разных местах?
Там был неплохой ответ по этому кейсу от Ильи, как тут можно еще уменьшить дублирование. Я закрепил его к этому видео. Я думаю что вызов функции в двух местах с одинаковыми агрументами это, скажем, допустимое дублирование. Нет смысла выносить его в третью функцию, так как это всего одна строка. Если только делать как Илья предложил и выносить все вместе с итерацией. Грань эту каждый определяет для себя сам. По моему, если это дублирующийся блок кода то лучше выносить, если просто вызовы одной функции - то не нужно. То, что при изменении аргументов в функции надо менять во всех ее вызовах - это нормально. Есть другие способы рефакторинга, кроме выноса в функцию и они как раз будут более актуальны для кейсов, когда у нас много одинаковых вызовов какой-то функции. Я постараюсь о них рассказать в следующем видео.
Согласен полностью. Плюс еще можно добавить, чт опосути рефакторинг в функцию вообще не всегда оправдан и этот пример в этом смысле оч нагляден. Вызов вфункции не "бесплатен" он несет расходы как по памяти так и по быстродействию (тут кстати большой привет всем любителям рекурсии ). И если единичными можно пренебречь, то как раз в цикле это очень заметно. Вдруг в нем будет тысяча итераций, а может сто тысяч? И тут правильный рефакторинг как рза вычислить заранее рендж для цикла, а само тело цикла вообще не трогать
Да наверно так. Но чтобы сказать точно - надо посчитать. Насколько расход памяти больше? На 10% или на 0,001% ? В Джанго приложениях мало кто заморачивается именно подсчетом оверхеда вызовов в коде, там как правило ORM составляет подавляющее большинство расходов по памяти и по всему остальному .
Да , я так изначально и хотел . Сделать ревью какого-нибудь проекта целиком . Но не нашел пока такой чтобы идеально для этой цели подходил. Пока только отдельные файлы в отдельных проектах. Думаю что еще найду, со временем.
Сорян, но есть замечания: 1 во втором случае, очевидно что итерируется по наименьшему из значений и правильней брать min от длины data или значения unit там даже можно было не выносить, а просто в строке с for выбирать наименьшее 2 ну пожалуйста, пользуйтесь black, ужасно смотрится код, а главное плохо читается
Спасибо за видео, очень круто!
Я бы во втором рефакторинге (где if-else), заменил вызов двух функций на один, просто подменял бы итерируемый объект перед вызовом, тем самым убрал ы еще часть дублирования и уменьшил на один уровень вложенность
iter_object = len(data)
if len(data) >= units:
iter_object = units
for i in range(iter_object):
write_to_db_and_sendimessage(city, data, i, message)
Да да, идея хорошая. Там много еще всего можно сделать.
это не iter_object а инт из которого делается рейндж, и сделать это гораздо проще через `range(min(units, len(data)))`
@@clauseclause6640 а читать такой код тоже проще? Особенно через месяцев 6...
@@databox4279 строчку про range? Ну если вдруг это сложно читать - нужно срочно качать навыки а к языкам фп лучше вообще не подходить.
А мне читается гораздо лучше чем iter_object
Огонь!!!! В конце со словом Адрес, как раз показана типичная проблема дублирования кода/информации и почему от этого нужно избавляться. Автор кода продублировал и видимо истинность условия проверил и на этом успокоился (код же по его мнению одинаковый, а опечатку и не видит, глаз замылен)
Отличное видео! Про встроенный рефакторинг в Pycharm не знал)
Отличное видео. Ждем продолжение про рефакторинг
Формат огонь! Очень интересно и полезно!
Отличное видео. Спасибо за труд. Очень интересно. С удовольствием посмотрю следующую часть.
Лайк не глядя) Теперь смотрим))
Спасибо! Очень полезное видео. Хотелось бы продолжения
Спасибо за урок. Очень нужный материал для всех
Спасибо. Жду новых выпусков.
Очень полезное видео для начинающих разработчиков, продолжайте далее вести эту тему. Намного лучше тем аналогичные "типичные ошибки" у других разработчиков-блогеров
Отлично, спасибо за видео! Полезно!!
формат - отличный
Спасибо, делайте видео по чаще пожалуйста
DRY!
Спасибо хоть ничего нового и не узнал, но информация полезная в любом случае!)
Хорошая подача!)
Скоро будет и для вас кое-что новое, я уверен) готовлю
Дякую за відео.
отличный гайд! где пропадали?
Спасибо!
спасибо за видео,
хотя не мой профильный язык
приятно слушать
Класс
Думаю в первом кейсе рефакторинга в эту кастомную огромную функцию для добавления каких-то данных в рещультат лучше было бы установить дефолтные значения для "кастомных" полей. Кастомные поля у нас user_max_value, user_min_value и check_price_per_month (который добавили для удобности, пусть будет). В первые два поля установить значение по умолчанию в None, а третье в False. И тогда их просто не придётся передавать в первом варианте, а во втором кастомном, можно сказать навороченном, уже будем передавать. Ну и конечно написать комментарий при каких условиях эти данные передать и что они делают :)
Согласен. Это уже на усмотрение автора. Я тут просто идею обозначил, не пытался делать рефакторинг целиком и полностью
nice video
В последнем случае два цикла не нужны и два вызова функции (можно вообще без нее)
Достаточно:
for i in range(units) if len(data) >=units else range(len(data)):
... тут уже или функция или оставить заполнение
если полагаются еще варианты, то тогда патеерн матчинг напрашивается
Великолепно.А как в PyCharm грамотно экспортировать какой-либо модуль в отдельный проект, чтоб скопировались все необходимые функции и зависимости?
Спасибо. Ну PyCharm работает в рамках одного проекта. Если внутри проекта надо переместить класс , функцию или файл , мы используем секцию refactoring. Если вам зачем-то надо внешний модуль к себе копировать (что я не рекомендую) , то надо все зависимость руками копировать тоже
Привет! Можешь ли ты подсказать какие-нибудь ресурсы для углубленного изучения django, python? Для мидла например. Спасибо за видео!
Можно в группе в Тг спросить в разделе books. Лично я все на работе изучаю, гуглю , читаю доку. По Джанго , единственное что изучать стоит это Orm, все остальное ну совсем мало инфы и можно в процессе разобраться. По питону, ну люди читают Марка Лутца, это чтобы прям глубоко копнуть . Это если тема устройства языка интересна.
Я люблю куры на udemy смотреть на Английском. Но не по питону.
Спасибо огромное. А по сервакам например, как правильно настроить nginx, gunicorn, daphne, какие-нибудь хитрости или как-то упростить есть возможность деплой?
Или же может у тебя есть советы по работе с celery. Стоит ли знать углубленно celery для работы, на собесе однажды спрашивали.
Часто ли ты использовал в работе многопоточку или асинк? И опять же вопрос насколько углубленно надо знать по-твоему мнению?
Интересно поспрашивать, услышать твое мнение, если не сложно, спасибо!@@SeniorPomidorDeveloper
Да все надо знать углублено, но углублено знать все невозможно)
Как настроить сервер? Отличный вопрос для комментария под видео )) у меня по этому поводу тут целый курс лежит )
Celery надо знать, но по ней в принципе настроек не много и инфы там не много. Частично я о ней рассказал в курсе «оптимизация».
Асинхронное программирование в продакшн использовал редко , но буду больше. А вот про проблемы параллельных тасков я опять таки рассказывал в курсе . Они все тут лежат .
@@SeniorPomidorDeveloperспасибо за ответы, интересно было узнать насколько и как ты все это используешь в работе. Всего наилучшего тебе!
Спасибо! На работе я совсем не использую серверов. Другие люди настраивают . Питонский стек использую, селери и тд ., докер
26:22 write_to_db_and_send_message(city, data, i, message) - две одинаковые строки в if else - это считается дублирование кода? на мой взгляд считается. Как понять грань, когда можно оставить две одинаковые строки в коде у году легкости чтения, и когда нужно избавляться от дублирующихся строк? в этой функции и могут поменяться количество аргументов и тогда нужно изменять вызов функции в двух местах if /else . Или конкретно в этом случае это не является дублированием? Прокомментируйте этот момент в след видео. Вызов функций считается дублированием кода, если он одинаков в разных местах?
Там был неплохой ответ по этому кейсу от Ильи, как тут можно еще уменьшить дублирование. Я закрепил его к этому видео.
Я думаю что вызов функции в двух местах с одинаковыми агрументами это, скажем, допустимое дублирование. Нет смысла выносить его в третью функцию, так как это всего одна строка. Если только делать как Илья предложил и выносить все вместе с итерацией.
Грань эту каждый определяет для себя сам. По моему, если это дублирующийся блок кода то лучше выносить, если просто вызовы одной функции - то не нужно. То, что при изменении аргументов в функции надо менять во всех ее вызовах - это нормально.
Есть другие способы рефакторинга, кроме выноса в функцию и они как раз будут более актуальны для кейсов, когда у нас много одинаковых вызовов какой-то функции. Я постараюсь о них рассказать в следующем видео.
Согласен полностью. Плюс еще можно добавить, чт опосути рефакторинг в функцию вообще не всегда оправдан и этот пример в этом смысле оч нагляден. Вызов вфункции не "бесплатен" он несет расходы как по памяти так и по быстродействию (тут кстати большой привет всем любителям рекурсии ). И если единичными можно пренебречь, то как раз в цикле это очень заметно. Вдруг в нем будет тысяча итераций, а может сто тысяч? И тут правильный рефакторинг как рза вычислить заранее рендж для цикла, а само тело цикла вообще не трогать
Да наверно так. Но чтобы сказать точно - надо посчитать. Насколько расход памяти больше? На 10% или на 0,001% ? В Джанго приложениях мало кто заморачивается именно подсчетом оверхеда вызовов в коде, там как правило ORM составляет подавляющее большинство расходов по памяти и по всему остальному .
@@SeniorPomidorDeveloper наверное. Я в джанге не специалист. Но рефакторинг все же тема достаточно общая.
Клевый формат, только на мой вкус было бы интереснее пройтись по ошибкам и объяснить вкратце как надо было бы сделать, без самого рефакторинга
Да , я так изначально и хотел . Сделать ревью какого-нибудь проекта целиком . Но не нашел пока такой чтобы идеально для этой цели подходил. Пока только отдельные файлы в отдельных проектах. Думаю что еще найду, со временем.
а в сервисы логику выносить и как это лучше делать мб ДДД ?
Думаю что еще поговорим об этом. Если найду подходящий проект где много логики без сервисов )
@@SeniorPomidorDeveloper теориюб для начала услышать ) а то тема водяная толком про нее ничего нету в интернетах
Да не то чтобы там есть много о чем рассказать.. но если будет кейс то разберем
@@SeniorPomidorDeveloper та саму механику
Добрый день брат в ученики не возмёщ я изучаю Django но так и продвижения мало готов похать за бесплатно это серёзный вопрос пожалуйста заметь
К сожалению, сейчас совсем нет времени обучать кого-то. Чтобы видео снять раз в месяц не всегда получается время найти.
Сорян, но есть замечания:
1 во втором случае, очевидно что итерируется по наименьшему из значений и правильней брать min от длины data или значения unit там даже можно было не выносить, а просто в строке с for выбирать наименьшее
2 ну пожалуйста, пользуйтесь black, ужасно смотрится код, а главное плохо читается
про тестирование - можно было на 2 функции и написать, замокать объекты которые вызываются и проверять с какими параметрами
бля мужик, сделай норм качество видео! подписчики взлетят в космос!!!
Нет, я хочу чтобы они страдали))
а что не так с качеством? 4 или может 8к надо? даже 2к разрешение есть. Видимо ты попал, когда ютуб ролик еще обрабатывал.
В первые минуты после загрузки видео высокое качество не доступно, посмотрел 5 минут в 360p, обновил страницу и фулл хд уже есть
@@databox4279 он наверное про вебку - там света не хватает просто
@@WityazKajit а пон