Инвариант в программировании

  Рет қаралды 26,832

S0ER

3 жыл бұрын

#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwareengineervlog
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/id/5f578bdf22e26e081a67cfd2
GitHub - github.com/soerdev
Чат для программистов - discord.gg/3UVJWAs
Группа ВК - codeartblog

Пікірлер: 138
@fazleev
@fazleev 3 жыл бұрын
Слушаю перед сном, пока что ни разу не добрался и до середины - вырубает отменно )
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Хоть какая-то польза от этих видосов
@ruslanshikhaliev9341
@ruslanshikhaliev9341 2 жыл бұрын
спим в учении Андрейка, не спим в бою (на проде)
@lalivirtei
@lalivirtei 10 ай бұрын
Очень спокойно и уютно стало во время просмотра. Конец тяжёлой недели и от кода уже воротит, но сейчас, на середине видео, снова захотелось работать. Спасибо. Цветовая гамма видео, отлично подобрана. Особенно контраст ламп и рубашки. Приятно смотреть.
@user-lc6yf8rz6k
@user-lc6yf8rz6k 3 жыл бұрын
Как же не хватате хорошего такого курса лекций от этого товарища от начала и до..
@an2anSz
@an2anSz 3 жыл бұрын
Спасибо за труд!
@resetand
@resetand 3 жыл бұрын
Как на счет видео про машину тьюринга?)
@MrJloa
@MrJloa 3 жыл бұрын
Оригинальное объяснение. Весьма хорошо вышло.
@phil2964
@phil2964 3 жыл бұрын
спасибо за контент и отдельное что без политики
@user-vu6hn4ul2i
@user-vu6hn4ul2i 3 жыл бұрын
Сам попросил, в Беларуси Лукашенку как раз проверяют на инвариант.
@user-gt7rz5uw5z
@user-gt7rz5uw5z 3 жыл бұрын
Спасибо.
@veeronten4886
@veeronten4886 3 жыл бұрын
Спасибо за видосик. Очень хотелось бы посмотреть в твоём исполнении пример использования инвариантов, безотносительно слабой типизации.
@user-if7mu6fe3h
@user-if7mu6fe3h 3 жыл бұрын
все тоже самое, только с проверкой что значение в теге >=0
@RichardGraveman
@RichardGraveman 5 ай бұрын
спасибо!
@prinimaushaya_storona
@prinimaushaya_storona 8 ай бұрын
Спасибо за контент! Думаю что часть комментаторов, которым это не понятно, не стоит того, чтобы терять ту часть, что это с удовольствием смотрит.
@user-gt7rz5uw5z
@user-gt7rz5uw5z 3 жыл бұрын
Какая хорошая подача. Как это писать перед собой? Тоже спонсорский вопрос?
@MIXEL3D3
@MIXEL3D3 3 жыл бұрын
Спасибо мистер)
@alfobarasovich55
@alfobarasovich55 2 жыл бұрын
Один из самых ДУШЕВНЫХ каналов о программировании
@nikolaik.6344
@nikolaik.6344 3 жыл бұрын
Что за Boilerplate с пуговицами сверху?
@sergeyvoitenko8978
@sergeyvoitenko8978 3 жыл бұрын
Инвариант совсем по простому - это то, что остается постоянным, инвариантным. Например, в Ньютоновской физике расстояние между точками пространства остается постоянным. В теории относительности Эйнштейна же постулируется, что пространство и время уже не существуют по отдельности, поэтому инвариантом становится некий пространственно-временной промежуток, который называется интервалом в пространстве Минковского.
@mikekushchenko5855
@mikekushchenko5855 3 жыл бұрын
Дед ты меня радуешь по пятницам
@xabikiqwe
@xabikiqwe 3 жыл бұрын
В MS Visual C++ когда объявляешь тип структуры и добавляешь внутрь метод, метод автоматом добавляется с подчёркиванием. Это связано с ответственностью?
@ufocoder
@ufocoder 3 жыл бұрын
10:45 Оговорка/ошибка в сравнении слабой и сильной типизации? Ведь в ответе подразумевается динамическая и статическая
@druidushkadruid7569
@druidushkadruid7569 3 жыл бұрын
не так всё просто, динамическая типизация сама по себе не так опасна. Например в го после определения типа с ним нельзя произвести действия несвойственные типу, а в js можно, тип может быть преобразован неявно
@Mike-hp3fh
@Mike-hp3fh 3 жыл бұрын
Я использую инварианты в тестировании, только я не знал что такое инварианты.
@MbwiruEikura
@MbwiruEikura 3 жыл бұрын
Тройки Хоара, контрактное программирование, инварианты - почти синонимы?
@chu_ri5470
@chu_ri5470 3 жыл бұрын
Чуть дополню. 6:20 - важно заметить, что M' должны быть как можно меньше. То есть функция в 200+ строк в начале которой и в конце одни и те же переменные отображают разные множества это плохая практика. Её крайне сложно верифицировать. Хотя всегда можно ввести новые инварианты для доказательства соблюдения инвариантности вышестоящего блока, лучше делать это в локальных областях с новыми переменными. Что хорошее направление для рефакторинга и повод смотреть в сторону декларатива и чистых функций. + инвариант составляет тот кто верифицирует код и может быть задан любыми целесообразными логическими условиями. В том числе даже теми которые вы не можете легко проверить в коде.
@nekosora6036
@nekosora6036 3 жыл бұрын
Так для чего нужно каррирование то?
@klmbk8187
@klmbk8187 3 жыл бұрын
😂😂
@isopp7744
@isopp7744 3 жыл бұрын
Когда я интересовался меня послали в исходники фреймворков и что то там про lodash, но живых примеров так и не привели.
@viss23
@viss23 3 жыл бұрын
На собесах могут спросить, хех
@user-ey5xw2nx9s
@user-ey5xw2nx9s 3 жыл бұрын
@@viss23 Ахахах
@isopp7744
@isopp7744 3 жыл бұрын
@@viss23 И потом так - фуфуфу, ты не знаешь за каррирование, фуфуфу пративный... А ты такой, "извините я вам не подхожу, я привык работать в гетеросексуальных коллективах".
@user-gt7rz5uw5z
@user-gt7rz5uw5z 3 жыл бұрын
Скажите, можно узнать. Что Вы имели в виду у JS слабая типизация? Спасибо. Это же у Pithon?
@user-dv9fk1hd3s
@user-dv9fk1hd3s 3 жыл бұрын
Не путайте динамическую типизацию и слабую. У JS динамическая слабая, у Python динамическая сильная. JS позволит сложить 1 и "1", Python сразу выбросит TypeError, потому как можно сложить число с числом и строку со строкой (конкатенация), но разные типы так применять нельзя. В языках с динамической типизацией тип переменной может меняться в процессе, например в одной строке мы можем сделать x = 1, а далее x = "Hello, world". В языках со статической типизацией, если мы определили переменную как int x = 1, то далее мы можем менять её значение, но не тип - эта переменная только под целые числа.
@user-gt7rz5uw5z
@user-gt7rz5uw5z 3 жыл бұрын
@@user-dv9fk1hd3s типизации как то смешаны. У Pithon и JS динамическая типизация. А другие о чем обьясняются. Сережа.
@user-hd6bu8zn2j
@user-hd6bu8zn2j 3 жыл бұрын
Ну рычагом, можно не только повысить, но и ослабить усилие - нарастив скорость (ну или траекторию,путь) 🙂.
@khodyrevds
@khodyrevds 3 жыл бұрын
Как раз математическое определение предельно понятно, это я как математик говорю.
@ievgenk.8991
@ievgenk.8991 3 жыл бұрын
И что теперь?
@AlexYaroshevich
@AlexYaroshevich 3 жыл бұрын
Лучше посмотрим непонятное определение на 19 минут)
@0xgur0xverflow59
@0xgur0xverflow59 3 жыл бұрын
Го про конечные автоматы
@user-zg4dv7xf6t
@user-zg4dv7xf6t 3 жыл бұрын
Ну наверное, неудачный пример с этой валидацией типа. Наверное лучше бы зашло, если бы о корректном состоянии объекта как инварианте ( а методы которые его делают некорректным). И тут не идёт речи о том, что написать ассерт во всех методах, которые модифицируют его. Речь о том, что не должно быть в системе методов или операций, которые могут сделать его невалидным ( когда он будет в некорректном состоянии). Ещё, наверное неплохой пример, но непростой, рекурсивные функции - на каждом шаге должны выполняться определённые условия, тогда и результирующее значение будет им удовлетворять.
@andyvoice
@andyvoice 3 жыл бұрын
Пример сложноватый, переслушивал практическую часть, переписал код. И только тогда понял, спасибо.
@SemenAlexndrovich
@SemenAlexndrovich 3 жыл бұрын
кто-нибудь считал сколько раз произносится слово "инвариант" ?
@AlexYaroshevich
@AlexYaroshevich 3 жыл бұрын
А каррирование здесь при чем?
@igordmitrow2815
@igordmitrow2815 3 жыл бұрын
Так инкапсуляция это сокритие данных?
@InSimpleWords_WebDev
@InSimpleWords_WebDev 3 жыл бұрын
Инкапсуляция - это скорее больше адекватное моделирование сущности. "Вы в капсулу заключаете сущность". Например, берете страшилу из "страны ОЗ". Его модель - это соломенные опилки, костюм пугала, прихрамывающая походка. Если вы припишите ему сердце железного человека, или умение прыгать как тигр, или родителей главной героини - вы нарушите инкапсуляцию этого страшилы. Сокрытие данных - это вторичный вопрос инкапсуляции. Например, мозги лучше спрять в голову, а костюм пугала лучше оставить видным всему честному народу. Так что соединение данных и методов для их обработки в осмысленную единую сущность - это и называют инкапсуляцией.
@vladkolesnik2274
@vladkolesnik2274 3 жыл бұрын
@@InSimpleWords_WebDev круто разложил
@InSimpleWords_WebDev
@InSimpleWords_WebDev 3 жыл бұрын
@@vladkolesnik2274 Спасибо.
@lambdaway
@lambdaway 3 жыл бұрын
Инкапсуляция это когда тебя хотят накормить через ж* , а ты падаешь и кричишь, что у тебя для этого есть рот)
@dann1kid
@dann1kid 3 жыл бұрын
короч, на питоне это "ассерт" для тестирования. Есть три подмодуля - входные данные, функция изменения, выходные данные. Есть вход на данные (что проверяется) и есть выход(тоже проверяются). Если данные ок, то функция работает крутится меняет считает. Если выход ок, то исключения не вызываются и данные допускаются для передачи. Пример: число фибонначи. 1) вход (чекаем тип данных) (ивариант типа данных) 2) функция делает вычисления. 3) сверяется с рядом фибонначи. (инвариант принадлежности)
@dalerkhalilov9440
@dalerkhalilov9440 3 жыл бұрын
Mozg 💪
@chu_ri5470
@chu_ri5470 3 жыл бұрын
Мне больше нравится такой пример, без лишних абстракций: количествоПосчитанныхСтудентов = 0 for человекВАудитории in всеЛюдиВАудитории: ___if(этоСтудент(человекВАудитории)) ________количествоПосчитанныхСтудентов+=1 Здесь инвариант, это "переменная количествоПосчитанныхСтудентов всегда содержит количество посчитанных студентов".
@iNemoden
@iNemoden 3 жыл бұрын
Инвариант это не unit-тестирование и не assert в python. Инвариант - это проверка консистентности модуля, а не правильности работы алгоритмов/валидации входных/выходных данных методов. Пример: метод может быть инвариантен, но для него можно определить ассерты входных/выходных данных и тогда это просто обычное юнит-тестирование.
@dann1kid
@dann1kid 3 жыл бұрын
@@iNemoden А если консистенция проверяется таким тестированием на входные и выходные данные? Здесь тоже достигается инвариантность. Так или иначе это абстракция, а каким образом она достигнута - это удел инженерной мысли
@iNemoden
@iNemoden 3 жыл бұрын
@@dann1kid конечно, это в принципе как любое многообразие. Если то же самое достигается иными методами у этих методов будут преимущества и недостатки и программист или команда может решить что именно использовать, но для того чтобы понимать что использовать нужно знать о разных подходах и их плюсах и минусах чтобы понять какие плюсы и минусы перевешивают. Я сам инварианты использовал в своей 13-летней практике по пальцам пересчитать сколько раз, но если бы я не знал что это, у меня бы не было возможности их применить. Я бы сказал что знание того что такое инвариант это как знание основных алгоритмов сортировки - очень редко нужно реализовать, но знать нужно обязательно потому что когда-нибудь может пригодиться.
@user-ks8zk9dn3s
@user-ks8zk9dn3s 3 жыл бұрын
у Вас кабель от микрофона перетянут)
@kirillsviderski4739
@kirillsviderski4739 3 жыл бұрын
Очень сложное объяснение. Почему бы просто не показать пример с законом Ома, например?) Типо, нужно симулировать электрическую сеть. Тогда для каждого элемента должен соблюдаться инвариант. А значит, поля U, I, R надо спрятать под абстракцию правильно написанных сеттеров, что бы при изменении сохранялся инвариант
@0imax
@0imax 3 жыл бұрын
Закон Ома знаю, программировать умею (и под железо, и под десктоп), но из объяснения ни хрена не понял :)
@user-pg8ry1tm3t
@user-pg8ry1tm3t 3 жыл бұрын
К примеру, в контрактном программировании инвариант - это контракт
@suryaninov
@suryaninov Жыл бұрын
Стоп, это всё конечно интересно, но зачем нужны 4 пуговицы подряд в одном месте на рубашке ?..
@vovanchik_ru4208
@vovanchik_ru4208 3 жыл бұрын
дык вот для чего придумали этот странный javascript.... В строготипизированном языке об инварианте практически не думаешь, т.к. некуда деться из подводной лодки. А в js конечно всё прекрасно, сладко аж засахариваешься, но только до тех пор пока не захочешь сделать всё правильно :) А когда ума набираешься и хочешь дальше программировать на js, то приходится контролировать инвариантность, ну или строго замарочиться typescript-ом :) Ну вот если бы не js, то когда бы я бы ещё узнал о инвариантах...? :)
@mojeimja
@mojeimja 3 жыл бұрын
JS как всегда 0+_k чтобы принудить к численному типу. 2+2=22
@user-if7mu6fe3h
@user-if7mu6fe3h 3 жыл бұрын
может быть не очень удачный пример у автора? поискал тэг - не нашел его и ничего не сделал, тем самым спрятал проблему вызывающего кода имхо.
@isopp7744
@isopp7744 3 жыл бұрын
Инвариант = in variant( внутри вариантов). Инвариант в программировании - техника, реализованная в виде оболочки, которая позволяет проверить, что "что-то" точно соответствует "чему-то". Так?
@user-ey5xw2nx9s
@user-ey5xw2nx9s 3 жыл бұрын
Типо hash-табоица в js?
@isopp7744
@isopp7744 3 жыл бұрын
@@user-ey5xw2nx9s Да я сам поинтересовался, но hash-таблица - это вроде бы структура данных, разве нет? Он же тут некоторую проверку "чего-то" на "что-то" - условно "оборачивает" функцией.
@user-ey5xw2nx9s
@user-ey5xw2nx9s 3 жыл бұрын
@@isopp7744 А, спасибо!
@user-ey5xw2nx9s
@user-ey5xw2nx9s 3 жыл бұрын
@@isopp7744 Да, это структура данных
@user-ey5xw2nx9s
@user-ey5xw2nx9s 3 жыл бұрын
Я думал, что Инвариант = invariant(не вариативный, т.е. нет изменений в системе)
@user-cp2nh9tf1x
@user-cp2nh9tf1x 3 жыл бұрын
_Я чё-то наверное, не понял из слов автора. Насколько я вижу, автор НЕ использует здесь особую "фишку" инварианта (или у меня есть предположение, что сам автор чё-то в этой теме недопонимает). Т. е., он мог бы озаглавить видео "предусловие и постусловие", и ничего по сути в логике на видео не поменялось бы (даже если бы предусловие и постусловие отличались)._ _А вот ИНВАРИАНТ (т. е., когда предусловие и постусловие одинаковые) полезен для доказательства правильности циклических (итеративных) конструкций в коде: например, циклов, рекурсивных вызовов подпрограмм (функций). Там фишка в том, что ты доказываешь, что однократное (любое) выполнение цикла (или вызова рекурсии) не меняет инвариант -- и тогда доказано, что цикл работает правильно (если доказана его завершимость). Плюс от инварианта, что (как правило) это доказывать проще. В противном случае (если инвариант найти не удаётся), то придётся доказывать по мат.индукции (что муторно) или каким-то другим способом._ ____________________ _П.С. Доказывать алгоритмы это чисто теория. Не спрашивайте меня, кому это на практике это надо. Никому это на практике не надо! Никто этим не занимается при программировании, не забивайте себе голову._
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Для начала погугли "инвариант классов (типов)", "программирование по контракту". В остальном ты просто рассказываешь про "инвариант циклов", что не является единственным применением инварианта.
@antonschneider4213
@antonschneider4213 3 жыл бұрын
никому??? не все могут себе позволить г**окодить
@user-jo3qr1ug6e
@user-jo3qr1ug6e 2 жыл бұрын
Я вот щас недавно, Кнута пытался осилить, после алгоритма Евклида, потом идёт математическая индукция, так вот инвариантность, это и есть некоторая аналогия математической индукции или как понимать?
@user-jx4jb4of3c
@user-jx4jb4of3c 2 жыл бұрын
Может смени язык на типизированный. Легче объяснять будет
@Rybkinrolla
@Rybkinrolla 3 жыл бұрын
Я вот сижу и слабо представляю себе зачем мне могло бы это понадобиться. Повышать в разы сложность алгоритма различными проверками ради собственной дуракоустойчивости. Если пишешь методы по 200 строк, то возможно там и понадобится, но тогда, мне кажется, что проблему нужно решать с другой стороны. В любом случае, за теоретические знания СПАСИБО. В проверке на то, что сущность является тегом, ты сделал проверку на типы полей, но пропустил проверку, на то что сущность может содержать больше 2 полей.
@isting4741
@isting4741 3 жыл бұрын
"Повышать в разы сложность алгоритма ... ради собственной дуракоуйстойчивости" Все зависит от цены ошибки. Когда ты пишешь какой-нибудь пет-проект для личного пользования, то цена ошибки может стремиться к нулю и часто в таких проектах даже нет смысла писать тесты. В реальных рабочих проектах уже без тестов никуда и почти всегда можно легко проследить, как при эволюции проекта увеличивается тестовая база, потому что одна маленькая ошибка может стоить тысячи и сотни тысяч долларов, уже не говоря про имидж и лояльность клиентов. Ну а если же вы ракету на луну запускаете, то ошибка обойдется вам в миллиарды долларов, не говоря о том, что могут быть перечеркнуты несколько лет работы. Вот в таких случаях вам и понадобится, как минимум, контрактное программирование, а скорее всего ещё и дополнительные методы верификации программ, например, построение и верификация автомата исполнения программы.
@Rybkinrolla
@Rybkinrolla 3 жыл бұрын
@@isting4741 а я и не против тестов, в своих командах я устанавливаю минимальное покрытие в 85%. Но внедрять в бизнеслогику проверки со сложностями n*n, как по мне, абсолютно глупо.
@isting4741
@isting4741 3 жыл бұрын
@@Rybkinrolla вы правы, конечно, но все равно все зависит от того, что это за бизнес логика и сколько будет стоить необнаруженная ошибка. Если это, например, банковская бизнес логика, то вполне уместно прописать жёсткие конкратны в наиболее важных местах, например, в обработке транзакций, иначе к вам обратиться клиент, у которого со счета списался миллион, хотя он во время перевода нажал на кнопку "отменить" . Просто к этому, как и любой рабочей задаче, нужно подходить с трезвой головой и грамотно оценивать, какие ресурсы вы потратите и какой результат вы получите. Ну а в действительности - да, такого уровня контракты нужны в одном случае из тысячи
@Rybkinrolla
@Rybkinrolla 3 жыл бұрын
@@isting4741 так, а для чего тогда: CI, интеграционные и контракт тесты, если мы тестировать начнём внутри бизнеслогики?
@isting4741
@isting4741 3 жыл бұрын
@@Rybkinrolla тесты - это когда вы тестируете бизнес логику на конечном наборе данных, пусть этих тестов хоть по 100 на каждый метод, но это конечное и очень малое по сравнению с пространством входных данных количество проверяемых сценариев. Тестирование не даёт вам гарантий абсолютной работоспособности программы на любых входных, только на протестированных. А доказательство инвариантности - это по сути абсолютное аналитическое математическое доказательство корректности. Утрированный пример: вы можете написать 100 тестов на ваш бинпоиск и это не гарантирует, что не существует 101-го набора входных данных, на котором все сломается, а можете написать одно математическое step-by-step доказательство. Может мы с вами друг друга не понимаем? Я уточню, что под контрактным программированием я имею ввиду не показанные в видео рантайм ассерты (это дичь, нужная только для fail-fast), а полноценное математическое доказательство корректности, выраженное либо в коде, если позволяет язык (например, Idris), либо в виде отдельной письменной спецификации, на бумаге или комментариями над каждой строкой кода в формате: PRE, INV, POST
@ezekiel6515
@ezekiel6515 3 жыл бұрын
Сначала прочитал «Инвалид в программировании»
@AlexYaroshevich
@AlexYaroshevich 3 жыл бұрын
Соер: Вот тут мы проверки на типы навертели, потому что JS не умеет, но TS умеет, ну в нём другие были бы. Программисты: facepalm. Так покажи другие? 12:35 Мутируешь входные данные, показываешь плохой код 14:15 Вот почему не показать входные данные в виде запроса от пользователя, как в настоящих проектах? 15:25 Не надо выходить из vim, чтобы запустить программу :-( В целом, непонятно зачем нужно знать что именно вот это и есть инвариант. Его нельзя нарушать? И еще непонятно, если бы мы в TypeScript всё это делали, получается, было бы достаточно проверить на входе и выходе типы, скастовать, а всё остальное сделал бы компилятор, и такой пример был бы гораздо полезнее и понятнее, чем проверять типы в рантайме даже не используя стандартные библиотеки ассертов.
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
1. Так открой глаза и посмотри другие видео на канале 2. Использование ссылок - это не плохой код, подумай на досуге почему параметры не передаются только через копирование. 3. Потому что это учебный код 4. Ты не думал что в монтаже видео есть такая штука как "склейки" и они менее заметны когда есть общие кадры. Или проще - когда ты выходишь в шел, ты можешь поставить склейку и это будет очень органично. Хоть один нормальный вопрос будет?
@AlexYaroshevich
@AlexYaroshevich 3 жыл бұрын
@@S0ERDEVS только ты же не ответил, зачем вообще комментировал)
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
@Alexey Yarrr! ты меня поставил в тупик