Говнокод из популярной игры, частая ошибка и криптостойкие алгоритмы в C# и Unity | КодПатруль #2

  Рет қаралды 51,243

Роман Сакутин

Роман Сакутин

3 жыл бұрын

Говнокода много в нашем мире, и хорошо не только его видеть но и уметь грамотно переписать. Снова показал вам техники рефакторинга на языке программирования C# которые также вам будут полезны в Unity, ASPNet и других прикладных технологиях.
СПОНСОР:
Admix - admixplay.com/
Discord - discordapp.com/invite/GjJsPhY
До 31 Августа можете выиграть $25,000 - admixplay.com/boost/
БОРИС (Бесплатное Обучение Разработке Игр) - ijunior.ru/boris/promo01?...
Обучение с нуля с гарантией трудоустройства - ijunior.ru/unity-start?...
ШКОЛА ПРОГРАММИРОВАНИЯ ЯЮНИОР - holymonkey_sandbox
INSTA - / ijunior_school
Наш новый канал с уроками - / @user-wq2dk1kn2v
МОЯ КНИГА - csharpbook.sakutin.ru
ГРУППА КАНАЛА - holymonkey
Я В VK - rsakutin
ЧАТ В ТЕЛЕГЕ - t.me/csharp_faggots_fan_club

Пікірлер: 226
@rsakutin
@rsakutin 3 жыл бұрын
Сори за косячки, видос записываю болея бронхитом с температурой в 39 :( Также важная деталь: курс с нуля до результата с 3600 в месяц доступен только до конца августа, потом цена вырастет на 30 процентов. Если записаться сейчас то скидочная цена заморозится на весь период рассрочки - ijunior.ru/unity-start?
@victorbrin5085
@victorbrin5085 3 жыл бұрын
☝️Это ваш курс? Иди реклама?
@rsakutin
@rsakutin 3 жыл бұрын
@@victorbrin5085 Наш)
@victorbrin5085
@victorbrin5085 3 жыл бұрын
@@rsakutin вписался
@g3k0s20
@g3k0s20 3 жыл бұрын
Блин, ну что за детский сад? )) Ты позиционируешь себя как бывалый кодер. При этом, ты просто адово рофлишь практически с любого куска кода. И допускаешь типичные ошибки... Какого черта записывать этот хлам, если тебе хреново?? Как показывает практика, пока мы делаем обзор кода, мы ниибаца спецы. А как садимся кодить, так на деле - рядовой мидл в лучшем случае... И после того как тебя разнесли в коментах, ты просто пишешь, "сори за косячки" ))) Садись - Двойка!
@rsakutin
@rsakutin 3 жыл бұрын
@@g3k0s20 садись на пенис!
@AqilonStudio
@AqilonStudio 3 жыл бұрын
“YandereDev: A lesson in coding” - видос на ютубе с кусками кода из популярной Инди игры, кладезь, хватит надолго
@tupolegolassomethingelse455
@tupolegolassomethingelse455 3 жыл бұрын
О боже мой...
@Mikasey
@Mikasey 3 жыл бұрын
О даа, яндере дев это величайший говнокодер сия мира
@user-fx5pz7st7c
@user-fx5pz7st7c 3 жыл бұрын
Я ржал от начала и до конца как вне себя, мне нужно больше этого дерьма.
@janedoe6182
@janedoe6182 3 жыл бұрын
В первом написанном тобой примере генерации пароля длинна итоговой строки будет превышать требуемую. Во втором примере, вместо получения длины массива через стандартное свойство массива, ты зачем-то делаешь это через универсальный метод Linq, который делает лишние проверки и приводит аргумент перечислимого типа к ICollection знающему свою длинну. Random проинициализировать случайным числом можно так: var random = new Random(Guid.NewGuid().GetHashCode()); Массив допустимых символов можно проинициализировать так: var characters = Enumerable.Range('0', 10).Concat(Enumerable.Range('A', 26)) .Concat(Enumerable.Range('a', 26)).Select(Convert.ToChar).ToArray(); Получить результат одной строкой при помощи Linq можно так: string result = String.Concat(Enumerable.Range(0, length).Select(n => characters[random.Next(0, characters.Length)]));
@user-nu2wg3rx6n
@user-nu2wg3rx6n 3 жыл бұрын
Курс - Красивый говнокод за 24 часа для чайников ;-))) Сначала находим себе сложности, а потом героически их преодолеваем
@podtangusom4002
@podtangusom4002 3 жыл бұрын
Знаете,ошибки делают все,а ошибки в свою очередь делают нас лучше.И худшее ,что может сделать человек-высмеивать косяки других людей,за счет этого самоутверждаясь.
@gaitavr1992
@gaitavr1992 3 жыл бұрын
Первый пример вообще от реальности оторванный, этот конфиг будет еще той огромной колбасой, плюс не упомянут метод Equals с перегрузкой и без. Кстати, а где третий пример говнокода? Я увидел 2 говнокода и три исправленных варианта
@Scrayerful
@Scrayerful 3 жыл бұрын
ужасный подход: взять код, который предназначается джунам и для простоты понимания состоит из понятных инструкций и городить из этого работу с исключениями в элементарной операции (подробнее ниже) Да, обработка исключений это хорошо, но сможет ли новичок правильно обработать исключение ? А проконтроллировать после этого сборщик ? Добавление дополнительной конструкции Config.PositiveStateKeyword Почему в итоге не return value == "on" ? То, что ты описал хорошо, когда повторяемость кода большая, но если подобные функции необходимы часто, то тут проблема скорее в архитектуре *предполагаю, что данный код взят из какого-либо видео, но ссылки на него не оставлено **думаю, что преобразование string -> bool не уместно вообще, поэтому функция на момент создания обречена быть неудачной
@Sagrell94
@Sagrell94 3 жыл бұрын
Ты не прав в каждом своем высказывании) 1. По подходу я написал коммент. 2. Про сборщик мусора ты решил сделать вид, что ты шаришь, но это самое бессмысленное, что я слышал) 3. Config.PositiveStateKeyword это "константа". Ты наверное считаешь периметр круга в коде как 2*3.14f*R 4. Преобразование string в bool не уместно?)) А как по твоему работает парсинг СТРОКИ в ОБЪЕКТЫ?)
@user-qu3xn6uc9o
@user-qu3xn6uc9o Жыл бұрын
я который еще не джун такие конструкции давно не использую и как уже говорил автор во многих видео : говнокод это не проще,это хуже
@alyxmp4749
@alyxmp4749 3 жыл бұрын
Каждый код - говнокод (С) Роман
@Sagrell94
@Sagrell94 3 жыл бұрын
Почти в каждом комменте вижу, как люди несут такую чушь. Многие пишут, что его подход - ужасен. Подход не ужасен, а бессмысленнен, новички все равно не смотрят такие видео, поэтому эти видео скорее делаются для себя. Но он говорит абсолютно логичные и правильные вещи. Нельзя при показе кода новичкам жертвовать качеством этого кода. Тебе же учитель математики не говорит: "сейчас мы изучаем сложение, поэтому не обращайте внимания, что у меня кучу ошибок в вычитании". Человек думает, что так нужно писать и так пишет дальше. Приведу пример: я хотел разобраться в шейдерах, но не сильно запаривать и не читать огромные книги. В итоге искал ролики на KZbin и мне попадались сплошные эти "горе Гоши Дудари", и сколько я не смотрел таких роликов, я не мог сесть и написать любой шейдер нормально, потому что они не раскрывали суть и не обучали тебя, они показывали как они говнокодом решили какую-то конкретную задачу. Но потом я нашел Catlike Coding, где чел разбирает шейдеры на уровне их компиляции и объясняет вообще все. И за четверть времени которое потратил на этих идиотов, научился писать довольно сложные шейдеры и дальше уже сам разбираться во всем. Если ты делаешь контент для новичков, то делай уроки вида "Как работает цикл for" и постепенно вводи в материал, а не "Как нихуя не зная, написать AI за 30 мин". Это информационный мусор, который только вредит. Хотя скорее всего это пишут зрители Гоши Дударя, которые думают, что они разработчики игр, не понимая, что они по уровню развития сейчас на школьной программе 9 класса.
@Hitori_FtoL
@Hitori_FtoL 3 жыл бұрын
Роман, оставь, плиз, ссылку на твой гитхаб) Просто хочется увидеть хороший код, для того, чтобы подчеркнуть некоторые фишки
@user-nf6uw9cv4q
@user-nf6uw9cv4q 3 жыл бұрын
А ответа нет? У гуру нет гитхаба странно?
@dadoo6912
@dadoo6912 Жыл бұрын
@@user-nf6uw9cv4q если ты увидишь сеньора с богатым, постоянно обновляющимся гитхабом, единственное, что о нем можно сказать, так то, что он нихуя не работает
@xezdx
@xezdx 3 жыл бұрын
Насчет экспшн в конфиге это больше зависит от соглашений, принятых для программы. Если принято ошибки "замалчивать", а не бесить юзера всплывающими окошками, то достаточно {return key=="on"}, если нет, то проверку стоит делать отдельно типа if(!isKeyword(key)){ ...error... } else { ok=isEnabled(key); } Проверять значения из конфига выбросом исключения не стоит. Исключения не должны быть частью программы и "нормальным" результатом выполнения функции.
@Slko
@Slko 3 жыл бұрын
whiteList[b % whiteList.Length] Если делать криптографически стойкую генерацию паролей, то так *НЕЛЬЗЯ* делать, если количество вариантов значений b (в данном случае 256) не делится нацело на whiteList.Length (в данном случае как раз не делится, т.к. 26+26+10=62). Каждое из значений 0-7 встречаются 5 раз (255 % 62 == 7, 255/62=4.xyz), а значения 8+ встречаются 4 раза, то есть есть bias к маленьким числовым значениям.
@rsakutin
@rsakutin 3 жыл бұрын
Крутяк, спасибо!
@Slko
@Slko 3 жыл бұрын
@@rsakutin Если интересно, как правильно сделать, то самый простой вариант такой: Нужно проверять, входит ли случайное число в наш диапазон (0-61), и если не входит, то пропускать его и брать следующее случайное значение, и так пока не наберём нужное количество символов.
@xBezzx
@xBezzx 3 жыл бұрын
Slko я нихуя не понял но очень интересно , не останавливайся пиши
@artur8904
@artur8904 2 жыл бұрын
@@xBezzx маленьких цифр в паролях будет больше
@Lucio11a
@Lucio11a 3 жыл бұрын
Admix, это, конечно, круто... но реклама сбербанка в средневековой таверне, эт было бы слишком сильно :D
@Priboy313
@Priboy313 3 жыл бұрын
Я первый пример вижу так: был рычаг из простой конструкции и я более чем уверен, что где-то в коде он вызывался ИСКЛЮЧИТЕЛЬНО с он/офф. А стал переусложнённый космический аппарат с навесом из конфига и прочей лабуды. Всего один вопрос - зачем?
@Alex-net-brn
@Alex-net-brn 3 жыл бұрын
Чувак, ты в первом примере, где проверка value == "on", ВСЁ СЛОМАЛ!!! ))) Функция возвращала true, ТОЛЬКО когда value существует и равно "on". Если в конфиге нет этой строки, или она закоменчена, то твой супер код начнёт сыпать эксепшены )) Пример такой строки: god_mode = "on" смекаешь умник? :))
@LordZiegfrid
@LordZiegfrid 3 жыл бұрын
Вот тебе ревью по первому примеру: 1. Сравнение через "==" для строк зависит от региональных настроек. 2. "== false". 3. Название переменных и методов не отражает суть.
@riskiofi7571
@riskiofi7571 2 жыл бұрын
не отражает, но это важно. чтобы не запутаться в своём же скрипте, ну например сел за проект который делал 2 года назад. и ты ничего не поймёшь так как воиды будут называться"aboba A" и с переменными также
@user-gk4sn1th8c
@user-gk4sn1th8c 3 жыл бұрын
Есть множество методов решения проблемы. Так почему все, кроме одного единственного, сразу говно? Во мне пробуждается сомневающийся во всём перфекционист. Как убедиться в правильности решения проблемы? Может потому, что мы человеки еще не стали как "1"? Не "перепишем говно код", а "Люди! Я могу предложить более совершенный код!" :-).
@mikhailshpirko1877
@mikhailshpirko1877 3 жыл бұрын
4:42 по идее, если в метод передать "On" или "ON" то будет либо эксепшн (в зависимости от того как имплементирован метод IsBinaryStateKeyword) либо метод вернет false. Как вы считаете, правильно ли в таком случае возвращать true и осуществить сравнение без учета регистра?
@rsakutin
@rsakutin 3 жыл бұрын
Я бы делал регистронезависимым решение
@maxm1079
@maxm1079 3 жыл бұрын
@@rsakutin а я бы не делал, иначе те кто настраивает софт вам хуй выкрутят, из за того что у вас on != ON, on != true (и тд.). так что и вы неплохо своего говна добавили. первый пример вообще чисто рефакторинг кода сделали, изначальный код не является уязвимым
@f14shm4n
@f14shm4n 3 жыл бұрын
@@maxm1079 изначальный код болеет тем же самым, при "ON" выдаст "false", но в принципе согласен с вами, в оригинальном коде нужно просто добавить IgnoreCase
@stanislaw8179
@stanislaw8179 3 жыл бұрын
Привет, у меня есть книга "ЯП С# 7 и платформы .NET и .NET CORE" от Эндрю Троелсен и Филипп Джепикс Какой уровень можно получить, прочитав эту книгу, если я с полного нуля, без книг и тп, смотря видео на ютубе понял ООП, создал 2д на юньке по типу дудла и несколько приложений ВинФормс с разным наклоном, но при этом, я прохожу тесты на junior на 40%-60%?
@badguy6915
@badguy6915 3 жыл бұрын
сакутин:выы гавнооо!!! мы:мыыы гавнооо!!! простые смертные(непрограммисты): ...
@SergeyGlukhachev
@SergeyGlukhachev 3 жыл бұрын
Встречал как-то такое: public enum Sample { Value0, Value1, Value2, ... } public Sample SomMethod(string inputString) { switch (inputString) { case "Value0": return Sample.Value0; case "Value1": return Sample.Value1; case "Value2": return Sample.Value2; ... } }
@FloatingGames
@FloatingGames 3 жыл бұрын
А что делать если я не понимаю?
@FloatingGames
@FloatingGames 3 жыл бұрын
Хотя я понял, это жесть, а можешь написать как надо или что подрузумевалось?
@SergeyGlukhachev
@SergeyGlukhachev 3 жыл бұрын
@@FloatingGames docs.microsoft.com/ru-ru/dotnet/api/system.enum.parse
@serghein845
@serghein845 3 жыл бұрын
@@FloatingGames когда не понимаешь, надо лезть в инет и разбираться! так обычно все делают )
@serghein845
@serghein845 3 жыл бұрын
Мужик, ты красава! самый правильный ответ ) тольк в нём нет состояние "default", которое и будет исключением.
@g_r_u_n_d_y
@g_r_u_n_d_y 3 жыл бұрын
Зачем кастить char в int и обратно, если можно одним char обойтись? `for (char c = 'a'; c
@FloatingGames
@FloatingGames 3 жыл бұрын
А что значит yield return, ну просто никак не могу понять
@g_r_u_n_d_y
@g_r_u_n_d_y 3 жыл бұрын
@@FloatingGames Справка msdn: docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield При использовании этого ключевого слова внутри функции, компилятор преобразует ее так, чтобы она возвращала итератор. Это позволяет просто создавать итерируемые объекты, по сути односвязные списки, по которым можно пройтись например, с использованием `foreach`, при этом каждая итерация отделяется с помощью yield
@FloatingGames
@FloatingGames 3 жыл бұрын
@@g_r_u_n_d_y а куда буква запишется тогда? Я так понял этот метод yield используется при переопределении метода getIEnumerator, да?
@g_r_u_n_d_y
@g_r_u_n_d_y 3 жыл бұрын
@@FloatingGames Я так понял этот метод yield используется при переопределении метода getIEnumerator, да? Не совсем. Сам класс c методом GetEnumerator генерируется компилятором. В полученной реализации IEnumerator при вызове `MoveNext()` происходит выполнение метода до первого yield, значением свойства Current устанавливается значение после `yield return` в данном случае текущий символ. При следующем вызове - выполнение до следующего yield и так далее.
@bratttn
@bratttn Жыл бұрын
а зачем так сложно с генерацией рандом строки из словаря? есть же в си шарпе Fare (xeger), загоняешь в него регулярку с фиксированной длиной строки и бум! одна строчка кода.
@7453060
@7453060 3 жыл бұрын
Роман, почему генерация строки не метод расширения? Очевидно, что если мне необходимо особое поведение StringBuilder, я создаю метод расширения и в момент использования оборачиваю в using. Далее мне не нужны сами символы на этапе генерации, мне нужны только их коды в таблице символов, значит мне нужно смещать iterator по матрице, способ смещения определяет стойкость алгоритма.
@_kk_
@_kk_ 3 жыл бұрын
Потому что это нарушит принцип единственной ответственности. Разве нет?
@sashayakimov6
@sashayakimov6 3 жыл бұрын
Здравствуйте, сколько стоит сейчас курс?
@user-ni5nt2bs8j
@user-ni5nt2bs8j Жыл бұрын
Недавно в проекте ЕПАМ был найден такой код. Это самое бессмысленное и беспощадное, что я видел. private static int stringSize(String s) { int size = 0; for(int i = 0; i < s.length(); i++) { size++; } return size; }
@Dadadadam999
@Dadadadam999 3 жыл бұрын
Кстати ту наверное уже писали, но все объявленные экземпляры класса Random, должны быть статичными, иначе рандом будет выдавать каждый раз последовательные числа. Это связано со спецификой его реализации.)
@AlexStraga
@AlexStraga 3 жыл бұрын
Балин, мы ток с другом начали учить делфи и то превращали числа в чары, а не создавали списки чаров в ручную)
@morozokgaming5921
@morozokgaming5921 3 жыл бұрын
а для чего вам делфи, если не секрет? 🤔
@AlexStraga
@AlexStraga 3 жыл бұрын
@@morozokgaming5921 потому что была книга по делфи для чайников) Это было более 17 лет назад.)
@morozokgaming5921
@morozokgaming5921 3 жыл бұрын
@@AlexStraga я думал вы его в 2020 начали учить))
@morozokgaming5921
@morozokgaming5921 3 жыл бұрын
@@AlexStraga и чего добился за 17 лет? если не секрет)
@AlexStraga
@AlexStraga 3 жыл бұрын
@@morozokgaming5921 Честно говоря не много ) Интернета тогда у меня не было (да и нормальный не еле дышаший адсл ток 2 года назад появился), учиться было сложно, потом устроился в айти сфере в отрасль не касаясь прогерства. Кодинг был хобби. И вот только полтора года назад вернулся в кодинг, прошел курсец и думаю что теперь дело пойдет хоть как то. Друг же ушел в веб разработку
@vitaly6838
@vitaly6838 3 жыл бұрын
Я когда только начинал даже так не писал
@olegzorin3911
@olegzorin3911 3 жыл бұрын
Пример с генерацией пароля немного надуман. Да белый список - это правильно, но в конечном итоге вы же храните у себя не пароль, а его хеш. И как бы вы круто не генерировали пароль, но если потом храните, упаси Бог, 8-битный хеш - то уже будет не принципиально как сгенерирован пароль. Да даже 256 битные пароли брутфорсятся за вменяемое время на гпушках. Привет от радужных таблиц. Так что если думать о безопасности, то начинать надо с хеш-функции (повышать время на взлом), хранения этих хешей (не позволять спереть бд, чтобы брутфорсить на гпу) и защищать от перебора саму форму (long request - увеличиваем время взлома, fail2ban - усложняем жизнь на возню с прокси и увеличиваем время). А вообще сделать непробиваемую защиту не возможно - можно лишь сделать экономически не целесообразным взлом. Если вы храните только фантики для пользователей со странными никами, то так-то можно пароль и в открытую хранить ))
@ARTUT
@ARTUT 3 жыл бұрын
0:00 Camtasia 9?
@user-jy1rb5xn7s
@user-jy1rb5xn7s 3 жыл бұрын
Как ты относишься к антипатерну Softcode ?
@pirnogion
@pirnogion 3 жыл бұрын
Я называю это жидкий код, ибо протекает во все щели.
@ZEkA10000
@ZEkA10000 3 жыл бұрын
Ты обозреваешь любой код или целенаправленно выбираешь код написанный на яп С#?
@intivi5277
@intivi5277 3 жыл бұрын
Он проталкивает свои говнокурсы поэтому щедро набрасывает на вентилятор.
@sudormrfall
@sudormrfall 3 жыл бұрын
Не могу понять от видео к видео, я джун или мастер...
@mrkvchch
@mrkvchch 3 жыл бұрын
А whitelist же будет создаваться на каждый вызов метода? Если так, то в итоге получилось медленнее (наверное, не измерял) чем было, надо было в статическую переменную засунуть? Ну и в принципе не особо понял наезд на этот кусочек, единственное, что было прям плохо - создание новый строки на каждую итерацию цикла и пихание алфавита прям в тело функции.
@rsakutin
@rsakutin 3 жыл бұрын
Да, это важный момент который я забыл упомянуть. Белый список надо кешировать
@sergeykarpov4683
@sergeykarpov4683 3 жыл бұрын
Интересно услышать мнение о курсе ITVDN "ASP .Net Core Developer", стоит ли использовать данный ресурс для изучения функционала C# языка? P.s. Отлично отфильтрована информация, только не переходите на "умирающий бас", неприятно разбирать слова.
@rsakutin
@rsakutin 3 жыл бұрын
Уже есть на канале
@Roman_SBB
@Roman_SBB 3 жыл бұрын
Что-то БОРИС ссылку на почту не присылает
@user-sp8eb8wf2q
@user-sp8eb8wf2q 3 жыл бұрын
Гавнокод (помню из старых твоих обзорах на unity3d курсы): Нашел kzbin.info/www/bejne/fJS6eXSsrtSpiNU Что-то такое вроде было if (points < 100) { star1.Enabled = false; star2.Enabled = false; star1.Enabled = false; }else if (points > 300) { star1.Enabled = true; star2.Enabled = false; star1.Enabled = false; }else if (points > 500) { star1.Enabled = true; star2.Enabled = true; star1.Enabled = false; }else if (points > 1000) { star1.Enabled = true; star2.Enabled = true; star1.Enabled = true; }
@DoGGy1110
@DoGGy1110 3 жыл бұрын
Про 2ой случай. Это погрешности декомпиляции. При декомпеляции любая конкатинация строк делается через массив.
@50z10p47
@50z10p47 3 жыл бұрын
Поясните нуфагу. При конкатенации строк/массивов мы создаём новый объект. При использовании stringbuilder мы имеем все тот же объект. Если не лезет - capacity увеличивается в 2 раза до тех пор пока не влезет или не превысит MaxCapacity. То есть даже после декомпиляции это не должно выглядеть конкатенацией строк так как принцип работы немножечко совсем другой, разве нет?
@user-nf6uw9cv4q
@user-nf6uw9cv4q 3 жыл бұрын
Сакутин где увидеть твой гитхаб?
@user-ix8bh3ox9f
@user-ix8bh3ox9f 3 жыл бұрын
Такие примеры вселяют мне уверенность что я уже всё таки не джун)
@qwertyqwertyi620
@qwertyqwertyi620 3 жыл бұрын
Жду код ревью YandereDev'a...
@melonplayground5975
@melonplayground5975 3 жыл бұрын
в первом примере как я понял value должно иметь только on или off, так почему бы string не заменить на enum ?
@rsakutin
@rsakutin 3 жыл бұрын
Строка приходить из конфигурации строковой
@serghein845
@serghein845 3 жыл бұрын
можно узнать почему такие великие учителя, которые преподают курсы, и делают из людей гуру программирования, не делают свои успешные проекты? или не работают над большими крутыми проектами? Мне просто интересно! p.s. Не знаю ни одного крутого прогера, который думал бы учить людей программированию, потому, что у него нет времени и он зазнавшийся дятел (ну обычно так).
@rsakutin
@rsakutin 3 жыл бұрын
Не знаю ни одного крутого программиста который не вёл бы блог, не писал бы книги или не снимал на KZbin
@serghein845
@serghein845 3 жыл бұрын
​@@rsakutin если так судить, то хороших прогеров очень мало, так как я не видел много документаций или уроков доступных о паттернах программирования, отличае с# от f#! или же в крутых компаниях, которые на удивление выпускают крутые игры или софт, все пишут статьи ) Я не говорю о гугл разработчиках или фейсбук, которые сидят в долинке, и чтобы продвинуться по карьерной лестнице пишут диссертации, лишь для того, чтобы их заметили в той гуще крутых прогеров, которая их окружает. p.s. Но вы ведь не статейки пишете, а преподаёте, что забирает уверен кучу времени, чтобы из обычного пользователя компа сделать их гуру программирования. Этио же не за вечер и не за неделю сел и написал статейку )
@rsakutin
@rsakutin 3 жыл бұрын
@@serghein845 Вы не смогли найти кучу материала по паттернам и отличию C# и F#? У вас инвалидность?
@rsakutin
@rsakutin 3 жыл бұрын
@@serghein845 3600 - это цена курса в рублях. Вы говорить любите а думать и читать нет. :(
@serghein845
@serghein845 3 жыл бұрын
@@rsakutin ну тогда пишите нормально, чтобы и читалось доступно и понятно! Потому, как "курс с нуля до результата с 3600 в месяц" - это не одно и тоже, как например "курс за 3600 в месяц - с нуля до результата " или хотя бы "курс с нуля до результата за 3600 в месяц". Поэтому я и задал основной вопрос, так как понял совсем другое!
@user-pp9mz1lh9b
@user-pp9mz1lh9b 3 жыл бұрын
Уникальнейший полезный контент! Прямо таки уникальный в своей нише. Продолжай творить!
@mrmatrix228
@mrmatrix228 3 жыл бұрын
4:37 сравниваем булевую переменную. ОК
@lancwork
@lancwork 3 жыл бұрын
сравнение с false более читаемое чем отрицание
@user-kp8db4nz6n
@user-kp8db4nz6n 3 жыл бұрын
Не знаю как у вас, но у меня триггер на «!». Сразу норм читается, особенно если булевые переменные сразу называть трушными названиями или с приставкой “Is”
@BashkaMen
@BashkaMen 3 жыл бұрын
Валидация в конфиге, ммммм
@dmitriiyokohamaman8523
@dmitriiyokohamaman8523 3 жыл бұрын
Роман приветствую. Весь прикол в том, что в "продакшене" на начальном этапе обычно "пофигу", какой код, "лиж-бы" работало и отправляло вменяемые тексты ошибок, если что. А уже когда проект раскрутится, тогда уже можно и код переписывать потихоньку. Например: "Капатели онлайн" игра своего времени по сути и тут главное вовремя выпустить её.
@rsakutin
@rsakutin 3 жыл бұрын
Какой опыт программирования у вас? Какие комании? Какие проекты?
@dmitriiyokohamaman8523
@dmitriiyokohamaman8523 3 жыл бұрын
Я нигде не работал по профессии программист.
@rsakutin
@rsakutin 3 жыл бұрын
@@dmitriiyokohamaman8523 А что подпездываете тогда во втором видео уже?
@dmitriiyokohamaman8523
@dmitriiyokohamaman8523 3 жыл бұрын
в@@rsakutin Не "подп-здываю", а "По Царски" комментирую. Что бы у Вас больше просмотров было.
@rsakutin
@rsakutin 3 жыл бұрын
@@dmitriiyokohamaman8523 спасибо!)
@montykay6003
@montykay6003 3 жыл бұрын
Не, ну за отсылку на гоблина и мем "пересядь с иглы мужского одобрения..." тупа лайк
@lolmemavich135
@lolmemavich135 3 жыл бұрын
а еще за "Привет, мои маленькие любители говнокода" - отсылка к Тесаку, тоже респект)
@isildurgir
@isildurgir 3 жыл бұрын
С "рандомайзиром" тоже перебор, можно так как Вы говорите, да это более случайно, но можно и так как в там было. Комментарий с тестами рандомом, - так наоборот тестить нужно действительно случайным образом, а не псевдо, а если говнотестить, тогда да можно и так.
@dizzyark9221
@dizzyark9221 3 жыл бұрын
Роман что то у вас с сайтом. Пытался записаться но... Видимо что то случилось, да. Регистрация не работает!
@araslanrus
@araslanrus 3 жыл бұрын
Видимо говнокод на сайте не позволяет
@user-yt9un2uo6r
@user-yt9un2uo6r 3 жыл бұрын
Можешь обозреть код yanderedeva?)))
@7453060
@7453060 3 жыл бұрын
Почему "on" "off" не enum?
@LordZiegfrid
@LordZiegfrid 3 жыл бұрын
Потому что это строки.
@Sagrell94
@Sagrell94 3 жыл бұрын
@@LordZiegfrid +, господи челы настолько Васьки) Это парсинг строки, ало. Какой enum? Или ты предлагаешь спарсить "on" "off" в enum, чтоб потом перевести в bool?
@Dadadadam999
@Dadadadam999 3 жыл бұрын
Тут скорее вопрос, кто вообще хранит двухзначное значение в виде строки. =Д Как бы не проще ли в конфиге хранить сразу же, bool переменную, чем потом писать такую вот дичь.)
@Bond007in
@Bond007in 3 жыл бұрын
Если "из популярной игры" может не "обосрались".
@selim5772
@selim5772 3 жыл бұрын
А что за игра?
@darkhorse2219
@darkhorse2219 3 жыл бұрын
Можешь конструктивно раскритиковать мой не дописанный говнокод на данном этапе ? using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class carController : MonoBehaviour { [Header("Keyboard")] [Space(10)] public KeyCode Forward = KeyCode.W; public KeyCode backTo = KeyCode.S; public KeyCode right = KeyCode.D; public KeyCode left = KeyCode.A; public KeyCode Acceleration = KeyCode.LeftShift; public KeyCode brake = KeyCode.Space; [Header("Speed")] [Space(10)] public float speed; public float minSpeed =50f; public float accelerationSpeed = 100f; public float reversSpeed = -30f; public float smoothSpeed = 0.1f; [Header("Fuel")] [Space(10)] public float fuelConsumption = 100f; public Scrollbar fuelS; [Header("Others")] [Space(10)] public float rotateUgol = 20f; Rigidbody rig; Transform trans; public float xRotate; public float rotatePodom = 2; public float yRotate; public Transform[] wheels; public TriggerCollider[] peredZad; // Use this for initialization void Start () { rig = GetComponent (); trans = GetComponent (); Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; } // Update is called once per frame void FixedUpdate () { if (fuelS.size == 0) { rig.useGravity = true; rig.freezeRotation = false; } else { if (speed < 0.1 && speed > -0.1) speed = 0f; if (Input.GetKey (brake)) { if (speed > 0) speed -= smoothSpeed * 10; if (speed < 0) speed += smoothSpeed * 10; rig.velocity = transform.forward * speed; } if (fuelS != null) fuelS.size -= Time.deltaTime / fuelConsumption; //trans.Rotate (Input.GetAxis ("Mouse X") * rotateUgol, 0f, 0f); if (!Input.GetKey (backTo) && !Input.GetKey (Forward)) { if (speed > 0) speed -= smoothSpeed * 5; if (speed < 0) speed += smoothSpeed; rig.velocity = transform.forward * speed; } if (Input.GetKey (Forward) && !peredZad[0].isTrigger) { if (Input.GetKey (left)) { yRotate -= Mathf.Lerp (speed / rotateUgol, speed / rotateUgol * 0.8f, speed / rotateUgol * 0.8f); } if (Input.GetKey (right)) { yRotate += Mathf.Lerp (speed / rotateUgol, speed / rotateUgol * 0.8f, speed / rotateUgol * 0.8f); } xRotate += Input.GetAxis ("Mouse Y") * rotatePodom; xRotate = Mathf.Clamp (xRotate, -50, 50); trans.localEulerAngles = new Vector3 (xRotate, yRotate, trans.localEulerAngles.z); rig.velocity = transform.forward * speed; if ((speed < minSpeed && Input.GetKey (Acceleration) && speed != minSpeed) || speed < 0) speed += smoothSpeed * 2; else if (speed < minSpeed && speed != minSpeed) speed += smoothSpeed; else { speed = Mathf.Clamp (speed, minSpeed, accelerationSpeed); if (Input.GetKey (Acceleration) && speed < accelerationSpeed) { speed += smoothSpeed; } else if (speed > minSpeed + 1) { speed -= smoothSpeed; } } } if(!Input.GetKey(left) && !Input.GetKey(right)) yRotate = trans.localEulerAngles.y; if (Input.GetKey (backTo) && !peredZad[1].isTrigger) { xRotate += Input.GetAxis ("Mouse Y") * rotatePodom; xRotate = Mathf.Clamp (xRotate, -50, 50); trans.localEulerAngles = new Vector3 (xRotate, yRotate, trans.localEulerAngles.z); rig.velocity = transform.forward * speed; if (speed != -reversSpeed) speed -= smoothSpeed * 10; speed = Mathf.Clamp (speed, reversSpeed, accelerationSpeed); if (Input.GetKey (left)) { yRotate -= Mathf.Lerp (speed / rotateUgol, speed / rotateUgol * 0.8f, speed / rotateUgol * 0.8f); } if (Input.GetKey (right)) { yRotate += Mathf.Lerp (speed / rotateUgol, speed / rotateUgol * 0.8f, speed / rotateUgol * 0.8f); } } } } }
@GameDevTutorials2023
@GameDevTutorials2023 3 жыл бұрын
Я бы глянул обзор кода канала Sharp Accent
@sh_nero
@sh_nero 3 жыл бұрын
В С# такой стиль писать "condition == false" вместо "!condition"?
@your-salmon
@your-salmon 3 жыл бұрын
Сакутин говорил, что восклицательный знак легко не заметить.
@jz4887
@jz4887 3 жыл бұрын
@@your-salmon ну, его, наверное, не заметит только в шары долбящийся.
@jz4887
@jz4887 3 жыл бұрын
Нет, это не стиль такой. Вот сам не понимаю зачем этот позор с "== false" писать.
@lunarlife7850
@lunarlife7850 3 жыл бұрын
@@jz4887 Для нормальной читабельности
@jz4887
@jz4887 3 жыл бұрын
@@lunarlife7850 код отлично и без этого читается
@hewston2733
@hewston2733 3 жыл бұрын
Вообще это из С++, но вдруг кому-то захочется в этом поковыряться, писал от скуки на паре: int fun(int *arr, int sz, int elem = 0){ return elem==0?(arr[elem]+fun(arr, sz, elem+1))/ sz: elem !=sz-1?arr[elem]+fun(arr,sz,elem+1):arr[elem]; }
@hewston2733
@hewston2733 3 жыл бұрын
Выводит среднее арифметическое числового массива (наверное)
@nikolainikk3916
@nikolainikk3916 3 жыл бұрын
3:07 по-моему, это тоже говнокод. Поправьте, если не прав. Ты эксепшн кидаешь и юзаешь зачем-то new? Зачем тебе тут понадобилось вообще динамическое выделение памяти?
@TedFanat
@TedFanat 3 жыл бұрын
Ору) Это С#, a не С++))
@nikolainikk3916
@nikolainikk3916 3 жыл бұрын
@@TedFanat всё, извиняюсь) спасибо что поправили)
@evilraccoon6538
@evilraccoon6538 3 жыл бұрын
Есть два разных подхода. 1. Критиковать чужое, старательно выбирая слабые примеры. 2. Создавать свое, превосходящее чужое, ожидая что это оценят. Так вот, ребятки, программисты это люди умственного труда. Оставлю-ка я вам тут задачку: кто из этих двух примеров будет лУчшим специалистом, а кто пустышкой? И оставлю тут готовое решение: идите отсюда, вас тут ничему толковому не научат. Он же токсичен. Нельзя инфицироваться таким образом мышления.
@sergeyfirsov9100
@sergeyfirsov9100 2 жыл бұрын
Твой то код где ?
@kirillbukato4164
@kirillbukato4164 3 жыл бұрын
Прошу прощения, а как этот ваш c# в плане секса, А? М?
@nikolay-5074
@nikolay-5074 3 жыл бұрын
Отличный пример, но легче весь код просто удалить так как он не преследует никакой цели и не нужен.
@russianempiremapper408
@russianempiremapper408 3 жыл бұрын
что за игра
@nikolay-5074
@nikolay-5074 3 жыл бұрын
Кликер Clickbayter.
@--.--
@--.-- 3 жыл бұрын
4:53
@user-bb5xw8bd8w
@user-bb5xw8bd8w 3 жыл бұрын
Очередное не знание матчасти: if (value == "on") return true else bla-bla-bla - натуральный говнокод вместо одной строчки
@avocadocoder185
@avocadocoder185 3 жыл бұрын
Гоблин в мире C#
@debez3716
@debez3716 3 жыл бұрын
ахахах
@purplep3466
@purplep3466 3 жыл бұрын
блин, Роме нужно похожий голос еще сделать
@Diyozen
@Diyozen 3 жыл бұрын
Я Вас категорически приветствую. Этот код - тупое говно тупого говна. Говнополя и говнометоды с говноаргументами для отсталых дебилов. Дети, не пишите говно тупого говна. А на сегодня всё, до новых встреч.
@adiks09
@adiks09 3 жыл бұрын
Те кто писал про yandere, спасибо, я ослеп
@darkstormheute
@darkstormheute 3 жыл бұрын
А нельзя было написать: if (value == "on") return true else if (value == "off") return false else throw new ArgumentException("...") ?
@hitaciry258
@hitaciry258 3 жыл бұрын
а еще можно без else
@darkstormheute
@darkstormheute 3 жыл бұрын
@@hitaciry258 нет, была-бы ошибка
@kirillsviderski4739
@kirillsviderski4739 3 жыл бұрын
@@darkstormheute else реально не нужен тут
@darkstormheute
@darkstormheute 3 жыл бұрын
@@kirillsviderski4739 а да, затупил
@intivi5277
@intivi5277 3 жыл бұрын
Можно и нужно так как вы предложили. Только без else. Не берите в голову примеры быдлооптимизации из видео.
@biohazardmars
@biohazardmars 3 жыл бұрын
Зделай обзор на ютуб программиста Simple Code у него полезные.
@-boiadeiro-
@-boiadeiro- 3 жыл бұрын
а у вас разве нет другой либы для "настоящего" рандома? *мимо-не-сишарпер*
@xezdx
@xezdx 3 жыл бұрын
Нафиг такие сложности с генерацией? Псевдокод: pwd=md5(random()).substring(...) - сколько нужно вплоть до 32 символов. И вообще такие пароли фиг запомнишь даже 6 символов. Лучше делать пароли из пары обычных слов типа "каша-малаша" - подбирать рандомом дольше, а запомнить легче.
@giawsuy4781
@giawsuy4781 3 жыл бұрын
У меня есть еще один вариант получения алфавита: List Alphabet = new List(Enumerable.Range('A', 'Z' - 'A' + 1).Select(c => (char)c).ToList());
@MrJloa
@MrJloa 3 жыл бұрын
Плять, 2021 год, пароли из ascii символов... Для адептов кодировок отличных от utf8 в аду отдельный котёл с бесами. Вообще за такое административку давать надо.
@That-Is-All-Hat
@That-Is-All-Hat 3 жыл бұрын
Только у Ромы Сакутина качественный код, а у всех остальных - говно. Покупайте курсы Ромы Сакутина.
@khudoyorkhonmirjalolov3006
@khudoyorkhonmirjalolov3006 3 жыл бұрын
готов в разносу своего кода public class EnemySpawner : MonoBehaviour { public ObjectPooler _objectPooler; public Transform[] SpawnPoint; public float NextDeamonTimer = 2f, NextSkeletonTimer = 1f, DeamonStartSpawnTime = 5f; private float _deamonTimer = 0f, _skeletTimer = 0f, _deamonStartSpawnTime = 0f; private void Start() { _objectPooler.SpawnFromPool("Deamon", SpawnPoint[Random.Range(0, SpawnPoint.Length)].position, Quaternion.identity); _objectPooler.SpawnFromPool("Skeleton", SpawnPoint[Random.Range(0, SpawnPoint.Length)].position, Quaternion.identity); } private void FixedUpdate() { SkeletonSpawn(); DeamonSpawn(); } private void SkeletonSpawn() { _skeletTimer += Time.deltaTime; if(_skeletTimer >= NextSkeletonTimer) { _objectPooler.SpawnFromPool("Skeleton", SpawnPoint[Random.Range(0, SpawnPoint.Length)].position, Quaternion.identity); _skeletTimer = 0; } } private void DeamonSpawn() { if (_deamonStartSpawnTime = NextDeamonTimer) { _objectPooler.SpawnFromPool("Deamon", SpawnPoint[Random.Range(0, SpawnPoint.Length)].position, Quaternion.identity); _deamonTimer = 0f; } } } }
@levrisfirst3291
@levrisfirst3291 3 жыл бұрын
Самое смешное, что раз так автор разбирается в говне, то скорее всего сам такое же говно и пишет :)
@50z10p47
@50z10p47 3 жыл бұрын
Опыт - сын ошибок трудных
@znsoft
@znsoft 3 жыл бұрын
Не скорее всего, а точно пишет. Он даже в этом ролике показал свой говнокод. Его испражвления не лучше
@isildurgir
@isildurgir 3 жыл бұрын
В первом примере интересная Ваша логика. В коде четко же написано, что если не "on" только тогда false. То есть в принципе пофиг что там кто то вводит что угодно даже yes, всегда будет false. Да конечно там нет эксепшин, но разве это ответственность этого метода, пусть тот кто передает в метод значение и занимается его обработкой. Это же синглреспонсибилити в прямом действии. Как такого можно не знать. Согласен если б это действительно была программа для какой то банковской системы безопасности, там где эксепшин на эксепшине сидит и нужно все обрабатывать, но для игр это перебор и полный бред.
@user-by1ct1rc7p
@user-by1ct1rc7p 3 жыл бұрын
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SWIPE_MOVE : MonoBehaviour { public bool tap, swipeLeft, swipeRight; private bool isDraging = false; private Vector2 startTouch, swipeDelta; public GameObject player; private void Update() { tap = swipeLeft = swipeRight = false; #region Standalone Input if (Input.GetMouseButtonDown(0)) { tap = true; isDraging = true; startTouch = Input.mousePosition; } else if (Input.GetMouseButtonDown(0)) { Reset(); } #endregion #region Mobile Input if (Input.touches.Length > 0) { if (Input.touches[0].phase == TouchPhase.Began) { tap = true; isDraging = true; startTouch = Input.touches[0].position; } else if (Input.touches[0].phase == TouchPhase.Ended || Input.touches[0].phase == TouchPhase.Canceled) { isDraging = false; Reset(); } } #endregion swipeDelta = player.transform.position; if (isDraging) { if (Input.touches.Length > 0) swipeDelta = Input.touches[0].position - startTouch; else if (Input.GetMouseButton(0)) swipeDelta = (Vector2)Input.mousePosition - startTouch; } //Dead zone if (swipeDelta.magnitude > 125) { float x = swipeDelta.x; float y = swipeDelta.y; if (Mathf.Abs(x) > Mathf.Abs(y)) { //Right or left if (x < 0) swipeLeft = true; else swipeRight = true; } Reset(); } } private void Reset() { startTouch = swipeDelta = Input.mousePosition; } public Vector2 SwipeDelta { get { return swipeDelta; } } public bool SwipeLeft { get { return swipeLeft; } } public bool SwipeRight { get { return swipeRight; } } } Thats my shit!
@user-by1ct1rc7p
@user-by1ct1rc7p 3 жыл бұрын
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Swipe_test : MonoBehaviour { public SWIPE_MOVE swipeControls; public Transform player; //public Vector3 desiredPosition; private void Update() { if (swipeControls.SwipeLeft) player.transform.position -= Vector3.right; if (swipeControls.SwipeRight) player.transform.position += Vector3.right; player.transform.position = new Vector3(player.transform.position.x, player.transform.position.y, player.transform.position.z); } }
@kyv1r
@kyv1r 3 жыл бұрын
Все классно, но можешь говорить чуть громче пожалуйста?
@user-uv3gw2zk2d
@user-uv3gw2zk2d 3 жыл бұрын
Мда, почему это говно вылетает по рекомендациям....
@user-wb3fc9zn7j
@user-wb3fc9zn7j 3 жыл бұрын
Посмотри Yandere Dev Code. Там контента на долго хватит) 4069 строк кода............
@FloatingGames
@FloatingGames 3 жыл бұрын
А в чем прикол? Я просто не в теме)) расскажи
@user-wb3fc9zn7j
@user-wb3fc9zn7j 3 жыл бұрын
@@FloatingGames у него там весь код состоит из if/else.. И это 4069 строк занимает в скрипте. Видео на ютубе посмотри, угарнешь.
@Yangoira
@Yangoira 3 жыл бұрын
Нихуя не понятно, но очень интеречно
@CidKagenouS
@CidKagenouS 3 жыл бұрын
Оооода
@nikemoscow8881
@nikemoscow8881 3 жыл бұрын
Если не on то false. Ну и в чем баг? Некорректно? - да, но не будет бага.
@Dadadadam999
@Dadadadam999 3 жыл бұрын
Вполне может быть. Скорее зависит от того, какая реализация на основе этого флага будет создана. Если от значения off будет зависеть, выполнение каких, либо условий, то могут полезть баги, если например конфиг криво спарсится. Однако это не критично и проблема быстро находится через дебагер. Тут в целом проблема, что очевидно булева переменная в конфиге описана при помощи стрингов.
@oleksandrlysiuk3971
@oleksandrlysiuk3971 3 жыл бұрын
Блин , я фронт разраб, и смотрю это, зачем?))
@cheburek5116
@cheburek5116 3 жыл бұрын
А я вообще не кодер, но смотрю
@Wansery
@Wansery 5 ай бұрын
3:05 это тоже говнокод какой-то. Зачем нам вообще нужно парсить строку в бул, если мы точно знаем, что on это true, а off это false? Почему сразу не передавать бул? Если уж на то пошло, то можно просто сделать switch case (хз какой аналог на шарпах) нет кучи дополнительных условий и защита от ошибок. А так, ты просто обернул говнокод в шапку из говна, ещё не забыв свои говнокурсы прорекламировать
@despasus
@despasus 3 жыл бұрын
Очень прикольный контент, жаль только, что он ограничивается сишарпом и гейдевом
@gachigazm6169
@gachigazm6169 3 жыл бұрын
Зачем так голос искажаешь? Типу фишка такая? Бывает не оч приятный такой асмр
@rsakutin
@rsakutin 3 жыл бұрын
У меня бронхит :(
@nurlanakylbekov7266
@nurlanakylbekov7266 3 жыл бұрын
#1
@NagisaHa
@NagisaHa 3 жыл бұрын
Да ты за.. надоел обсирать Гошу в первую очередь.
@oleksandrlysiuk3971
@oleksandrlysiuk3971 3 жыл бұрын
Nagisa так Гоша реально говнокодит)
@iamdan8203
@iamdan8203 3 жыл бұрын
Кто бы ни читал этот комментарий, знай, что *ГОСПОДЬ ИИСУС ХРИСТОС ЛЮБИТ ТЕБЯ!* Whoever reads this comment, know that *LORD JESUS CHRIST LOVES YOU!*
@user-wl5hd3yf9w
@user-wl5hd3yf9w 3 жыл бұрын
Еба весь ролик реклама своих курсов
@calchome2768
@calchome2768 3 жыл бұрын
Да нахрен надо так писать... Через 3 мес забудете про сложности, которыми напичкали код... И поддерживать его станет гораздо сложнее... В общем Гоша дударь лучший! Лучше говнистей, но понятнее!
@LordHellas
@LordHellas 3 жыл бұрын
Как же тяжело вас слушать... Представляю такую подачу материала на ваших курсах.
@user-sp8eb8wf2q
@user-sp8eb8wf2q 3 жыл бұрын
он не преподает, там другой препод
@rsakutin
@rsakutin 3 жыл бұрын
@@user-sp8eb8wf2q Я преподаю, и на мои лекции отзывы что сложно слушать
@50z10p47
@50z10p47 3 жыл бұрын
@@rsakutin no pain - no gain хули
@asddsaasddsaasddsaasddsa
@asddsaasddsaasddsaasddsa 3 жыл бұрын
Я, наверно, открою Америку, но на юнити игры делают не программисты и им до качества кода совершенно нет дела.
@FloatingGames
@FloatingGames 3 жыл бұрын
Почему ты так думаешь?
Please be kind🙏
00:34
ISSEI / いっせい
Рет қаралды 108 МЛН
WHO DO I LOVE MOST?
00:22
dednahype
Рет қаралды 65 МЛН
Haha😂 Power💪 #trending #funny #viral #shorts
00:18
Reaction Station TV
Рет қаралды 8 МЛН
She ruined my dominos! 😭 Cool train tool helps me #gadget
00:40
Go Gizmo!
Рет қаралды 55 МЛН
7 Лет Опыта в IT | Что я Понял?
19:56
Vlad Mishustin
Рет қаралды 49 М.
Please be kind🙏
00:34
ISSEI / いっせい
Рет қаралды 108 МЛН