Исправляем очень плохой код | Clean Code

Здравствуйте, мои дорогие, это вторая часть видео про клин код, практическая. Наглядно разбираем ошибки и изучаем на практике, что же такое чистый код и принципы его написания.
🔥 Новый поток авторского тренинга Сергея Немчинского GRASP and GoF Design patterns стартует уже 01.02.2024
Регистрация 👉 go.foxminded.ua/4b4M3JI
🧠 Регистрируйся прямо сейчас на менторинг
⬇️ Учись у профи ⬇️
🎓 Менторинг:
JAVA - go.foxminded.ua/3u5V4BF
PYTHON - go.foxminded.ua/48F0dj8
C#/.NET - go.foxminded.ua/3O987tc
ANDROID - go.foxminded.ua/3HoXZbL
FRONT-END (ANGULAR, REACT) - go.foxminded.ua/3O8V62E
SALESFORCE Developer - go.foxminded.ua/47IxGIq
UI/UX дизайн - go.foxminded.ua/3S6s58L
Unreal Engine - go.foxminded.ua/422Ry7S
QA Automation - go.foxminded.ua/3u128Qa
IOS разработка - go.foxminded.ua/3tQ8aTL
PHP - go.foxminded.ua/4be51ho
Unity - go.foxminded.ua/4aV0fFc
NODE.JS - go.foxminded.ua/3S7wc4w
GOLANG - go.foxminded.ua/48XgqQt
Обучение на проекте - go.foxminded.ua/427KoPu
Курсы для новичков - go.foxminded.ua/3O601kQ
🎓Продвинутые курсы для состоявшихся девелоперов:
Enterprise patterns - go.foxminded.ua/3S1g6tn -
Алгоритмы и структуры данных - go.foxminded.ua/424yIwZ
C# NEXT - go.foxminded.ua/4aZcb8V
🔧 Пробное техническое собеседование со специалистом уровня Senior Developer/ Team Leader - go.foxminded.ua/426HL0H
Тайминг:
00:00 - Вступление
00:37 - Названия
06:29 - GRASP and GoF Design patterns
07:03 - Методы
09:42 - Комментарии
13:54 - Плохие комментарии
15:41 - Форматирование
16:23 - Объекты и структуры
18:14 - Классы
19:59 - Правила простого дизайна
👔 Карьерная консультация с Сергеем Немчинским - go.foxminded.ua/48ZGP05
Есть вопросы по обучению в FoxmindEd? Пишите нам в телеграм - t.me/foxminded
Вы можете стать спонсором канала и получать плюшки - / @sergeynemchinskiy
❤ FoxmindEd в Instagram: / foxminded.ua
Сайт FoxmindEd для новичков: go.foxminded.ua/3O9iLQv
Сайт для разработчиков уровня мидл+: go.foxminded.ua/47GqufK
FoxmindEd в ФБ: / foxmindedco
FoxmindEd в Instagram: / foxminded.ua
Мой Telegram: t.me/nemchinskiyOnBusiness
Для деловых запросов: youtube@foxminded.ua

Пікірлер: 104

  • @SergeyNemchinskiy
    @SergeyNemchinskiy4 ай бұрын

    🔥 Новый поток авторского тренинга Сергея Немчинского GRASP and GoF Design patterns стартует уже 01.02.2024 Регистрация 👉 go.foxminded.ua/4b4M3JI

  • @nikolayrykov
    @nikolayrykov4 ай бұрын

    Сергей, запишите, пожалуйста, видео на тему 'Декомпозиция предметной области'. Существующее видео плохого качества, да и мало кто его найдёт на канале. А тема очень нужная!

  • @user-ym7zd2ni5o

    @user-ym7zd2ni5o

    4 ай бұрын

    Поддерживаю, будет очень интересно, с учетом нового опыта и актуальных примеров

  • @user-ut2lu1kz1v

    @user-ut2lu1kz1v

    2 ай бұрын

    Да, отличная идея

  • @ME-fv1ug
    @ME-fv1ug4 ай бұрын

    Было бы интересно узнать от Сергея Немчинского, подробный способ рефакторинга, от Мартина Фаулера, превращение метода в класс.

  • @user-ng6nx1uo5u
    @user-ng6nx1uo5u4 ай бұрын

    Спасибо за видео. Такой вопрос: как вы относитесь к такой штуке в VS Code как Codeium, я тут попробовал, мне понравилось, что он за тебя пишет ту часть, которую тебе лень писать, тебе остается только править под свои требования. Какие подводные камни, кроме потакания своей лени?

  • @shoorick77
    @shoorick774 ай бұрын

    01:15 Помимо переменной цикла (которая не только 𝑖, но и 𝑗, и даже 𝑘, когда циклы вложенные) есть ещё один случай - когда это координаты, тогда 𝑥, 𝑦 и 𝑧 - вполне нормальные имена. Есть ещё один случай - в языке Perl в функциях сравнения используют однобуквенные переменные 𝑎 и 𝑏, но это уже чисто перловая особенность, которая актуальна только внутри таких функций - в иных местах perlstyle и Perl Best Practices советуют не делать так.

  • @jewgenijmoldawski3306

    @jewgenijmoldawski3306

    3 ай бұрын

    Вот еще: c-counter, s-sum, l-length, n-name, e-exception

  • @shoorick77

    @shoorick77

    2 ай бұрын

    @@jewgenijmoldawski3306 мне из всего этого набора часто попадалось только e.

  • @evgeny910
    @evgeny9104 ай бұрын

    Спасибо большое, интересно было бы так же посмотреть про рефакторинг

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Отлично, запишем

  • @vahagn-gishyan
    @vahagn-gishyan4 ай бұрын

    Считается ли нарушением принципа Single Responsibility, если метод одновременно выполняет определенные действия и осуществляет логирование процесса?

  • @__ali__97
    @__ali__974 ай бұрын

    Сергей вы с этим циклом роликов про клин код прям в самое время! я только начал искать инфу и обучаться клин кодингу 👍

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Делитесь потом успехами.

  • @borisisavnin9983
    @borisisavnin99834 ай бұрын

    Очень наглядно, лаконично и ёмко! Спасибо!

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Спасибо вам!

  • @vitaliy0192
    @vitaliy01924 ай бұрын

    Сергей, возможно вы сможете рассказать в своем видео. В интернете или у ИИ не смог найти ответ на вопрос. Вот чего я пока что вообще не понимаю: В вакансиях на java developer в требованиях часто указана kafka. Если я java developer, то кроме получения или отправки сообщений в топик kafka, что ещё мне надо знать или уметь?

  • @denisskyter4526
    @denisskyter45264 ай бұрын

    Все круто , Сергей , если можно , то давайте больше роликов с показание кода и вашем комментированием

  • @ozimandias1858
    @ozimandias18582 ай бұрын

    Очень понравилось!

  • @user-ym7zd2ni5o
    @user-ym7zd2ni5o4 ай бұрын

    9:58 Настал тот час, когда в разговоре Сергея появились украинизмы))

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    😅

  • @valpalchenko3982
    @valpalchenko39824 ай бұрын

    Интересно, расскажите про рефакторинг

  • @Sernik_z_rodzynkamii
    @Sernik_z_rodzynkamii4 ай бұрын

    Я джаваскриптизер, понравился анализ. Спасибо!

  • @VanTwo
    @VanTwo4 ай бұрын

    5:50, я бы сказал AddAndPrint это уже реализационное углубление в названии метода, чем нарушение srp. Что тоже является ошибкой 9:30, стоило бы так-же добавить что рекомендованная длина метода - до 20 линий

  • @hammerok3932
    @hammerok39324 ай бұрын

    Больше примеров богу примеров! Спасибо.

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    😊

  • @nabludatel4230
    @nabludatel42304 ай бұрын

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

  • @DIMONIKOS
    @DIMONIKOS4 ай бұрын

    Продолжайте!

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Будем)

  • @_GyG_
    @_GyG_4 ай бұрын

    Перемнные из одного символа, такие как X и Y, в контексте позиционирования элемента тоже понятны

  • @EngineeringLabChannel
    @EngineeringLabChannel4 ай бұрын

    Не впевнений в останньому прикладі, що створення "під капотом" об"єкта stream, ітерація по ньому обрахування суми (в деякому сенсі reduce) + додаткова робота для GC буде працювати швидше, як стверджує автор, за класичний for-loop. Щодо інших переваг зміненого коду - погоджуюсь.

  • @PredatorAlpha2
    @PredatorAlpha24 ай бұрын

    Как по мне, короткое название метода process() вполне уместно, особенно если класс наследуется от абстрактного AbstractProcessor, где этот метод абстрактный.. Но тогда нужно максимально понятное название подклассов. Тогда такие классы-процессоры можно вызывать, допустим, по расписанию, для выполнения некоторый действий.

  • @kobalt-tv-777
    @kobalt-tv-7774 ай бұрын

    Интересно было

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Спасибо

  • @georgepro8481
    @georgepro84814 ай бұрын

    Было бы хорошо поиметь исходный код в гите и его рефакторинг в бранче. Чтобы попытаться самостоятельно повторить весь путь.

  • @vasyltokarskyi5743
    @vasyltokarskyi57434 ай бұрын

    А де можна записатись на кар‘єрну консультацію?

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Перше посилання після таймінгу в описі під цим відео

  • @nikolaybaranov2213
    @nikolaybaranov22134 ай бұрын

    Сергей! Спасибо за прекрасный очередной «урок» в доступном изложении. Clean Code - это то, что очень важно для нас, human’ов. Но что Вы скажете про тренд на то, что AI заменит кодеров и всё то, что для нас важно, станет вообще не важным? Вот первый попавшийся ролик-дискуссия на эту тему kzread.info/dash/bejne/e6drksZsqdK3ps4.html Интересно Ваше мнение на тему актуальности олдскульных подходов. Думаю, оно достойно отдельного разговора.

  • @Mr43046721
    @Mr430467214 ай бұрын

    Интересно узнать про пример рефакторинга от М. Фаулера, про то, как красиво сделать метод классом

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Ваш ответ записан. Сделаем! :)

  • @postoronny
    @postoronny4 ай бұрын

    В интерпретируемых языках короткие имена быстрее обрабатываются ;)

  • @user-fb6of7uy4w
    @user-fb6of7uy4w4 ай бұрын

    ине всё интересно)☺️

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    отлично, включите колокольчик, чтобы не пропускать новые видео и эфиры)

  • @n0ikolay
    @n0ikolay4 ай бұрын

    Сергей, это лайк, это подписка, и даже мать его КОЛОКОЛЬЧИК на канал!

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    отлично! :)

  • @YacobMonar
    @YacobMonar4 ай бұрын

    По поводу первого примера("не сингл респонсибилити") метод возвращает результат. Если просто написать что-то типа System.out.println(d + e); это ж по сути выполнение одной задачи... Почему это не сингл матьевореспонсибилити!? Может в классе больше нечего будет принтить и потому нету смысла создавать отдельный метод...

  • @user-qi3pr7df3x
    @user-qi3pr7df3x4 ай бұрын

    Блин то класс это только "Моделька и поведение" все остальное от лукавого, то "Используйте simple domain model"

  • @SemenNaduiev
    @SemenNaduiev4 ай бұрын

    Про тудушки не погоджусь, іноді виникає пробелма, яку потрібно вирішити в іншому таску, щоб скоуп твого таску не розростався, ти ствролєш ТУДУ, але З ПОСИЛАННЯМ на створену таску/багу, яка буде в скоупі якогось релізу або беклозі і буде пофікшена

  • @user-nu2jz1sb4s
    @user-nu2jz1sb4s4 ай бұрын

    Вот никогда, кстати, не понимал, зачем джависты в DTO пишут геттеры и сеттеры? Чего там инкапсулировать? Если поменяется формат входящих данных (или исходящих), по любому этот DTO и всё, что с ним связанно, будет переписано. Типа засовывать в DTO логику, чтоб старые геттеры работали с новыми данными? Но он тогда перестаёт быть DTO, разве нет?

  • @TheLoveKusano

    @TheLoveKusano

    4 ай бұрын

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

  • @user-nu2jz1sb4s

    @user-nu2jz1sb4s

    4 ай бұрын

    @@TheLoveKusanoНу если берём чистый паттер DTO, то он ничего валидировать не должен, он должен чисто содержать данные. "Data Transfer Object, в отличие от business object или data access object не должен содержать какого-либо поведения." - из вики.

  • @jewgenijmoldawski3306

    @jewgenijmoldawski3306

    3 ай бұрын

    В настоящее время, согласен, это пережиток прошлого т. к. то для чего были getter и setter сейчас решается по-другому.

  • @vermilinguas
    @vermilinguas4 ай бұрын

    Скажіть будь-ласка, а оплата частинами можлива? 😁

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Вітаю! Вас цікавить тренінг GRASP and GoF Design patterns? На нього немає оплати частинами як і на інші тренінги. А якщо ви про менторинг, то оплата відбувається помісячно.

  • @vermilinguas

    @vermilinguas

    4 ай бұрын

    @@alexandrapersukova дякую за відповідь

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    @@vermilinguas І вам! Якщо ще будуть питання, то я буду рада відповісти)

  • @user-vu6hn4ul2i
    @user-vu6hn4ul2i4 ай бұрын

    12:50 к черту подробности и комментарии, откуда в этом методе взялась data? В параметрах я её не вижу, а если это член класса, то где this? 🤔

  • @user-if3cj1uf3d

    @user-if3cj1uf3d

    4 ай бұрын

    это поле класса. В джаве для обращения к полю класса this необязательно. this используется только в случае, если есть несколько полей / параметров с таким именем, и нужно явно указать что нужно именно поле класса

  • @user-vu6hn4ul2i

    @user-vu6hn4ul2i

    4 ай бұрын

    @@user-if3cj1uf3d прикольно. Выглядит противоречащим философии Java, но, похоже, это так.

  • @user-if3cj1uf3d

    @user-if3cj1uf3d

    4 ай бұрын

    @@user-vu6hn4ul2i не совсем понимаю что ты имеешь ввиду под философией джава. В ней сплошь и рядом встречаются места где что то можно не писать, если это не является необходимым

  • @user-ho7rl2me3r
    @user-ho7rl2me3r4 ай бұрын

    использование счетчика і в цикле - единственньій случай, когда значение переменной из одной букві всем понятно.. (1:30) class Point {double x, y, z;}; class Vector {double x, y, z;}; ну да, ну да...

  • @spiritfrombook
    @spiritfrombook4 ай бұрын

    Хотим видео про рефакторинг, превращение метода в класс

  • @romankuznetsov4601
    @romankuznetsov46014 ай бұрын

    книга "Чистый код" спорная во многом

  • @dim3787
    @dim37874 ай бұрын

    Хлопцы, 15:04 - бегом за знаниями - дякуйте

  • @user-un4on4oc3l
    @user-un4on4oc3l4 ай бұрын

    Будет понятно, переменная "х" и "y"))

  • @user-ym7zd2ni5o
    @user-ym7zd2ni5o4 ай бұрын

    Мабуть, це найкраще корисне відео на каналі у цьому році. Грунтовне пояснення, доступні приклади. Треба збарегти його собі у закладки, і періодично переглядати.

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    ми раді, що вам це відео було корисним

  • @sergeypekar1058
    @sergeypekar10584 ай бұрын

    Первый пример как будто обфускатором прошелся

  • @viacheslavkarpenko2162
    @viacheslavkarpenko21624 ай бұрын

    Вітаю! kzread.info/dash/bejne/ZYWNmNybfsy-iZc.html Поясніть будь ласка чому клас User не може мати методів save print а клас UserService має методи saveUser та printUser? На перший погляд можна реалізувати все в класі User. І наче логічніше винести зберігання, видалення, оновлення, редагування юзера в окремі сервіси наприклад SaveUserService і там зробити метод save. Таким чином клас матиме тільки одну причину зміни наприклад оновлення логіки збереження юзера. Дякую)

  • @YT_User376
    @YT_User3764 ай бұрын

    У меня есть вопрос. Можно учить языки программирования в 14 лет?

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Можно, а почему нет)

  • @jewgenijmoldawski3306

    @jewgenijmoldawski3306

    3 ай бұрын

    Я учил детей программированию. Из опыта: в 14 можно, но большинству приходится по ходу дела очень много объяснять вокруг, в зависимости от приложения. Например системы координат, если это игры.

  • @redneck_prm5429
    @redneck_prm54294 ай бұрын

    Интересно, лет через десять до жаберов дойдет, что лепить везде геттеры и сеттеры лишено смысла, или так и продолжат цепляться за "а у нас так принято"?

  • @PredatorAlpha2

    @PredatorAlpha2

    4 ай бұрын

    У нас, джавистов, часто используется доступ к полям объекта со стороны сторонних библиотек, которые ничего про объект не знают, кроме имени полей - например при сериализации или обработчики вьюх для MVC. И им гораздо быстрее работать через геттеры сеттеры, чем через голую рефлексию. Да и хотел бы я на тебя посмотреть, если тебе понадобиться подменить объект его проксей, например для ленивой загрузки по сети, если на нем не будет геттеров и сеттеров.

  • @redneck_prm5429

    @redneck_prm5429

    4 ай бұрын

    @@PredatorAlpha2 Если библиотека знает имена полей, то зачем там рефлексия? Да и лепить их где попало только на случай "а вдруг нам понадобиться" - как раз приводит к тому, что в итоге лепят уже просто потому, что "так принято", без подключения мозга.

  • @jewgenijmoldawski3306

    @jewgenijmoldawski3306

    3 ай бұрын

    Сейчас да, простые геттеры/сеттеры не нужны, т.к. доступ к полям в основном осуществляется через фреймворки. Раньше имело смысл, но эти времена прошли.

  • @sergeiseivach
    @sergeiseivach4 ай бұрын

    Ну последний пример, такое себе... Был нормальный оверлоадинг, простой и понятный любому джуну, купившему вчера книжку по программированию. А такой синтаксический сахар с многоточиями и стримом из библиотеки, нужно пять раз перечитать прежде чем понять и удивиться, нафига так намудрили. И уж точно, в отличие от первого, не понятный программисту, пришедшему из другого языка.

  • @DimaVort
    @DimaVort4 ай бұрын

    Я би клас із першого прикладу назвав counter а не calculator. Це краще відображає його суть.

  • @user-zi8zw3yf2t
    @user-zi8zw3yf2t4 ай бұрын

    1:30 j, k

  • @postoronny
    @postoronny4 ай бұрын

    А я плохим кодом считаю сишные фигурные скобки. Не сами скобки, разумеется, а их расположение: когда открывающая расположена в конце строки, попробуй догадаться, какая из закрывающих в этой (а, может быть, и не в этой вовсе) лестнице к ней относится... Я всегда ставлю открывающую точно над закрывающей. Да, это требует лишней строки, зато код сразу становится читабельным.

  • @PredatorAlpha2

    @PredatorAlpha2

    4 ай бұрын

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

  • @user-zy5nn1om9e
    @user-zy5nn1om9e4 ай бұрын

    Сергію, ви ж хоч кажіть, що у вас є україномовний канал, ато я вже половину відео з нього подивився (через рекомендації), і весь час думав, що це відео з цього, основного каналу😅

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    Охх. знайшли, підписалися?)

  • @user-iv5co4lu9g
    @user-iv5co4lu9g4 ай бұрын

    Джиннннееееееееееерикиииии эээхххххе хе хээээээээээ

  • @georgepro8481
    @georgepro84814 ай бұрын

    " ... примеры кода будут на Джаве, ну а какой ещё язык я должен был выбрать ...". К сожалению Мартин Фаулер в переиздании 2019 года выбрал Javasript.. Предатель!

  • @alexandr1408
    @alexandr14083 ай бұрын

    200 строк кода?.. пффф, слабо как-то. На нашем проекте (достался по наследству) методы по 1000-2000 строк, притом это методы в самом контроллере. Прям портянка со всей непростой логикой. Думаю, всем и так понятно, что там со слоями, зависимостями, ответственностями и пр. никому ненужными придумками ))

  • @dmitrysavkin5981
    @dmitrysavkin59814 ай бұрын

    Про комментарии. Немцыв постоянно на немецком пишут, пишут названия методов на немецком. И ничего. Придет индус и будет матерится? А после индуса мы)?

  • @MERKYRIY-fn5rw
    @MERKYRIY-fn5rw4 ай бұрын

    Ну дуже "початковий" рівень коду.

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    так, відео для початківців

  • @user-zi8zw3yf2t
    @user-zi8zw3yf2t4 ай бұрын

    Слишком простые и очевидные примеры

  • @arttex7yuart763
    @arttex7yuart7634 ай бұрын

    а можна таке ж відео тільки Українською? Бо нічого не зрозуміло.

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    якщо є запит, то спробуємо зняти. дякуємо за ідеї!

  • @arttex7yuart763

    @arttex7yuart763

    4 ай бұрын

    ​@@alexandrapersukova ви вважає це ідеєю? Українська мова - це вже ідея? Тоді питання, ви Українська компанія чи ні? Якщо ні, то питань немає, лише одне, для чого прапор у куті використовувати? Якщо ж Українська компанія, то чому за майже 2 роки повномасштабної війни, ви так і не перейшли на державну мову?

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    @@arttex7yuart763 У нас є окремий україномовний канал - Сергій Немчинський: Кодерська вітальня. А цей канал для всіх наших глядачів, які не знають української, а на рф, рб ми як і не працювали так і не працюємо.

  • @user-zi8zw3yf2t

    @user-zi8zw3yf2t

    4 ай бұрын

    И как же ты так быстро забыл русский язык?

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    @@user-zi8zw3yf2t это к чему вопрос?

  • @paul-emilelecoqdeboisbaudr555
    @paul-emilelecoqdeboisbaudr5554 ай бұрын

    Немчинский - самый опасный подвид инфоцыгана: если у Мишустина на лице клеймо инфоцыгана, то этот товарищ на вид - вполне адекватен

  • @user-qh5hz3jo4g

    @user-qh5hz3jo4g

    4 ай бұрын

    Аргументы?

  • @user-rb4ow1gz2v
    @user-rb4ow1gz2v4 ай бұрын

    Сергію, ви ж наче перейшли на українську мову.... Війна ще не закінчилася, ворог той самий, давайте продовжувати робити українське іт україномовним 😢

  • @smaxim02

    @smaxim02

    4 ай бұрын

    Сергій зараз веде два канали. Цей лишився російськомовним, для інших країн, або людей які все ще розмовляють російською. Інший канал ведеться суто українською, частина контенту також перейшла туди. Питання в тому що(я так розумію) канали та ютуб забезпечують більшу частину від притоку клієнтів, а на україномовному зараз лише 10к підписників. Плюс це відразу мінус частина аудиторії з тої самої Прибалтики або Казахстану

  • @kirillperov3843

    @kirillperov3843

    4 ай бұрын

    Так є окремій українськомовний канал

  • @alexandrapersukova

    @alexandrapersukova

    4 ай бұрын

    @@smaxim02 Все правильно, ми як не працювали з рф і рб так і не будемо, тому цей контент для людей з інших країн, які не володіють українською.

Келесі