Тёмный

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

Роман Сакутин
Подписаться 285 тыс.
Просмотров 52 тыс.
50% 1

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

Опубликовано:

 

26 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 226   
@rsakutin
@rsakutin 4 года назад
Сори за косячки, видос записываю болея бронхитом с температурой в 39 :( Также важная деталь: курс с нуля до результата с 3600 в месяц доступен только до конца августа, потом цена вырастет на 30 процентов. Если записаться сейчас то скидочная цена заморозится на весь период рассрочки - ijunior.ru/unity-start?
@victorbrin5085
@victorbrin5085 4 года назад
☝️Это ваш курс? Иди реклама?
@rsakutin
@rsakutin 4 года назад
@@victorbrin5085 Наш)
@victorbrin5085
@victorbrin5085 4 года назад
@@rsakutin вписался
@g3k0s20
@g3k0s20 3 года назад
Блин, ну что за детский сад? )) Ты позиционируешь себя как бывалый кодер. При этом, ты просто адово рофлишь практически с любого куска кода. И допускаешь типичные ошибки... Какого черта записывать этот хлам, если тебе хреново?? Как показывает практика, пока мы делаем обзор кода, мы ниибаца спецы. А как садимся кодить, так на деле - рядовой мидл в лучшем случае... И после того как тебя разнесли в коментах, ты просто пишешь, "сори за косячки" ))) Садись - Двойка!
@rsakutin
@rsakutin 3 года назад
@@g3k0s20 садись на пенис!
@AqilonStudio
@AqilonStudio 4 года назад
“YandereDev: A lesson in coding” - видос на ютубе с кусками кода из популярной Инди игры, кладезь, хватит надолго
@tupolegolassomethingelse455
@tupolegolassomethingelse455 4 года назад
О боже мой...
@Mikasey
@Mikasey 4 года назад
О даа, яндере дев это величайший говнокодер сия мира
@yulian_13
@yulian_13 3 года назад
Я ржал от начала и до конца как вне себя, мне нужно больше этого дерьма.
@janedoe6182
@janedoe6182 4 года назад
В первом написанном тобой примере генерации пароля длинна итоговой строки будет превышать требуемую. Во втором примере, вместо получения длины массива через стандартное свойство массива, ты зачем-то делаешь это через универсальный метод 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)]));
@СергейИванов-ш6ц5с
Курс - Красивый говнокод за 24 часа для чайников ;-))) Сначала находим себе сложности, а потом героически их преодолеваем
@podtangusom4002
@podtangusom4002 3 года назад
Знаете,ошибки делают все,а ошибки в свою очередь делают нас лучше.И худшее ,что может сделать человек-высмеивать косяки других людей,за счет этого самоутверждаясь.
@gaitavr1992
@gaitavr1992 4 года назад
Первый пример вообще от реальности оторванный, этот конфиг будет еще той огромной колбасой, плюс не упомянут метод Equals с перегрузкой и без. Кстати, а где третий пример говнокода? Я увидел 2 говнокода и три исправленных варианта
@Sagrell94
@Sagrell94 4 года назад
Почти в каждом комменте вижу, как люди несут такую чушь. Многие пишут, что его подход - ужасен. Подход не ужасен, а бессмысленнен, новички все равно не смотрят такие видео, поэтому эти видео скорее делаются для себя. Но он говорит абсолютно логичные и правильные вещи. Нельзя при показе кода новичкам жертвовать качеством этого кода. Тебе же учитель математики не говорит: "сейчас мы изучаем сложение, поэтому не обращайте внимания, что у меня кучу ошибок в вычитании". Человек думает, что так нужно писать и так пишет дальше. Приведу пример: я хотел разобраться в шейдерах, но не сильно запаривать и не читать огромные книги. В итоге искал ролики на RU-vid и мне попадались сплошные эти "горе Гоши Дудари", и сколько я не смотрел таких роликов, я не мог сесть и написать любой шейдер нормально, потому что они не раскрывали суть и не обучали тебя, они показывали как они говнокодом решили какую-то конкретную задачу. Но потом я нашел Catlike Coding, где чел разбирает шейдеры на уровне их компиляции и объясняет вообще все. И за четверть времени которое потратил на этих идиотов, научился писать довольно сложные шейдеры и дальше уже сам разбираться во всем. Если ты делаешь контент для новичков, то делай уроки вида "Как работает цикл for" и постепенно вводи в материал, а не "Как нихуя не зная, написать AI за 30 мин". Это информационный мусор, который только вредит. Хотя скорее всего это пишут зрители Гоши Дударя, которые думают, что они разработчики игр, не понимая, что они по уровню развития сейчас на школьной программе 9 класса.
@Scrayerful
@Scrayerful 4 года назад
ужасный подход: взять код, который предназначается джунам и для простоты понимания состоит из понятных инструкций и городить из этого работу с исключениями в элементарной операции (подробнее ниже) Да, обработка исключений это хорошо, но сможет ли новичок правильно обработать исключение ? А проконтроллировать после этого сборщик ? Добавление дополнительной конструкции Config.PositiveStateKeyword Почему в итоге не return value == "on" ? То, что ты описал хорошо, когда повторяемость кода большая, но если подобные функции необходимы часто, то тут проблема скорее в архитектуре *предполагаю, что данный код взят из какого-либо видео, но ссылки на него не оставлено **думаю, что преобразование string -> bool не уместно вообще, поэтому функция на момент создания обречена быть неудачной
@Sagrell94
@Sagrell94 4 года назад
Ты не прав в каждом своем высказывании) 1. По подходу я написал коммент. 2. Про сборщик мусора ты решил сделать вид, что ты шаришь, но это самое бессмысленное, что я слышал) 3. Config.PositiveStateKeyword это "константа". Ты наверное считаешь периметр круга в коде как 2*3.14f*R 4. Преобразование string в bool не уместно?)) А как по твоему работает парсинг СТРОКИ в ОБЪЕКТЫ?)
@ВикторВорогушин-з4й
я который еще не джун такие конструкции давно не использую и как уже говорил автор во многих видео : говнокод это не проще,это хуже
@Hitori_FtoL
@Hitori_FtoL 4 года назад
Роман, оставь, плиз, ссылку на твой гитхаб) Просто хочется увидеть хороший код, для того, чтобы подчеркнуть некоторые фишки
@ДмитрийАсеров
@ДмитрийАсеров 3 года назад
А ответа нет? У гуру нет гитхаба странно?
@dadoo6912
@dadoo6912 2 года назад
@@ДмитрийАсеров если ты увидишь сеньора с богатым, постоянно обновляющимся гитхабом, единственное, что о нем можно сказать, так то, что он нихуя не работает
@xezdx
@xezdx 4 года назад
Насчет экспшн в конфиге это больше зависит от соглашений, принятых для программы. Если принято ошибки "замалчивать", а не бесить юзера всплывающими окошками, то достаточно {return key=="on"}, если нет, то проверку стоит делать отдельно типа if(!isKeyword(key)){ ...error... } else { ok=isEnabled(key); } Проверять значения из конфига выбросом исключения не стоит. Исключения не должны быть частью программы и "нормальным" результатом выполнения функции.
@Slko
@Slko 4 года назад
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 4 года назад
Крутяк, спасибо!
@Slko
@Slko 4 года назад
@@rsakutin Если интересно, как правильно сделать, то самый простой вариант такой: Нужно проверять, входит ли случайное число в наш диапазон (0-61), и если не входит, то пропускать его и брать следующее случайное значение, и так пока не наберём нужное количество символов.
@xBezzx
@xBezzx 4 года назад
Slko я нихуя не понял но очень интересно , не останавливайся пиши
@artur8904
@artur8904 3 года назад
@@xBezzx маленьких цифр в паролях будет больше
@alyxmp4749
@alyxmp4749 4 года назад
Каждый код - говнокод (С) Роман
@Priboy313
@Priboy313 3 года назад
Я первый пример вижу так: был рычаг из простой конструкции и я более чем уверен, что где-то в коде он вызывался ИСКЛЮЧИТЕЛЬНО с он/офф. А стал переусложнённый космический аппарат с навесом из конфига и прочей лабуды. Всего один вопрос - зачем?
@Alex-net-brn
@Alex-net-brn 3 года назад
Чувак, ты в первом примере, где проверка value == "on", ВСЁ СЛОМАЛ!!! ))) Функция возвращала true, ТОЛЬКО когда value существует и равно "on". Если в конфиге нет этой строки, или она закоменчена, то твой супер код начнёт сыпать эксепшены )) Пример такой строки: god_mode = "on" смекаешь умник? :))
@Lucio11a
@Lucio11a 4 года назад
Admix, это, конечно, круто... но реклама сбербанка в средневековой таверне, эт было бы слишком сильно :D
@bratttn
@bratttn Год назад
а зачем так сложно с генерацией рандом строки из словаря? есть же в си шарпе Fare (xeger), загоняешь в него регулярку с фиксированной длиной строки и бум! одна строчка кода.
@БешеныйСпециалист
Есть множество методов решения проблемы. Так почему все, кроме одного единственного, сразу говно? Во мне пробуждается сомневающийся во всём перфекционист. Как убедиться в правильности решения проблемы? Может потому, что мы человеки еще не стали как "1"? Не "перепишем говно код", а "Люди! Я могу предложить более совершенный код!" :-).
@evilraccoon6538
@evilraccoon6538 4 года назад
Есть два разных подхода. 1. Критиковать чужое, старательно выбирая слабые примеры. 2. Создавать свое, превосходящее чужое, ожидая что это оценят. Так вот, ребятки, программисты это люди умственного труда. Оставлю-ка я вам тут задачку: кто из этих двух примеров будет лУчшим специалистом, а кто пустышкой? И оставлю тут готовое решение: идите отсюда, вас тут ничему толковому не научат. Он же токсичен. Нельзя инфицироваться таким образом мышления.
@g_r_u_n_d_y
@g_r_u_n_d_y 4 года назад
Зачем кастить char в int и обратно, если можно одним char обойтись? `for (char c = 'a'; c
@FloatingGames
@FloatingGames 4 года назад
А что значит yield return, ну просто никак не могу понять
@g_r_u_n_d_y
@g_r_u_n_d_y 4 года назад
@@FloatingGames Справка msdn: docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield При использовании этого ключевого слова внутри функции, компилятор преобразует ее так, чтобы она возвращала итератор. Это позволяет просто создавать итерируемые объекты, по сути односвязные списки, по которым можно пройтись например, с использованием `foreach`, при этом каждая итерация отделяется с помощью yield
@FloatingGames
@FloatingGames 4 года назад
@@g_r_u_n_d_y а куда буква запишется тогда? Я так понял этот метод yield используется при переопределении метода getIEnumerator, да?
@g_r_u_n_d_y
@g_r_u_n_d_y 4 года назад
@@FloatingGames Я так понял этот метод yield используется при переопределении метода getIEnumerator, да? Не совсем. Сам класс c методом GetEnumerator генерируется компилятором. В полученной реализации IEnumerator при вызове `MoveNext()` происходит выполнение метода до первого yield, значением свойства Current устанавливается значение после `yield return` в данном случае текущий символ. При следующем вызове - выполнение до следующего yield и так далее.
@badguy6915
@badguy6915 4 года назад
сакутин:выы гавнооо!!! мы:мыыы гавнооо!!! простые смертные(непрограммисты): ...
@Gsp_NoIce
@Gsp_NoIce 4 года назад
Встречал как-то такое: 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 4 года назад
А что делать если я не понимаю?
@FloatingGames
@FloatingGames 4 года назад
Хотя я понял, это жесть, а можешь написать как надо или что подрузумевалось?
@Gsp_NoIce
@Gsp_NoIce 4 года назад
@@FloatingGames docs.microsoft.com/ru-ru/dotnet/api/system.enum.parse
@serghein845
@serghein845 4 года назад
@@FloatingGames когда не понимаешь, надо лезть в инет и разбираться! так обычно все делают )
@serghein845
@serghein845 4 года назад
Мужик, ты красава! самый правильный ответ ) тольк в нём нет состояние "default", которое и будет исключением.
@stanislaw8179
@stanislaw8179 4 года назад
Привет, у меня есть книга "ЯП С# 7 и платформы .NET и .NET CORE" от Эндрю Троелсен и Филипп Джепикс Какой уровень можно получить, прочитав эту книгу, если я с полного нуля, без книг и тп, смотря видео на ютубе понял ООП, создал 2д на юньке по типу дудла и несколько приложений ВинФормс с разным наклоном, но при этом, я прохожу тесты на junior на 40%-60%?
@КириллЛомовской
Недавно в проекте ЕПАМ был найден такой код. Это самое бессмысленное и беспощадное, что я видел. private static int stringSize(String s) { int size = 0; for(int i = 0; i < s.length(); i++) { size++; } return size; }
@AlexStraga
@AlexStraga 4 года назад
Балин, мы ток с другом начали учить делфи и то превращали числа в чары, а не создавали списки чаров в ручную)
@morozokgaming5921
@morozokgaming5921 4 года назад
а для чего вам делфи, если не секрет? 🤔
@AlexStraga
@AlexStraga 4 года назад
@@morozokgaming5921 потому что была книга по делфи для чайников) Это было более 17 лет назад.)
@morozokgaming5921
@morozokgaming5921 4 года назад
@@AlexStraga я думал вы его в 2020 начали учить))
@morozokgaming5921
@morozokgaming5921 4 года назад
@@AlexStraga и чего добился за 17 лет? если не секрет)
@AlexStraga
@AlexStraga 4 года назад
@@morozokgaming5921 Честно говоря не много ) Интернета тогда у меня не было (да и нормальный не еле дышаший адсл ток 2 года назад появился), учиться было сложно, потом устроился в айти сфере в отрасль не касаясь прогерства. Кодинг был хобби. И вот только полтора года назад вернулся в кодинг, прошел курсец и думаю что теперь дело пойдет хоть как то. Друг же ушел в веб разработку
@olegzorin3911
@olegzorin3911 4 года назад
Пример с генерацией пароля немного надуман. Да белый список - это правильно, но в конечном итоге вы же храните у себя не пароль, а его хеш. И как бы вы круто не генерировали пароль, но если потом храните, упаси Бог, 8-битный хеш - то уже будет не принципиально как сгенерирован пароль. Да даже 256 битные пароли брутфорсятся за вменяемое время на гпушках. Привет от радужных таблиц. Так что если думать о безопасности, то начинать надо с хеш-функции (повышать время на взлом), хранения этих хешей (не позволять спереть бд, чтобы брутфорсить на гпу) и защищать от перебора саму форму (long request - увеличиваем время взлома, fail2ban - усложняем жизнь на возню с прокси и увеличиваем время). А вообще сделать непробиваемую защиту не возможно - можно лишь сделать экономически не целесообразным взлом. Если вы храните только фантики для пользователей со странными никами, то так-то можно пароль и в открытую хранить ))
@DoGGy1110
@DoGGy1110 4 года назад
Про 2ой случай. Это погрешности декомпиляции. При декомпеляции любая конкатинация строк делается через массив.
@50z10p47
@50z10p47 4 года назад
Поясните нуфагу. При конкатенации строк/массивов мы создаём новый объект. При использовании stringbuilder мы имеем все тот же объект. Если не лезет - capacity увеличивается в 2 раза до тех пор пока не влезет или не превысит MaxCapacity. То есть даже после декомпиляции это не должно выглядеть конкатенацией строк так как принцип работы немножечко совсем другой, разве нет?
@montykay6003
@montykay6003 4 года назад
Не, ну за отсылку на гоблина и мем "пересядь с иглы мужского одобрения..." тупа лайк
@lolmemavich135
@lolmemavich135 3 года назад
а еще за "Привет, мои маленькие любители говнокода" - отсылка к Тесаку, тоже респект)
@mikhailshpirko1877
@mikhailshpirko1877 4 года назад
4:42 по идее, если в метод передать "On" или "ON" то будет либо эксепшн (в зависимости от того как имплементирован метод IsBinaryStateKeyword) либо метод вернет false. Как вы считаете, правильно ли в таком случае возвращать true и осуществить сравнение без учета регистра?
@rsakutin
@rsakutin 4 года назад
Я бы делал регистронезависимым решение
@maxm1079
@maxm1079 4 года назад
@@rsakutin а я бы не делал, иначе те кто настраивает софт вам хуй выкрутят, из за того что у вас on != ON, on != true (и тд.). так что и вы неплохо своего говна добавили. первый пример вообще чисто рефакторинг кода сделали, изначальный код не является уязвимым
@f14shm4n
@f14shm4n 4 года назад
@@maxm1079 изначальный код болеет тем же самым, при "ON" выдаст "false", но в принципе согласен с вами, в оригинальном коде нужно просто добавить IgnoreCase
@LordZiegfrid
@LordZiegfrid 4 года назад
Вот тебе ревью по первому примеру: 1. Сравнение через "==" для строк зависит от региональных настроек. 2. "== false". 3. Название переменных и методов не отражает суть.
@riskiofi7571
@riskiofi7571 2 года назад
не отражает, но это важно. чтобы не запутаться в своём же скрипте, ну например сел за проект который делал 2 года назад. и ты ничего не поймёшь так как воиды будут называться"aboba A" и с переменными также
@7453060
@7453060 4 года назад
Роман, почему генерация строки не метод расширения? Очевидно, что если мне необходимо особое поведение StringBuilder, я создаю метод расширения и в момент использования оборачиваю в using. Далее мне не нужны сами символы на этапе генерации, мне нужны только их коды в таблице символов, значит мне нужно смещать iterator по матрице, способ смещения определяет стойкость алгоритма.
@_kk_
@_kk_ 4 года назад
Потому что это нарушит принцип единственной ответственности. Разве нет?
@vitaly6838
@vitaly6838 4 года назад
Я когда только начинал даже так не писал
@serghein845
@serghein845 4 года назад
можно узнать почему такие великие учителя, которые преподают курсы, и делают из людей гуру программирования, не делают свои успешные проекты? или не работают над большими крутыми проектами? Мне просто интересно! p.s. Не знаю ни одного крутого прогера, который думал бы учить людей программированию, потому, что у него нет времени и он зазнавшийся дятел (ну обычно так).
@rsakutin
@rsakutin 4 года назад
Не знаю ни одного крутого программиста который не вёл бы блог, не писал бы книги или не снимал на RU-vid
@serghein845
@serghein845 4 года назад
​@@rsakutin если так судить, то хороших прогеров очень мало, так как я не видел много документаций или уроков доступных о паттернах программирования, отличае с# от f#! или же в крутых компаниях, которые на удивление выпускают крутые игры или софт, все пишут статьи ) Я не говорю о гугл разработчиках или фейсбук, которые сидят в долинке, и чтобы продвинуться по карьерной лестнице пишут диссертации, лишь для того, чтобы их заметили в той гуще крутых прогеров, которая их окружает. p.s. Но вы ведь не статейки пишете, а преподаёте, что забирает уверен кучу времени, чтобы из обычного пользователя компа сделать их гуру программирования. Этио же не за вечер и не за неделю сел и написал статейку )
@rsakutin
@rsakutin 4 года назад
@@serghein845 Вы не смогли найти кучу материала по паттернам и отличию C# и F#? У вас инвалидность?
@rsakutin
@rsakutin 4 года назад
@@serghein845 3600 - это цена курса в рублях. Вы говорить любите а думать и читать нет. :(
@serghein845
@serghein845 4 года назад
@@rsakutin ну тогда пишите нормально, чтобы и читалось доступно и понятно! Потому, как "курс с нуля до результата с 3600 в месяц" - это не одно и тоже, как например "курс за 3600 в месяц - с нуля до результата " или хотя бы "курс с нуля до результата за 3600 в месяц". Поэтому я и задал основной вопрос, так как понял совсем другое!
@Dadadadam999
@Dadadadam999 3 года назад
Кстати ту наверное уже писали, но все объявленные экземпляры класса Random, должны быть статичными, иначе рандом будет выдавать каждый раз последовательные числа. Это связано со спецификой его реализации.)
@isildurgir
@isildurgir 4 года назад
С "рандомайзиром" тоже перебор, можно так как Вы говорите, да это более случайно, но можно и так как в там было. Комментарий с тестами рандомом, - так наоборот тестить нужно действительно случайным образом, а не псевдо, а если говнотестить, тогда да можно и так.
@ЯнГус-х7д
@ЯнГус-х7д 4 года назад
Гавнокод (помню из старых твоих обзорах на unity3d курсы): Нашел ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-FcWHAvyovRs.html Что-то такое вроде было 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; }
@mrkvchch
@mrkvchch 4 года назад
А whitelist же будет создаваться на каждый вызов метода? Если так, то в итоге получилось медленнее (наверное, не измерял) чем было, надо было в статическую переменную засунуть? Ну и в принципе не особо понял наезд на этот кусочек, единственное, что было прям плохо - создание новый строки на каждую итерацию цикла и пихание алфавита прям в тело функции.
@rsakutin
@rsakutin 4 года назад
Да, это важный момент который я забыл упомянуть. Белый список надо кешировать
@ARTUT
@ARTUT 4 года назад
0:00 Camtasia 9?
@sudormrfall
@sudormrfall 4 года назад
Не могу понять от видео к видео, я джун или мастер...
@mrmatrix228
@mrmatrix228 4 года назад
4:37 сравниваем булевую переменную. ОК
@lancwork
@lancwork 4 года назад
сравнение с false более читаемое чем отрицание
@ЕгорДемьяненко-щ6о
Не знаю как у вас, но у меня триггер на «!». Сразу норм читается, особенно если булевые переменные сразу называть трушными названиями или с приставкой “Is”
@ПоповичукРостислав
Такие примеры вселяют мне уверенность что я уже всё таки не джун)
@7453060
@7453060 4 года назад
Почему "on" "off" не enum?
@LordZiegfrid
@LordZiegfrid 4 года назад
Потому что это строки.
@Sagrell94
@Sagrell94 4 года назад
@@LordZiegfrid +, господи челы настолько Васьки) Это парсинг строки, ало. Какой enum? Или ты предлагаешь спарсить "on" "off" в enum, чтоб потом перевести в bool?
@Dadadadam999
@Dadadadam999 3 года назад
Тут скорее вопрос, кто вообще хранит двухзначное значение в виде строки. =Д Как бы не проще ли в конфиге хранить сразу же, bool переменную, чем потом писать такую вот дичь.)
@isildurgir
@isildurgir 4 года назад
В первом примере интересная Ваша логика. В коде четко же написано, что если не "on" только тогда false. То есть в принципе пофиг что там кто то вводит что угодно даже yes, всегда будет false. Да конечно там нет эксепшин, но разве это ответственность этого метода, пусть тот кто передает в метод значение и занимается его обработкой. Это же синглреспонсибилити в прямом действии. Как такого можно не знать. Согласен если б это действительно была программа для какой то банковской системы безопасности, там где эксепшин на эксепшине сидит и нужно все обрабатывать, но для игр это перебор и полный бред.
@СергейИванов-ы7ч5ы
Очередное не знание матчасти: if (value == "on") return true else bla-bla-bla - натуральный говнокод вместо одной строчки
@sashayakimov6
@sashayakimov6 3 года назад
Здравствуйте, сколько стоит сейчас курс?
@nikolay-5074
@nikolay-5074 4 года назад
Отличный пример, но легче весь код просто удалить так как он не преследует никакой цели и не нужен.
@melonplayground5975
@melonplayground5975 4 года назад
в первом примере как я понял value должно иметь только on или off, так почему бы string не заменить на enum ?
@rsakutin
@rsakutin 4 года назад
Строка приходить из конфигурации строковой
@qwertyqwertyi620
@qwertyqwertyi620 4 года назад
Жду код ревью YandereDev'a...
@sh_nero
@sh_nero 4 года назад
В С# такой стиль писать "condition == false" вместо "!condition"?
@your-salmon
@your-salmon 4 года назад
Сакутин говорил, что восклицательный знак легко не заметить.
@jz4887
@jz4887 4 года назад
@@your-salmon ну, его, наверное, не заметит только в шары долбящийся.
@jz4887
@jz4887 4 года назад
Нет, это не стиль такой. Вот сам не понимаю зачем этот позор с "== false" писать.
@lunarlife7850
@lunarlife7850 4 года назад
@@jz4887 Для нормальной читабельности
@jz4887
@jz4887 4 года назад
@@lunarlife7850 код отлично и без этого читается
@MrJloa
@MrJloa 3 года назад
Плять, 2021 год, пароли из ascii символов... Для адептов кодировок отличных от utf8 в аду отдельный котёл с бесами. Вообще за такое административку давать надо.
@nikolainikk3916
@nikolainikk3916 3 года назад
3:07 по-моему, это тоже говнокод. Поправьте, если не прав. Ты эксепшн кидаешь и юзаешь зачем-то new? Зачем тебе тут понадобилось вообще динамическое выделение памяти?
@TedFanat
@TedFanat 3 года назад
Ору) Это С#, a не С++))
@nikolainikk3916
@nikolainikk3916 3 года назад
@@TedFanat всё, извиняюсь) спасибо что поправили)
@avocadocoder185
@avocadocoder185 4 года назад
Гоблин в мире C#
@debez3716
@debez3716 4 года назад
ахахах
@purplep3466
@purplep3466 4 года назад
блин, Роме нужно похожий голос еще сделать
@Diyozen
@Diyozen 4 года назад
Я Вас категорически приветствую. Этот код - тупое говно тупого говна. Говнополя и говнометоды с говноаргументами для отсталых дебилов. Дети, не пишите говно тупого говна. А на сегодня всё, до новых встреч.
@sergeykarpov4683
@sergeykarpov4683 4 года назад
Интересно услышать мнение о курсе ITVDN "ASP .Net Core Developer", стоит ли использовать данный ресурс для изучения функционала C# языка? P.s. Отлично отфильтрована информация, только не переходите на "умирающий бас", неприятно разбирать слова.
@rsakutin
@rsakutin 4 года назад
Уже есть на канале
@Roman_SBB
@Roman_SBB 4 года назад
Что-то БОРИС ссылку на почту не присылает
@That-Is-All-Hat
@That-Is-All-Hat 4 года назад
Только у Ромы Сакутина качественный код, а у всех остальных - говно. Покупайте курсы Ромы Сакутина.
@kirillbukato4164
@kirillbukato4164 4 года назад
Прошу прощения, а как этот ваш c# в плане секса, А? М?
@dmitriiyokohamaman8523
@dmitriiyokohamaman8523 4 года назад
Роман приветствую. Весь прикол в том, что в "продакшене" на начальном этапе обычно "пофигу", какой код, "лиж-бы" работало и отправляло вменяемые тексты ошибок, если что. А уже когда проект раскрутится, тогда уже можно и код переписывать потихоньку. Например: "Капатели онлайн" игра своего времени по сути и тут главное вовремя выпустить её.
@rsakutin
@rsakutin 4 года назад
Какой опыт программирования у вас? Какие комании? Какие проекты?
@dmitriiyokohamaman8523
@dmitriiyokohamaman8523 4 года назад
Я нигде не работал по профессии программист.
@rsakutin
@rsakutin 4 года назад
@@dmitriiyokohamaman8523 А что подпездываете тогда во втором видео уже?
@dmitriiyokohamaman8523
@dmitriiyokohamaman8523 4 года назад
в@@rsakutin Не "подп-здываю", а "По Царски" комментирую. Что бы у Вас больше просмотров было.
@rsakutin
@rsakutin 4 года назад
@@dmitriiyokohamaman8523 спасибо!)
@ДмитрийАсеров
@ДмитрийАсеров 3 года назад
Сакутин где увидеть твой гитхаб?
@hewston2733
@hewston2733 4 года назад
Вообще это из С++, но вдруг кому-то захочется в этом поковыряться, писал от скуки на паре: 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 4 года назад
Выводит среднее арифметическое числового массива (наверное)
@ZEkA10000
@ZEkA10000 4 года назад
Ты обозреваешь любой код или целенаправленно выбираешь код написанный на яп С#?
@intivi5277
@intivi5277 4 года назад
Он проталкивает свои говнокурсы поэтому щедро набрасывает на вентилятор.
@АртурЛитвиненко-я6м
Как ты относишься к антипатерну Softcode ?
@pirnogion
@pirnogion 4 года назад
Я называю это жидкий код, ибо протекает во все щели.
@giawsuy4781
@giawsuy4781 4 года назад
У меня есть еще один вариант получения алфавита: List Alphabet = new List(Enumerable.Range('A', 'Z' - 'A' + 1).Select(c => (char)c).ToList());
@ИмяФамилия-у9щ2п
@ИмяФамилия-у9щ2п 3 года назад
Уникальнейший полезный контент! Прямо таки уникальный в своей нише. Продолжай творить!
@dizzyark9221
@dizzyark9221 4 года назад
Роман что то у вас с сайтом. Пытался записаться но... Видимо что то случилось, да. Регистрация не работает!
@araslanrus
@araslanrus 3 года назад
Видимо говнокод на сайте не позволяет
@darkhorse2219
@darkhorse2219 4 года назад
Можешь конструктивно раскритиковать мой не дописанный говнокод на данном этапе ? 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); } } } } }
@Bond007in
@Bond007in 4 года назад
Если "из популярной игры" может не "обосрались".
@selim5772
@selim5772 4 года назад
А что за игра?
@Wansery
@Wansery 8 месяцев назад
3:05 это тоже говнокод какой-то. Зачем нам вообще нужно парсить строку в бул, если мы точно знаем, что on это true, а off это false? Почему сразу не передавать бул? Если уж на то пошло, то можно просто сделать switch case (хз какой аналог на шарпах) нет кучи дополнительных условий и защита от ошибок. А так, ты просто обернул говнокод в шапку из говна, ещё не забыв свои говнокурсы прорекламировать
@ТеньМориарти
@ТеньМориарти 4 года назад
Мда, почему это говно вылетает по рекомендациям....
@BashkaMen
@BashkaMen 4 года назад
Валидация в конфиге, ммммм
@xezdx
@xezdx 4 года назад
Нафиг такие сложности с генерацией? Псевдокод: pwd=md5(random()).substring(...) - сколько нужно вплоть до 32 символов. И вообще такие пароли фиг запомнишь даже 6 символов. Лучше делать пароли из пары обычных слов типа "каша-малаша" - подбирать рандомом дольше, а запомнить легче.
@GameDevTutorials2023
@GameDevTutorials2023 4 года назад
Я бы глянул обзор кода канала Sharp Accent
@levrisfirst3291
@levrisfirst3291 4 года назад
Самое смешное, что раз так автор разбирается в говне, то скорее всего сам такое же говно и пишет :)
@50z10p47
@50z10p47 4 года назад
Опыт - сын ошибок трудных
@znsoft
@znsoft 4 года назад
Не скорее всего, а точно пишет. Он даже в этом ролике показал свой говнокод. Его испражвления не лучше
@russianempiremapper408
@russianempiremapper408 4 года назад
что за игра
@nikolay-5074
@nikolay-5074 4 года назад
Кликер Clickbayter.
@eloreneloreneloreneloreneloren
@eloreneloreneloreneloreneloren 4 года назад
4:53
@darkstormheute
@darkstormheute 4 года назад
А нельзя было написать: if (value == "on") return true else if (value == "off") return false else throw new ArgumentException("...") ?
@hitaciry258
@hitaciry258 4 года назад
а еще можно без else
@darkstormheute
@darkstormheute 4 года назад
@@hitaciry258 нет, была-бы ошибка
@kirillsviderski4739
@kirillsviderski4739 4 года назад
@@darkstormheute else реально не нужен тут
@darkstormheute
@darkstormheute 4 года назад
@@kirillsviderski4739 а да, затупил
@intivi5277
@intivi5277 4 года назад
Можно и нужно так как вы предложили. Только без else. Не берите в голову примеры быдлооптимизации из видео.
@sergeyfirsov9100
@sergeyfirsov9100 3 года назад
Твой то код где ?
@ВладиславМоскалев-щ5ш
Посмотри Yandere Dev Code. Там контента на долго хватит) 4069 строк кода............
@FloatingGames
@FloatingGames 4 года назад
А в чем прикол? Я просто не в теме)) расскажи
@ВладиславМоскалев-щ5ш
@@FloatingGames у него там весь код состоит из if/else.. И это 4069 строк занимает в скрипте. Видео на ютубе посмотри, угарнешь.
@biohazardmars
@biohazardmars 3 года назад
Зделай обзор на ютуб программиста Simple Code у него полезные.
@despasus
@despasus 4 года назад
Очень прикольный контент, жаль только, что он ограничивается сишарпом и гейдевом
@-boiadeiro-
@-boiadeiro- 4 года назад
а у вас разве нет другой либы для "настоящего" рандома? *мимо-не-сишарпер*
@Yangoira
@Yangoira 4 года назад
Нихуя не понятно, но очень интеречно
@adiks09
@adiks09 4 года назад
Те кто писал про yandere, спасибо, я ослеп
@khudoyorkhonmirjalolov3006
@khudoyorkhonmirjalolov3006 4 года назад
готов в разносу своего кода 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; } } } }
@kyv1r
@kyv1r 4 года назад
Все классно, но можешь говорить чуть громче пожалуйста?
@nikemoscow8881
@nikemoscow8881 3 года назад
Если не on то false. Ну и в чем баг? Некорректно? - да, но не будет бага.
@Dadadadam999
@Dadadadam999 3 года назад
Вполне может быть. Скорее зависит от того, какая реализация на основе этого флага будет создана. Если от значения off будет зависеть, выполнение каких, либо условий, то могут полезть баги, если например конфиг криво спарсится. Однако это не критично и проблема быстро находится через дебагер. Тут в целом проблема, что очевидно булева переменная в конфиге описана при помощи стрингов.
@serjlemast
@serjlemast 4 года назад
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!
@serjlemast
@serjlemast 4 года назад
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); } }
@gachigazm6169
@gachigazm6169 4 года назад
Зачем так голос искажаешь? Типу фишка такая? Бывает не оч приятный такой асмр
@rsakutin
@rsakutin 4 года назад
У меня бронхит :(
@Nag1ss
@Nag1ss 4 года назад
Да ты за.. надоел обсирать Гошу в первую очередь.
@oleksandrlysiuk3971
@oleksandrlysiuk3971 4 года назад
Nagisa так Гоша реально говнокодит)
@oleksandrlysiuk3971
@oleksandrlysiuk3971 4 года назад
Блин , я фронт разраб, и смотрю это, зачем?))
@cheburek5116
@cheburek5116 4 года назад
А я вообще не кодер, но смотрю
@calchome2768
@calchome2768 4 года назад
Да нахрен надо так писать... Через 3 мес забудете про сложности, которыми напичкали код... И поддерживать его станет гораздо сложнее... В общем Гоша дударь лучший! Лучше говнистей, но понятнее!
@iamdan8203
@iamdan8203 4 года назад
Кто бы ни читал этот комментарий, знай, что *ГОСПОДЬ ИИСУС ХРИСТОС ЛЮБИТ ТЕБЯ!* Whoever reads this comment, know that *LORD JESUS CHRIST LOVES YOU!*
@CidKagenouS
@CidKagenouS 4 года назад
Оооода
@asddsaasddsaasddsaasddsa
@asddsaasddsaasddsaasddsa 4 года назад
Я, наверно, открою Америку, но на юнити игры делают не программисты и им до качества кода совершенно нет дела.
@FloatingGames
@FloatingGames 4 года назад
Почему ты так думаешь?
@LordHellas
@LordHellas 4 года назад
Как же тяжело вас слушать... Представляю такую подачу материала на ваших курсах.
@ЯнГус-х7д
@ЯнГус-х7д 4 года назад
он не преподает, там другой препод
@rsakutin
@rsakutin 4 года назад
@@ЯнГус-х7д Я преподаю, и на мои лекции отзывы что сложно слушать
@50z10p47
@50z10p47 4 года назад
@@rsakutin no pain - no gain хули
@user-wl5hd3yf9w
@user-wl5hd3yf9w 4 года назад
Еба весь ролик реклама своих курсов
@nurlanakylbekov7266
@nurlanakylbekov7266 4 года назад
#1
@ЯрославВальчишен
@ЯрославВальчишен 4 года назад
Можешь обозреть код yanderedeva?)))
Далее