РЕФАКТОРИНГ: Избавляемся от дублирования

Поділитися
Вставка
  • Опубліковано 23 жов 2023
  • Вот pull request с изменениями - github.com/nikolaisolovev/bot...
    Группа в телеграмме тут - t.me/tomato_python

КОМЕНТАРІ • 61

  • @import_this
    @import_this 7 місяців тому +2

    Спасибо за видео, очень круто!
    Я бы во втором рефакторинге (где 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)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому +1

      Да да, идея хорошая. Там много еще всего можно сделать.

    • @clauseclause6640
      @clauseclause6640 7 місяців тому

      это не iter_object а инт из которого делается рейндж, и сделать это гораздо проще через `range(min(units, len(data)))`

    • @databox4279
      @databox4279 5 днів тому

      @@clauseclause6640 а читать такой код тоже проще? Особенно через месяцев 6...

    • @clauseclause6640
      @clauseclause6640 5 днів тому

      @@databox4279 строчку про range? Ну если вдруг это сложно читать - нужно срочно качать навыки а к языкам фп лучше вообще не подходить.
      А мне читается гораздо лучше чем iter_object

  • @ural-site
    @ural-site 2 місяці тому

    Огонь!!!! В конце со словом Адрес, как раз показана типичная проблема дублирования кода/информации и почему от этого нужно избавляться. Автор кода продублировал и видимо истинность условия проверил и на этом успокоился (код же по его мнению одинаковый, а опечатку и не видит, глаз замылен)

  • @user-ff1sd6wl1h
    @user-ff1sd6wl1h 8 днів тому

    Отличное видео! Про встроенный рефакторинг в Pycharm не знал)

  • @romantretyakov6243
    @romantretyakov6243 7 місяців тому +1

    Отличное видео. Ждем продолжение про рефакторинг

  • @user-it3yo1sn6i
    @user-it3yo1sn6i 7 місяців тому +1

    Формат огонь! Очень интересно и полезно!

  • @OnlyElf
    @OnlyElf 7 місяців тому +2

    Отличное видео. Спасибо за труд. Очень интересно. С удовольствием посмотрю следующую часть.

  • @user-qp8gy9qr1y
    @user-qp8gy9qr1y 7 місяців тому +3

    Лайк не глядя) Теперь смотрим))

  • @user-jd4zq8pj4f
    @user-jd4zq8pj4f 7 місяців тому

    Спасибо! Очень полезное видео. Хотелось бы продолжения

  • @PythonDevelopment
    @PythonDevelopment 7 місяців тому

    Спасибо за урок. Очень нужный материал для всех

  • @andreymirzoyants206
    @andreymirzoyants206 7 місяців тому

    Спасибо. Жду новых выпусков.

  • @shustriy1980
    @shustriy1980 7 місяців тому +1

    Очень полезное видео для начинающих разработчиков, продолжайте далее вести эту тему. Намного лучше тем аналогичные "типичные ошибки" у других разработчиков-блогеров

  • @oldcoders
    @oldcoders 7 місяців тому

    Отлично, спасибо за видео! Полезно!!

  • @nmi2939
    @nmi2939 7 місяців тому

    формат - отличный

  • @thatmaks8094
    @thatmaks8094 7 місяців тому

    Спасибо, делайте видео по чаще пожалуйста

  • @user-hf6qb9qk2p
    @user-hf6qb9qk2p 7 місяців тому

    DRY!
    Спасибо хоть ничего нового и не узнал, но информация полезная в любом случае!)
    Хорошая подача!)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Скоро будет и для вас кое-что новое, я уверен) готовлю

  • @user-fk9rg8oo4u
    @user-fk9rg8oo4u 5 місяців тому

    Дякую за відео.

  • @KratosVI
    @KratosVI 7 місяців тому

    отличный гайд! где пропадали?

  • @Andrey_Fedorov
    @Andrey_Fedorov 7 місяців тому

    Спасибо!

  • @gsnstr
    @gsnstr 7 місяців тому

    спасибо за видео,
    хотя не мой профильный язык
    приятно слушать

  • @Aim300
    @Aim300 7 місяців тому

    Класс

  • @automode3619
    @automode3619 6 місяців тому

    Думаю в первом кейсе рефакторинга в эту кастомную огромную функцию для добавления каких-то данных в рещультат лучше было бы установить дефолтные значения для "кастомных" полей. Кастомные поля у нас user_max_value, user_min_value и check_price_per_month (который добавили для удобности, пусть будет). В первые два поля установить значение по умолчанию в None, а третье в False. И тогда их просто не придётся передавать в первом варианте, а во втором кастомном, можно сказать навороченном, уже будем передавать. Ну и конечно написать комментарий при каких условиях эти данные передать и что они делают :)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  6 місяців тому

      Согласен. Это уже на усмотрение автора. Я тут просто идею обозначил, не пытался делать рефакторинг целиком и полностью

  • @artemserdechnyy3209
    @artemserdechnyy3209 7 місяців тому

    nice video

  • @mikeofs1304
    @mikeofs1304 7 місяців тому

    В последнем случае два цикла не нужны и два вызова функции (можно вообще без нее)
    Достаточно:
    for i in range(units) if len(data) >=units else range(len(data)):
    ... тут уже или функция или оставить заполнение
    если полагаются еще варианты, то тогда патеерн матчинг напрашивается

  • @nohtyp_gniyduts838
    @nohtyp_gniyduts838 2 місяці тому

    Великолепно.А как в PyCharm грамотно экспортировать какой-либо модуль в отдельный проект, чтоб скопировались все необходимые функции и зависимости?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 місяці тому

      Спасибо. Ну PyCharm работает в рамках одного проекта. Если внутри проекта надо переместить класс , функцию или файл , мы используем секцию refactoring. Если вам зачем-то надо внешний модуль к себе копировать (что я не рекомендую) , то надо все зависимость руками копировать тоже

  • @ramil1342
    @ramil1342 7 місяців тому

    Привет! Можешь ли ты подсказать какие-нибудь ресурсы для углубленного изучения django, python? Для мидла например. Спасибо за видео!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Можно в группе в Тг спросить в разделе books. Лично я все на работе изучаю, гуглю , читаю доку. По Джанго , единственное что изучать стоит это Orm, все остальное ну совсем мало инфы и можно в процессе разобраться. По питону, ну люди читают Марка Лутца, это чтобы прям глубоко копнуть . Это если тема устройства языка интересна.
      Я люблю куры на udemy смотреть на Английском. Но не по питону.

    • @ramil1342
      @ramil1342 7 місяців тому

      Спасибо огромное. А по сервакам например, как правильно настроить nginx, gunicorn, daphne, какие-нибудь хитрости или как-то упростить есть возможность деплой?
      Или же может у тебя есть советы по работе с celery. Стоит ли знать углубленно celery для работы, на собесе однажды спрашивали.
      Часто ли ты использовал в работе многопоточку или асинк? И опять же вопрос насколько углубленно надо знать по-твоему мнению?
      Интересно поспрашивать, услышать твое мнение, если не сложно, спасибо!@@SeniorPomidorDeveloper

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому +1

      Да все надо знать углублено, но углублено знать все невозможно)
      Как настроить сервер? Отличный вопрос для комментария под видео )) у меня по этому поводу тут целый курс лежит )
      Celery надо знать, но по ней в принципе настроек не много и инфы там не много. Частично я о ней рассказал в курсе «оптимизация».
      Асинхронное программирование в продакшн использовал редко , но буду больше. А вот про проблемы параллельных тасков я опять таки рассказывал в курсе . Они все тут лежат .

    • @ramil1342
      @ramil1342 7 місяців тому

      @@SeniorPomidorDeveloperспасибо за ответы, интересно было узнать насколько и как ты все это используешь в работе. Всего наилучшего тебе!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому +1

      Спасибо! На работе я совсем не использую серверов. Другие люди настраивают . Питонский стек использую, селери и тд ., докер

  • @Denis-xo9jx
    @Denis-xo9jx 7 місяців тому

    26:22 write_to_db_and_send_message(city, data, i, message) - две одинаковые строки в if else - это считается дублирование кода? на мой взгляд считается. Как понять грань, когда можно оставить две одинаковые строки в коде у году легкости чтения, и когда нужно избавляться от дублирующихся строк? в этой функции и могут поменяться количество аргументов и тогда нужно изменять вызов функции в двух местах if /else . Или конкретно в этом случае это не является дублированием? Прокомментируйте этот момент в след видео. Вызов функций считается дублированием кода, если он одинаков в разных местах?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Там был неплохой ответ по этому кейсу от Ильи, как тут можно еще уменьшить дублирование. Я закрепил его к этому видео.
      Я думаю что вызов функции в двух местах с одинаковыми агрументами это, скажем, допустимое дублирование. Нет смысла выносить его в третью функцию, так как это всего одна строка. Если только делать как Илья предложил и выносить все вместе с итерацией.
      Грань эту каждый определяет для себя сам. По моему, если это дублирующийся блок кода то лучше выносить, если просто вызовы одной функции - то не нужно. То, что при изменении аргументов в функции надо менять во всех ее вызовах - это нормально.
      Есть другие способы рефакторинга, кроме выноса в функцию и они как раз будут более актуальны для кейсов, когда у нас много одинаковых вызовов какой-то функции. Я постараюсь о них рассказать в следующем видео.

    • @mikeofs1304
      @mikeofs1304 7 місяців тому

      Согласен полностью. Плюс еще можно добавить, чт опосути рефакторинг в функцию вообще не всегда оправдан и этот пример в этом смысле оч нагляден. Вызов вфункции не "бесплатен" он несет расходы как по памяти так и по быстродействию (тут кстати большой привет всем любителям рекурсии ). И если единичными можно пренебречь, то как раз в цикле это очень заметно. Вдруг в нем будет тысяча итераций, а может сто тысяч? И тут правильный рефакторинг как рза вычислить заранее рендж для цикла, а само тело цикла вообще не трогать

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Да наверно так. Но чтобы сказать точно - надо посчитать. Насколько расход памяти больше? На 10% или на 0,001% ? В Джанго приложениях мало кто заморачивается именно подсчетом оверхеда вызовов в коде, там как правило ORM составляет подавляющее большинство расходов по памяти и по всему остальному .

    • @mikeofs1304
      @mikeofs1304 7 місяців тому

      @@SeniorPomidorDeveloper наверное. Я в джанге не специалист. Но рефакторинг все же тема достаточно общая.

  • @kirylsavitski3007
    @kirylsavitski3007 7 місяців тому

    Клевый формат, только на мой вкус было бы интереснее пройтись по ошибкам и объяснить вкратце как надо было бы сделать, без самого рефакторинга

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Да , я так изначально и хотел . Сделать ревью какого-нибудь проекта целиком . Но не нашел пока такой чтобы идеально для этой цели подходил. Пока только отдельные файлы в отдельных проектах. Думаю что еще найду, со временем.

  • @artemunix5223
    @artemunix5223 7 місяців тому

    а в сервисы логику выносить и как это лучше делать мб ДДД ?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Думаю что еще поговорим об этом. Если найду подходящий проект где много логики без сервисов )

    • @artemunix5223
      @artemunix5223 7 місяців тому

      @@SeniorPomidorDeveloper теориюб для начала услышать ) а то тема водяная толком про нее ничего нету в интернетах

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      Да не то чтобы там есть много о чем рассказать.. но если будет кейс то разберем

    • @artemunix5223
      @artemunix5223 7 місяців тому

      @@SeniorPomidorDeveloper та саму механику

  • @akivar6044
    @akivar6044 7 місяців тому

    Добрый день брат в ученики не возмёщ я изучаю Django но так и продвижения мало готов похать за бесплатно это серёзный вопрос пожалуйста заметь

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому

      К сожалению, сейчас совсем нет времени обучать кого-то. Чтобы видео снять раз в месяц не всегда получается время найти.

  • @clauseclause6640
    @clauseclause6640 7 місяців тому

    Сорян, но есть замечания:
    1 во втором случае, очевидно что итерируется по наименьшему из значений и правильней брать min от длины data или значения unit там даже можно было не выносить, а просто в строке с for выбирать наименьшее
    2 ну пожалуйста, пользуйтесь black, ужасно смотрится код, а главное плохо читается

    • @clauseclause6640
      @clauseclause6640 7 місяців тому

      про тестирование - можно было на 2 функции и написать, замокать объекты которые вызываются и проверять с какими параметрами

  • @user-yz8em9oz2h
    @user-yz8em9oz2h 7 місяців тому

    бля мужик, сделай норм качество видео! подписчики взлетят в космос!!!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  7 місяців тому +7

      Нет, я хочу чтобы они страдали))

    • @databox4279
      @databox4279 7 місяців тому +1

      а что не так с качеством? 4 или может 8к надо? даже 2к разрешение есть. Видимо ты попал, когда ютуб ролик еще обрабатывал.

    • @WityazKajit
      @WityazKajit 7 місяців тому

      В первые минуты после загрузки видео высокое качество не доступно, посмотрел 5 минут в 360p, обновил страницу и фулл хд уже есть

    • @L0wPressure
      @L0wPressure 7 місяців тому

      ​@@databox4279 он наверное про вебку - там света не хватает просто

    • @user-yz8em9oz2h
      @user-yz8em9oz2h 7 місяців тому

      @@WityazKajit а пон