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

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

Пікірлер: 138

  • @lalivirtei
    @lalivirtei9 ай бұрын

    Очень спокойно и уютно стало во время просмотра. Конец тяжёлой недели и от кода уже воротит, но сейчас, на середине видео, снова захотелось работать. Спасибо. Цветовая гамма видео, отлично подобрана. Особенно контраст ламп и рубашки. Приятно смотреть.

  • @fazleev
    @fazleev3 жыл бұрын

    Слушаю перед сном, пока что ни разу не добрался и до середины - вырубает отменно )

  • @S0ERDEVS

    @S0ERDEVS

    3 жыл бұрын

    Хоть какая-то польза от этих видосов

  • @ruslanshikhaliev9341

    @ruslanshikhaliev9341

    2 жыл бұрын

    спим в учении Андрейка, не спим в бою (на проде)

  • @user-lc6yf8rz6k
    @user-lc6yf8rz6k3 жыл бұрын

    Как же не хватате хорошего такого курса лекций от этого товарища от начала и до..

  • @resetand
    @resetand3 жыл бұрын

    Как на счет видео про машину тьюринга?)

  • @an2anSz
    @an2anSz3 жыл бұрын

    Спасибо за труд!

  • @veeronten4886
    @veeronten48863 жыл бұрын

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

  • @user-if7mu6fe3h

    @user-if7mu6fe3h

    3 жыл бұрын

    все тоже самое, только с проверкой что значение в теге >=0

  • @MrJloa
    @MrJloa3 жыл бұрын

    Оригинальное объяснение. Весьма хорошо вышло.

  • @phil2964
    @phil29643 жыл бұрын

    спасибо за контент и отдельное что без политики

  • @user-vu6hn4ul2i

    @user-vu6hn4ul2i

    3 жыл бұрын

    Сам попросил, в Беларуси Лукашенку как раз проверяют на инвариант.

  • @user-gt7rz5uw5z
    @user-gt7rz5uw5z3 жыл бұрын

    Какая хорошая подача. Как это писать перед собой? Тоже спонсорский вопрос?

  • @prinimaushaya_storona
    @prinimaushaya_storona7 ай бұрын

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

  • @sergeyvoitenko8978
    @sergeyvoitenko89783 жыл бұрын

    Инвариант совсем по простому - это то, что остается постоянным, инвариантным. Например, в Ньютоновской физике расстояние между точками пространства остается постоянным. В теории относительности Эйнштейна же постулируется, что пространство и время уже не существуют по отдельности, поэтому инвариантом становится некий пространственно-временной промежуток, который называется интервалом в пространстве Минковского.

  • @alfobarasovich55
    @alfobarasovich552 жыл бұрын

    Один из самых ДУШЕВНЫХ каналов о программировании

  • @user-gt7rz5uw5z
    @user-gt7rz5uw5z3 жыл бұрын

    Спасибо.

  • @RichardGraveman
    @RichardGraveman4 ай бұрын

    спасибо!

  • @nikolaik.6344
    @nikolaik.63443 жыл бұрын

    Что за Boilerplate с пуговицами сверху?

  • @xabikiqwe
    @xabikiqwe3 жыл бұрын

    В MS Visual C++ когда объявляешь тип структуры и добавляешь внутрь метод, метод автоматом добавляется с подчёркиванием. Это связано с ответственностью?

  • @MIXEL3D3
    @MIXEL3D33 жыл бұрын

    Спасибо мистер)

  • @chu_ri5470
    @chu_ri54703 жыл бұрын

    Чуть дополню. 6:20 - важно заметить, что M' должны быть как можно меньше. То есть функция в 200+ строк в начале которой и в конце одни и те же переменные отображают разные множества это плохая практика. Её крайне сложно верифицировать. Хотя всегда можно ввести новые инварианты для доказательства соблюдения инвариантности вышестоящего блока, лучше делать это в локальных областях с новыми переменными. Что хорошее направление для рефакторинга и повод смотреть в сторону декларатива и чистых функций. + инвариант составляет тот кто верифицирует код и может быть задан любыми целесообразными логическими условиями. В том числе даже теми которые вы не можете легко проверить в коде.

  • @MbwiruEikura
    @MbwiruEikura3 жыл бұрын

    Тройки Хоара, контрактное программирование, инварианты - почти синонимы?

  • @ufocoder
    @ufocoder3 жыл бұрын

    10:45 Оговорка/ошибка в сравнении слабой и сильной типизации? Ведь в ответе подразумевается динамическая и статическая

  • @druidushkadruid7569

    @druidushkadruid7569

    3 жыл бұрын

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

  • @nekosora6036
    @nekosora60363 жыл бұрын

    Так для чего нужно каррирование то?

  • @klmbk8187

    @klmbk8187

    3 жыл бұрын

    😂😂

  • @isopp7744

    @isopp7744

    3 жыл бұрын

    Когда я интересовался меня послали в исходники фреймворков и что то там про lodash, но живых примеров так и не привели.

  • @user-bk9kg1lt5e

    @user-bk9kg1lt5e

    3 жыл бұрын

    На собесах могут спросить, хех

  • @user-ey5xw2nx9s

    @user-ey5xw2nx9s

    3 жыл бұрын

    @@user-bk9kg1lt5e Ахахах

  • @isopp7744

    @isopp7744

    3 жыл бұрын

    @@user-bk9kg1lt5e И потом так - фуфуфу, ты не знаешь за каррирование, фуфуфу пративный... А ты такой, "извините я вам не подхожу, я привык работать в гетеросексуальных коллективах".

  • @Mike-hp3fh
    @Mike-hp3fh3 жыл бұрын

    Я использую инварианты в тестировании, только я не знал что такое инварианты.

  • @khodyrevds
    @khodyrevds3 жыл бұрын

    Как раз математическое определение предельно понятно, это я как математик говорю.

  • @ievgenk.8991

    @ievgenk.8991

    3 жыл бұрын

    И что теперь?

  • @AlexYaroshevich

    @AlexYaroshevich

    3 жыл бұрын

    Лучше посмотрим непонятное определение на 19 минут)

  • @mikekushchenko5855
    @mikekushchenko58553 жыл бұрын

    Дед ты меня радуешь по пятницам

  • @user-zg4dv7xf6t
    @user-zg4dv7xf6t3 жыл бұрын

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

  • @user-gt7rz5uw5z
    @user-gt7rz5uw5z3 жыл бұрын

    Скажите, можно узнать. Что Вы имели в виду у 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-hd6bu8zn2j3 жыл бұрын

    Ну рычагом, можно не только повысить, но и ослабить усилие - нарастив скорость (ну или траекторию,путь) 🙂.

  • @0xgur0xverflow59
    @0xgur0xverflow593 жыл бұрын

    Го про конечные автоматы

  • @andyvoice
    @andyvoice3 жыл бұрын

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

  • @SemenAlexndrovich
    @SemenAlexndrovich3 жыл бұрын

    кто-нибудь считал сколько раз произносится слово "инвариант" ?

  • @dann1kid
    @dann1kid3 жыл бұрын

    короч, на питоне это "ассерт" для тестирования. Есть три подмодуля - входные данные, функция изменения, выходные данные. Есть вход на данные (что проверяется) и есть выход(тоже проверяются). Если данные ок, то функция работает крутится меняет считает. Если выход ок, то исключения не вызываются и данные допускаются для передачи. Пример: число фибонначи. 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-летней практике по пальцам пересчитать сколько раз, но если бы я не знал что это, у меня бы не было возможности их применить. Я бы сказал что знание того что такое инвариант это как знание основных алгоритмов сортировки - очень редко нужно реализовать, но знать нужно обязательно потому что когда-нибудь может пригодиться.

  • @suryaninov
    @suryaninov Жыл бұрын

    Стоп, это всё конечно интересно, но зачем нужны 4 пуговицы подряд в одном месте на рубашке ?..

  • @igordmitrow2815
    @igordmitrow28153 жыл бұрын

    Так инкапсуляция это сокритие данных?

  • @InSimpleWords_WebDev

    @InSimpleWords_WebDev

    3 жыл бұрын

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

  • @vladkolesnik2274

    @vladkolesnik2274

    3 жыл бұрын

    @@InSimpleWords_WebDev круто разложил

  • @InSimpleWords_WebDev

    @InSimpleWords_WebDev

    3 жыл бұрын

    @@vladkolesnik2274 Спасибо.

  • @EvgeniyMalov

    @EvgeniyMalov

    3 жыл бұрын

    Инкапсуляция это когда тебя хотят накормить через ж* , а ты падаешь и кричишь, что у тебя для этого есть рот)

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t3 жыл бұрын

    К примеру, в контрактном программировании инвариант - это контракт

  • @kirillsviderski4739
    @kirillsviderski47393 жыл бұрын

    Очень сложное объяснение. Почему бы просто не показать пример с законом Ома, например?) Типо, нужно симулировать электрическую сеть. Тогда для каждого элемента должен соблюдаться инвариант. А значит, поля U, I, R надо спрятать под абстракцию правильно написанных сеттеров, что бы при изменении сохранялся инвариант

  • @0imax

    @0imax

    3 жыл бұрын

    Закон Ома знаю, программировать умею (и под железо, и под десктоп), но из объяснения ни хрена не понял :)

  • @user-ks8zk9dn3s
    @user-ks8zk9dn3s3 жыл бұрын

    у Вас кабель от микрофона перетянут)

  • @AlexYaroshevich
    @AlexYaroshevich3 жыл бұрын

    А каррирование здесь при чем?

  • @vovanchik_ru4208
    @vovanchik_ru42083 жыл бұрын

    дык вот для чего придумали этот странный javascript.... В строготипизированном языке об инварианте практически не думаешь, т.к. некуда деться из подводной лодки. А в js конечно всё прекрасно, сладко аж засахариваешься, но только до тех пор пока не захочешь сделать всё правильно :) А когда ума набираешься и хочешь дальше программировать на js, то приходится контролировать инвариантность, ну или строго замарочиться typescript-ом :) Ну вот если бы не js, то когда бы я бы ещё узнал о инвариантах...? :)

  • @mojeimja
    @mojeimja3 жыл бұрын

    JS как всегда 0+_k чтобы принудить к численному типу. 2+2=22

  • @isopp7744
    @isopp77443 жыл бұрын

    Инвариант = 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-if7mu6fe3h
    @user-if7mu6fe3h3 жыл бұрын

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

  • @ezekiel6515
    @ezekiel65153 жыл бұрын

    Сначала прочитал «Инвалид в программировании»

  • @user-cp2nh9tf1x
    @user-cp2nh9tf1x3 жыл бұрын

    _Я чё-то наверное, не понял из слов автора. Насколько я вижу, автор НЕ использует здесь особую "фишку" инварианта (или у меня есть предположение, что сам автор чё-то в этой теме недопонимает). Т. е., он мог бы озаглавить видео "предусловие и постусловие", и ничего по сути в логике на видео не поменялось бы (даже если бы предусловие и постусловие отличались)._ _А вот ИНВАРИАНТ (т. е., когда предусловие и постусловие одинаковые) полезен для доказательства правильности циклических (итеративных) конструкций в коде: например, циклов, рекурсивных вызовов подпрограмм (функций). Там фишка в том, что ты доказываешь, что однократное (любое) выполнение цикла (или вызова рекурсии) не меняет инвариант -- и тогда доказано, что цикл работает правильно (если доказана его завершимость). Плюс от инварианта, что (как правило) это доказывать проще. В противном случае (если инвариант найти не удаётся), то придётся доказывать по мат.индукции (что муторно) или каким-то другим способом._ ____________________ _П.С. Доказывать алгоритмы это чисто теория. Не спрашивайте меня, кому это на практике это надо. Никому это на практике не надо! Никто этим не занимается при программировании, не забивайте себе голову._

  • @S0ERDEVS

    @S0ERDEVS

    3 жыл бұрын

    Для начала погугли "инвариант классов (типов)", "программирование по контракту". В остальном ты просто рассказываешь про "инвариант циклов", что не является единственным применением инварианта.

  • @antonschneider4213

    @antonschneider4213

    3 жыл бұрын

    никому??? не все могут себе позволить г**окодить

  • @user-jo3qr1ug6e

    @user-jo3qr1ug6e

    2 жыл бұрын

    Я вот щас недавно, Кнута пытался осилить, после алгоритма Евклида, потом идёт математическая индукция, так вот инвариантность, это и есть некоторая аналогия математической индукции или как понимать?

  • @Rybkinrolla
    @Rybkinrolla3 жыл бұрын

    Я вот сижу и слабо представляю себе зачем мне могло бы это понадобиться. Повышать в разы сложность алгоритма различными проверками ради собственной дуракоустойчивости. Если пишешь методы по 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

  • @user-jx4jb4of3c
    @user-jx4jb4of3c2 жыл бұрын

    Может смени язык на типизированный. Легче объяснять будет

  • @AlexYaroshevich
    @AlexYaroshevich3 жыл бұрын

    Соер: Вот тут мы проверки на типы навертели, потому что 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! ты меня поставил в тупик

Келесі