Большие проблемы наследования в ООП

Поділитися
Вставка
  • Опубліковано 12 лис 2024

КОМЕНТАРІ • 758

  • @illidanstormrage8022
    @illidanstormrage8022 4 роки тому +635

    Пингвин должен говорить не "ХЗ", а "Линукс"

    • @Firefly_3161
      @Firefly_3161 4 роки тому +28

      И еще пингвин бы сказал что ООП говно, а Си наше все! Каждый раз для граблей - ООП с выходом новых стандартов (по факту костылей которые называют фичами) для того чтобы улучшить грабли. Но всеравно грабли от этого не перестают ими быть, даже если они удобнее! Как следсвие over-garbage код, утечки памяти, мусорный код сжирающий ресурсы машины... Таким бы был пингвин если бы Линус Торвальд использовал грабли ООП для создания этой системы! Да и был бы этот пингвин еще жив - большой вопрос!

    • @bsunjar
      @bsunjar 4 роки тому +18

      "fuck nvidia"(c)

    • @YY-zw2ec
      @YY-zw2ec 4 роки тому +1

      GNU

    • @AlexP-jc7rz
      @AlexP-jc7rz 4 роки тому

      А в чем разница?

    • @mhhit
      @mhhit 3 роки тому

      представь себе пингвина у которого звуки хз XD

  • @Антон1210-ш3ж
    @Антон1210-ш3ж 4 роки тому +217

    4:19 Как же хорошо, что в C# нет множественного наследования
    4:20 ...А теперь в C# 8 можно пилить дефолтную реализацию интерфейса

    • @ivangor1997
      @ivangor1997 4 роки тому +10

      @@user-w32eiJkNlIn9a2nRq6n Они становятся абстрактными классами просто с возможностью множественного наследования.

    • @MacIn173
      @MacIn173 4 роки тому +6

      @@user-w32eiJkNlIn9a2nRq6n так и просто полностью абстрактный класс остается контрактом, который нельзя сам по себе инстанцировать.

    • @voltamperoff
      @voltamperoff 4 роки тому +4

      @@user-w32eiJkNlIn9a2nRq6n "Он может содержать в себе кучу базовой логики, в отличие от интерфейса." (с)
      Но начиная с 8-й версии, это отличие полностью исчезает.

    • @bonumsignum7017
      @bonumsignum7017 4 роки тому

      @@voltamperoff Глупость, в интерфейс ты не добавишь поле. Это вся суть интерфейса, ты не можешь задать стейт классу.

    • @khodis2002
      @khodis2002 3 роки тому

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

  • @АркадийМонахов-л5ш
    @АркадийМонахов-л5ш 3 роки тому +38

    Когда пришёл узнать о недостатках наследования, но вместо этого начал танцевать ХАРДБАСС!

  • @ЯнЛи-д7м
    @ЯнЛи-д7м 4 роки тому +194

    Проблемы не у наследования в ООП, а у того, кто неправильно его применяет. Если вы забиваете микроскопом гвозди, то ни гвозди, ни микроскоп в этом не виноваты.

    • @Rumpelstilzchen_M
      @Rumpelstilzchen_M 4 роки тому +7

      так он вроде именно про это и говорит.

    • @addressmodel2121
      @addressmodel2121 4 роки тому +7

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

    • @VeryWorried
      @VeryWorried 4 роки тому +1

      ога, архитектурно-структурные подходы.

    • @vzlomer1000
      @vzlomer1000 4 роки тому +4

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

    • @nuclearcoil
      @nuclearcoil 4 роки тому +6

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

  • @evgeniym29
    @evgeniym29 4 роки тому +224

    Слоны умеют плавать :)
    В остальном, как обычно, красава :)

    • @dashandr1
      @dashandr1 4 роки тому +6

      Ты слон

    • @evgeniym29
      @evgeniym29 4 роки тому +4

      @@dashandr1 И кто это говорит, жирный троль? :)

    • @dashandr1
      @dashandr1 4 роки тому +2

      @@evgeniym29 азарной слон)

    • @replace22yu40
      @replace22yu40 4 роки тому +11

      Кстати да, они хорошо плавают

    • @yevheniidolmatov3170
      @yevheniidolmatov3170 4 роки тому

      Кликбейт же

  • @antaki93
    @antaki93 4 роки тому +354

    Зачем вообще пихать метод Swim() в родительский класс, если он не является общим для всех наследников? По-моему, вы чего-то не понимаете в ООП.

    • @leeroyjenkns5182
      @leeroyjenkns5182 4 роки тому +66

      Проблемы с ООП возникают у тех, кто именно так его использует. Поэтому для демонстрации "как делать не нужно" самое то

    • @ivansidorov5
      @ivansidorov5 4 роки тому +35

      @@leeroyjenkns5182 Ты описываешь идеальный мир которого не существует.в реальных проектах почти всегда такая хуйня как на видео и ен важно банк это или стартап , нет времени постоянно все рефакторить.

    • @Nikita-hu9bk
      @Nikita-hu9bk 4 роки тому +15

      @@ivansidorov5 А если изначально так не делать?)

    • @ivansidorov5
      @ivansidorov5 4 роки тому +48

      @@Nikita-hu9bk ты никогда не писал большой проект где участвуют больше 3 человек?) и длится больше года. Изначально можно сделать хорошо при 2 условиях: 1) ТЗ не меняется 2) Дают время на рефакторинг . Я перевидал много проектов, везде полная дичь с ООП и куча костылей для него. нет говна только в тех проектах, которые мелкие и пишутся 1 человеком, а еще в тех где писал все ты) потому что там там, как привык ты)

    • @AlexAlex-ms3bg
      @AlexAlex-ms3bg 4 роки тому +4

      Да затем, чтобы видос заснять. А про что тогда снимать??

  • @soulwind7577
    @soulwind7577 4 роки тому +11

    Сидишь такой, ура наконец то начал понимать ООП, спасибо видосу теперь понятно, что ни хя не понятно XD

  • @0vdmk
    @0vdmk 4 роки тому +61

    3 часа ночи, я же даже не программист...

    • @vip51000
      @vip51000 4 роки тому +3

      Становись

    • @paztwel
      @paztwel 4 роки тому

      А в целом ты смог понять о чем вообще идёт речь? 😄

    • @equim7363
      @equim7363 4 роки тому +3

      @@paztwel я не понял, почему метод swim нельзя засунуть сразу в класс Пингвин? Чтобы не повторять его если появится класс акула например?

    • @ДаниалКуандык-с1ж
      @ДаниалКуандык-с1ж 4 роки тому

      Норм жизнь тратишь

    • @azamatkurmangaliyev6010
      @azamatkurmangaliyev6010 3 роки тому

      @@equim7363 да

  • @FoRGeish
    @FoRGeish 4 роки тому +6

    Новый год давно наступил, а автора отпускать похоже не собирается.
    Взять хуево составленный контракт (а куча абстрактных методов и есть контракт, а не наследование) назвать это наследованием и предложить решение, которое к полиморфизму отношения не имеет от слова "совсем": все животные будут реализовывать ходьбу, плавние и т.п. одинаковым способом?
    БРАВО, ГЕНИАЛЬНО, ШЕДЕВР. Еще и на серьезных щщах это все рассказывать...
    Видимо смотрят это реально только "маслята", коли такое соотношение лайков/дизов

    • @ivankramarenko
      @ivankramarenko 4 роки тому

      Эм, представьте что я тупой ребёнок, почему одним способом?

  • @alexxx4434
    @alexxx4434 4 роки тому +101

    Слоны, ска, ПЛАВАЮТ!
    А если серьезно, то это пример плохого приложения наследования. Ибо если бы в биологии так же решили классифицировать животных тупо по умениям они бы тоже быстро за.бались, и ничего бы у них толкового не вышло. Соответственно, проблема не в системе иерархического наследования, а в её правильном применении.

    • @dmitriiplotnikov1137
      @dmitriiplotnikov1137 4 роки тому +38

      Точно. Здесь проблема не в том, что "наследование говно", а в том как оно используется. Добавление swim в класс animal соответствует утверждению, "все животные плавают". В данном случае, это неверное определение уровня абстракции, на котором должен быть размещен метод. Чем выше уровень абстракции, тем более общие части в нем должны находиться. Биологическая классификация живых организмов хороший пример развития такой классификации от общего к частному. Более прикладной уровень - возьмите System.Object, там будут только самые общие методы, которыми должны обладать все произвольные объекты, чтобы среда нормально работала. Так-то при желании или в угоду хайпу можно извратить любую идею.

    • @shadowinthemirror2055
      @shadowinthemirror2055 4 роки тому +8

      AlexXx, я говорю как относительно биолог:вы ахуеть как правы

    • @evgeny_5891
      @evgeny_5891 4 роки тому +9

      Тоже с вами парняги абсолютно согласен!!! Ребята с канала просто хайпануть захотели, а новечки в профессии решат после этого видео забить на наследование)

    • @СергейГриневич-в5ф
      @СергейГриневич-в5ф 4 роки тому +4

      @@evgeny_5891 но в видео было сказано что наследование нужно, но использовать стоит аккуратно (если я ничего не забыл)

    • @evgeny_5891
      @evgeny_5891 4 роки тому +6

      @@СергейГриневич-в5ф В целом мне видос очень понравился, лай однозначно! Автор ближе к концу ролика начинает говорить, о том что наследование "допустимая" штука, но нужно использовать ее с умом, как по мне, нужно это было-бы сказать в начале, но я не автор.) В целом классный канал, и ребята поднимают правильные темы, желаю им удачи!

  • @Max-np7om
    @Max-np7om 4 роки тому +206

    Инкапсуляция тоже была бы мусором, если бы не сокрытие данных

    • @ДавидАрахелян
      @ДавидАрахелян 4 роки тому +3

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

    • @bearpro
      @bearpro 4 роки тому +7

      @@ДавидАрахелян По крайней мере не сокрытие данных точно. Инкапсуляция - сокрытие реализации за интерфейсом, и нужно для того чтобы в реализацию можно было вносить изменения в ходе поддержки программы (баг пофиксить, оптимизировать что-нибудь. С такими целями блин сделаны все нововведения в программировании после появления символьных имён для процессорных инструкций - упрощение поддержки и улучшения кода).

    • @tankowot
      @tankowot 4 роки тому +6

      Брат беги, не оглядывайся =)))

    • @nuclearcoil
      @nuclearcoil 4 роки тому +2

      @@ДавидАрахелян сокрытие подразумевает не только сокрытие данные, но и сокрытие реализации.

    • @kek2961
      @kek2961 3 роки тому +1

      что мешает делать мне все публичными?

  • @dimzinnatov7242
    @dimzinnatov7242 4 роки тому +3

    Лучше уж просто сооздать класс Animal, и отдельно интефрейсы типа ISwimmer : where T , IWalker : where T ,
    вроде так лучше. Возможно ошибаюсь) Я не так давно программирую

  • @KirillTerekhov
    @KirillTerekhov 4 роки тому +121

    По-моему, если не следовать несуществующему принципу ООП "объявления всех методов должны быть только в базовых классах", то в примере будет всё ок с наследованием, не?

    • @ExtremeCode
      @ExtremeCode  4 роки тому +24

      По-моему если следовать существующему принципу ООП, то мы должны в конечном счете работать с абстракциями, не?

    • @KirillTerekhov
      @KirillTerekhov 4 роки тому +26

      @@ExtremeCode конкретный класс тоже описывает абстракцию. Над всеми его экземплярами

    • @KirillTerekhov
      @KirillTerekhov 4 роки тому +21

      @@ExtremeCode но, вообще, не разу не видел понимание принципа "абстракция" из ООП как необходимость наличия слова "abstract" перед каждым методом. Обычно это про то, что мы должны создать хорошую абстракцию, которая скрывает детали реализации. Про создание минимального интерфейса, который легко использовать. Можете посмотреть у Крэга Лармена в главе про GRASP про принцип "high cohesion / low coupling", например

    • @ExtremeCode
      @ExtremeCode  4 роки тому +15

      @@KirillTerekhov абстракция, это не абстрактные классы, весь смысл ООП заключен в полиморфизме и апкасте к "общим" типам, вместо работы с "конкретными" типами, именно из-за этого весь сыр бор в статической типизации, т.к. это единственный способ работать с группой схожих объектов без конкретизации что именно это за объект, хотя они могут иметь различные реализации.
      Для того чтобы достичь этого - существует как наследование, так и реализация интерфейсов. В видео была показана конкретная проблема которая возникает при использовании именно наследования, и различные варианты решения этой проблемы.

    • @KirillTerekhov
      @KirillTerekhov 4 роки тому +41

      @@ExtremeCode как я уже говорил, конкретный класс - это тоже абстракция. Достаточная для решения проблемы из видео. Проблема с наследованием там в том, что вы его применили неправильно. В нарушение принципа подстановки Лисков, например

  • @Oleksandp
    @Oleksandp 4 роки тому +94

    Сами создаем проблемы -- сами героически преодолеваем.
    1. Менять базовый класс можно только общей логикой. Уже ниже писали что добавлять метод, который будет вызыватся только в одном единственном наследнике -- такое себе.
    2. Ничто не запрещает обьединить подход с интерфейсами и абстрактным классом. И тогда можешь внедрять хоть утконосов, которые вообще ни от кого не наследованы в реализации.
    3. Без конкретики как это потом применять все это бесмысленный набор символов.
    Итого полезного из видео: нехуй пихать в базовый класс всю логику, а потом удивлятся "че за порожняк".

    • @devil_of_war
      @devil_of_war 4 роки тому

      странно как то написал, отвечу так, как понял.
      1. Так вроде ты описал то, что в начале и объяснялось - проблема. Но! В ходе расширения наследников много будет.
      2. Не совсем понял, к чему утконосы до объединения подходов с интерфейсами и абстрактными классами. Если можно, по проще объясни.
      3. А ручками никто не запрещал потом это потрогать (попрактиковаться).

    • @Oleksandp
      @Oleksandp 4 роки тому +12

      @@devil_of_war Так, я затер нахер всю ту простыню, что хотел выдать, и постарасю максимально упаковать "меседж":
      Без явного понимания нахер нам эти классы и как их потом использовать, любой довод можно как подтвердить, так и опровергнуть. У нас нет дилемы "яйцо - курица", вначале ВСЕГДА НУЖНО ТЗ.
      - если программа подразумевает что мы вытягиваем из коробки животное, и заставляем его подать голос, наследование вполне проканывает.
      - если программа подразумевает что вытянутое животное нужно будет заставить сделать N-действий, и этот список "динамический", то наследование действительно больше создаст проблем, чем решит. Возможно часть обьектов и будут обьедены общей реализацией, но более надежно вынести все это за интерфейс.
      И так можно придумывать до бесконечности.

    • @devil_of_war
      @devil_of_war 4 роки тому

      @@Oleksandp вот теперь намного яснее. Даже нечего сказать в противовес. Ведь реально ТЗ разное, и программы разные.

    • @dreawmy2912
      @dreawmy2912 2 роки тому +1

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

    • @dreawmy2912
      @dreawmy2912 2 роки тому +1

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

  • @donqhomo8810
    @donqhomo8810 4 роки тому +21

    дроп в 8 утра в рабочий день, кайф))

    • @paul_wiggin
      @paul_wiggin 4 роки тому +6

      Чтобы было чем на работе заняться..
      щас мужики всем отделом посмотрят и будут холиварить весь день! А если там ещё адепты разных языков есть, то холиварить будут до понедельника.

    • @purplep3466
      @purplep3466 4 роки тому

      @@paul_wiggin ахахаххахаха

  • @EshkinKot1980
    @EshkinKot1980 4 роки тому

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

  • @DarkIllusoire
    @DarkIllusoire 4 роки тому +3

    На самом деле, этот пример надуманный - он больше про проектирование"а что если, вдруг" - это как про бабушку, которая стала дедушкой

    • @ebla1n393
      @ebla1n393 4 роки тому

      На самом деле если ты вдруг столкнёшься с данной проблемой перед каким нибудь дедлайном, то тебе придется либо нахер выкидывать свой прошлый код в помойку, либо юзать хуеву тучу костылей :/
      Так что не советую говнокодить в таком случае если зарплата нормальная. В любом случае при расширении интерфейса тебе придется выкидывать код на помойку и писать его по новой. Имхо, это неуважение к себе и к своему свободному времени ибо никогда нельзя быть уверенным в будущей неизменности своего кода.

    • @DarkIllusoire
      @DarkIllusoire 4 роки тому

      @@ebla1n393 в любую систему следует закладывать разумную реализацию, а если у вас внезапно, появляются собаки умеющие летать, то это проблемы проектирования, код не должен помогать говнокодить. Для остальных случаев, дедлайна того же, есть куча возможностей прилепить сколь угодно костылей. Наследование должно применяться не для красоты, а для простоты. То есть наследование от абстрактных классов, реализующие интерфейсы с не пустыми виртуальными методами - довольно гибкая система, когда нужно переиспользовать код

    • @klerg321
      @klerg321 4 роки тому

      @@ebla1n393 но если нет оснований думать, что кто-то кроме пингвина будет плавать, так и не надо делать ерунду и обмазываться интерфесами. Вот когда появится необходимость, тогда и вынесется в отдельный абстр. класс или интерфейс "плавучее животное"

    • @ebla1n393
      @ebla1n393 4 роки тому

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

    • @ebla1n393
      @ebla1n393 4 роки тому

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

  • @ЮрийВеляев-и7н
    @ЮрийВеляев-и7н 4 роки тому +5

    Доброго времени суток.
    Осветите пожалуйста темы с подключением GitHub, Azure и прочим. Плюсы, минусы, отличия. Как подключить для чего нужно.
    И еще хотелось бы увидеть программирование с использование баз данных, так ка большинство приложений клиент-серверные.
    Заранее спасибо.

  • @ajajapenoflex
    @ajajapenoflex 4 роки тому +1

    Спасибо за критические ролики! И своеобразного юмора над всем тем балаганом что есть в кодинге. Долго время не мог подступиться к ооп и паттернам и прочим техникам, казалось чем то сверх сложным и требующим много времени для разбирательств, но когда узнал о проблемах в ооп и понял за что его макают лицом в грязь, вообщем говоря обратную сторону медали, то пришло озарение и понимание простых вещей, для чего все эти паттерны придуманы и какую большую проблему в проектировании с помощью кода они решают. Так же наконец то прочитал книгу чистый код и достаточно легко переварил все в ней сказано и офигел на сколько же она простая и это только верхушка айсберга тех вещей с помощью которых можно по-человечески выполнять свою работу))

  • @vilkillian
    @vilkillian 4 роки тому +85

    Это не проблемы ООП, это проблемы кодеров, которые не могут в ООП

    • @vBasterv
      @vBasterv 3 роки тому +7

      Если прогер говорит "Это проблемы кодеров которые не умеют в ООП", то этот прогер не умеет в ООП.
      И слава богу что таким криворукам теперь вяжут руки в любом современном ЯП, чтобы они свое "мега ООП" не несли в массы.

    • @vilkillian
      @vilkillian 3 роки тому +6

      @@vBasterv чел...

    • @sergeifomin3225
      @sergeifomin3225 3 роки тому +4

      Ребят. Давайте жить дружно. Вы же понимаете, что ООП инструмент ограничений - метод борьбы одного программиста с коллегами. Когда над проектом работают сотри программистов, такие архитектурные решения - скелет проекта. Нужный чтобы весь код не превратился в мусор, который тяжело поддерживать. ООП это уже давно не пушистый зверёк, который создан для того, чтобы тебе было удобно)

    • @vilkillian
      @vilkillian 3 роки тому +1

      @@sergeifomin3225 именно

    • @easystm6865
      @easystm6865 3 роки тому

      Чел?

  • @Temp1archik
    @Temp1archik 3 роки тому

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

  • @angelotrriton9940
    @angelotrriton9940 2 роки тому

    Полезно, понятно, быстро и с музыкой! Однозначно лайк и спасибо! 😘

  • @JasterSalli
    @JasterSalli 3 роки тому +1

    Классно! Помню как в рамках изучения JS писал терариум, так добавление каких-либо возможностей "жителям" иногда приводило к хорошим проблемам. А вообще мне понравилось)

  • @АлександрКубит
    @АлександрКубит 4 роки тому +3

    именно в словах типа "я запихну все в кучу, чтобы не усложнять код" и кроется вся суть :D

  • @sergey1658
    @sergey1658 4 роки тому +1

    Умный кто-то,
    Может видео, как делать большие проекты типа paint, word? С чего начинать, какая должна быть структура чтобы было ооп и красиво

    • @Andrey-il8rh
      @Andrey-il8rh 4 роки тому

      а ты маленькие уже умеешь делать?

    • @sergey1658
      @sergey1658 4 роки тому

      @@Andrey-il8rh калькулятор-шифратор какой-нибудь легко, с чуть ооп

    • @Andrey-il8rh
      @Andrey-il8rh 4 роки тому +3

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

  • @СашаМи-т3ъ
    @СашаМи-т3ъ 4 роки тому +2

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

  • @vladimir2358
    @vladimir2358 4 роки тому +21

    дык, open/closed principle! Только ситхи вносят изменения в классы

    • @vinik_tfo
      @vinik_tfo 4 роки тому

      open/closed сложно представить при грубом наследовании

    • @shmeklz
      @shmeklz 3 роки тому

      Хуык

    • @vladimir2358
      @vladimir2358 3 роки тому

      @@vinik_tfo, наследование не нарушает его, каким бы грубым оно не было, только бы Лисков оставалась удовлетворённой)

  • @I-PixALbI4-I
    @I-PixALbI4-I 4 роки тому

    Спасибо, только сегодня сделал дз по массива и теперь в ООП погрузился, нихрена не ясно но очень интересно)

  • @razor23Ukraine
    @razor23Ukraine 4 роки тому

    Exceptions не нужны - а вот это уже интересненько! Давай жги!

  • @unset1302
    @unset1302 3 роки тому

    Вообще не ебу, что происходит на экране, но смотрю все видосы. 👍

  • @Retroromancer
    @Retroromancer 4 роки тому

    Вот что значит хороший ролик. Я вообще не кодер, не понимаю ничего из сказанного, но смотреть интересно.

  • @guxershmeg
    @guxershmeg 4 роки тому +3

    Но теперь для создания пингвина надо изучить в коде 3-4 сущности вместо 1. А каждая из них может так же конструироваться из 3-4 сущностей. Создание объектов в такой архитектуре усложняется геометрически.

  • @it-6411
    @it-6411 4 роки тому +1

    Наследование в подавляющем большинстве случаев необходимо только разве что при использовании различных фреймворков и api, где дизайн классов специально заточен для того, чтобы от них наследовались. А если реюзать свой код, то интерфейсы, композиция и utility-методы)

  • @vladyslavtymofieiev4213
    @vladyslavtymofieiev4213 3 роки тому +2

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

  • @umangmishra5614
    @umangmishra5614 4 роки тому +3

    English viewers who got this recommended can take refuge here🙏

  • @ВладиславБезуглый-ь2к

    Можно более подробный разбор последнего примера ? А-то я вроде понял , но больше на интуицию , хотелось бы больше ясности в нем , что бы так сказать уверенно ступать и чувствовать твердый пол под ногами =D

  • @evgenasd8892
    @evgenasd8892 4 роки тому +1

    Здорово раскрываете суть паттерна(нов), все понятно. Остается попрактиковать закрепив результат. Кстати в книге «Банды четырех» этот паттерн нифига не понятен, с их примером создания текст.редактора.

  • @algol36
    @algol36 4 роки тому +4

    В последнем примере с Trait - зачем все так сложно? Почему нельзя просто сделать два интерфейса ICanWalk и ICanSwim, и затем написать класс расширение для каждого из них?
    Типа
    public static void Walk(this ICanWalk canWalk){...}
    ?

  • @rotrhino
    @rotrhino 4 роки тому

    Найс процитировал первую главу про Стратегию из книжки по шаблонам проектирования.

  • @star_lord1911
    @star_lord1911 4 роки тому +2

    Час назад вернулся с днюхи, смотрю в универе и получаю полезную инфу 😂

    • @DicrTarasov
      @DicrTarasov 4 роки тому

      Наоборот, это очень вредное видео, в котором автор показал как он не понял как правильно использовать ООП.

  • @tigranovakyan4913
    @tigranovakyan4913 4 роки тому +1

    Понятие класс -это то что объединяет общие методы и свойства (Бро пингвин и собака имеют разные свойства) не нужно усложнять жизнь называя их зверушками)))) еще и под один класс пихать их)) ах да название канала же 'ExtremeCode' теперь все понятно))

  • @Xeon83
    @Xeon83 2 роки тому

    Я под такую музыку иногда отхватывал и иногда сам кому-нибудь вкладывал на подмосковных дискотеках в начале нулевых))) А тут ООП.

  • @Wherrimy
    @Wherrimy 4 роки тому +1

    Проблемы наследования тут не показаны. Когда ты добавляешь метод в класс Animal, ты должен сразу прикинуть является ли данное свойство неотъемлемой частью именно всех животных, или только отдельных видов таковых. Если нет, то пользуешься чехардой из наследованных классов (вплоть до выделения всех царств, подцарств и т.д. из биологической иерархии в пределах требования программы). Если классов слишком много, пользуешь стратегию/мост/декоратор, например. Ну а в целом, да, есть принцип "композиция лучше наследования", например из-за того, что композиция динамична, а наследование статично.

  • @demantools
    @demantools 4 роки тому +1

    Может сделаете видос про функциАнальное программирование? Думаю малаяткам(мне) будет интересно послушать байки про императивные и декларативые стили, карелизация там...

  • @PrefixKrema
    @PrefixKrema 4 роки тому

    Очень люблю ваш канал.
    Не хотите сделать видео на тему, как начать участвовать в опенсорс проектах, и контрибьютить на гитхабе?
    А так же как участвовать в хакатонах, и надо ли оно вообще. С каким опытом итд.

  • @nooftube2541
    @nooftube2541 4 роки тому +11

    Слоны не умеют плавать... Посмотрим как ты уплывешь от бешеного слона xD

  • @андрейскиба-к5ь

    музыкальное сопровождение шикарно

  • @МАМКАЛЮБ2005-д4ш
    @МАМКАЛЮБ2005-д4ш 4 роки тому

    в книге Троелсена было подобное 2:56 и он там указал, что абстрактные функции-члены и данные-члены, которые не принадлежат ко всем производным от абстрактного классам нужно делать интерфэйсом, в данном случае был бы интерфэйс ICanSwim, и проблема множественного наследования бы решилась. Далее вы показываете "Решение", но использовать интерфэйсы без абстрактного класса глуповато и строить на них все, поскольку первоначально назначение у них другое

  • @El.Barrent
    @El.Barrent 4 роки тому +1

    Видео нужно было назвать "How to slav your inheritance".

  • @nezajac
    @nezajac 4 роки тому

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

  • @yurademchenko9924
    @yurademchenko9924 3 роки тому

    Лайк. Но, 4:00 интерфейс IAnimal это моЩЩно ))

  • @seniordev9275
    @seniordev9275 4 роки тому +2

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

  • @Crazmuss
    @Crazmuss 4 роки тому +28

    Ничего не понятно, но очень интересно.

  • @MacIn173
    @MacIn173 4 роки тому +1

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

  • @danilkha
    @danilkha 4 роки тому +2

    Может я чего-то не понимаю, но в java, например, можно создать готовый класс с методами которые уже что-то делают и когда какой-то класс от него наследуется, то этот класс может переопределить готовые методы класса родители без переписок abstract

    • @dashandr1
      @dashandr1 4 роки тому

      Вот хороший вопрос. Когда плюсы изучал, тоже так делал

    • @МаксимМалышев-м6ы
      @МаксимМалышев-м6ы 4 роки тому

      Слоны по дефолту не умеют плавать. Если ты напишешь реализацию для плавания по умолчанию в классе, и наследуешь от этого класса слона, то метод swim все равно унаследуется, и получится что слоны умеют плавать.

    • @qaserus1226
      @qaserus1226 4 роки тому

      @@МаксимМалышев-м6ы в видео говориться что уже после добавляется метод свим. Так вот, в джаве пишешь в класс пингвин метод свим и все. В класс родительский не надо его пихать. Я ещё тот маслёнок... только учусь. Может чего не понимаю еще

    • @МаксимМалышев-м6ы
      @МаксимМалышев-м6ы 4 роки тому +3

      @@qaserus1226 Тогда тебе придется весь код этого метода продублировать для каждого животного, которое умеет плавать. Написать метод swim для пингвина, собаки, кошки и.тд, причем весь этот код будет одинаковым (или почти одинаковым). А дублирование это плохо

    • @qaserus1226
      @qaserus1226 4 роки тому

      @@МаксимМалышев-м6ы ну если этот метод нужен многим классам то да)))

  • @olezhonnv3215
    @olezhonnv3215 4 роки тому +1

    Проблема в том, что практика показывает следующее.
    Как бы вы не проектировали, по мере роста проекта у вас в любом случае будет такая мешанина кода, что там ООП - не ООП, уже не важно будет.
    Потому что такова жизнь! Проектирование дает результат в начале и потом некоторое время. А дальше все это станет легаси кодом.
    В ЛЮБОМ СЛУЧАЕ! Независимо от парадигмы и подхода.

  • @Rostik-pk1ik
    @Rostik-pk1ik 4 роки тому

    сейчас бы прийти в офис с колоночькой и врубить эту прекрасную музыку и кодить... *кайф*

  • @КонстантинЪЪЪ
    @КонстантинЪЪЪ 4 роки тому +1

    просто вместо walk нужно использовать move. и Вот уже и червяк и слон ходют... walk это уже реализация move ))) и в методе move определяем стиль движения - идти, ползти, плыть(если в воде) и это должно может быть инкапсулировано, это же не объект без поведения

  • @YegresAL
    @YegresAL 4 роки тому +1

    Вообще-то, если животное не умеет плавать, а на нем вызвали этот метод - то оно должно умереть. Т.е. или выкинуть эксепшн или написать в консольке "drowned". А тут получается, что ты не только лишаешь слона умения плавать (что он умеет, кстати, делать), но и лишаешь возможности в будущем понять что будет с животными которые не умеют плавать. Они просто не будут обработаны... или они все посчитаются одинаково не умеющими плавать (и каждому выделится стандартный спасательный жилет, который не поможет условному слону и будет велик мышке)...
    В целом, выбранный подход должен определяться не только стройностью классов и их простотой их изменения, но и их использованием. И иногда немного говнеца в виде лишнего кода может сэкономить тонну времени на разбирательстве в 100 интерфейсов в разных модулях... KISS никто не отменял, и он в реальной жизни важнее SOLID или, простихоспади, ООП.

  • @JOELwindows7
    @JOELwindows7 4 роки тому +2

    This is your daily dose of Recommendation
    .

  • @NikolayMishin
    @NikolayMishin 4 роки тому

    Отличный ролик👍🤗

  • @nekitak3472
    @nekitak3472 4 роки тому +1

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

  • @lesnoy_leo
    @lesnoy_leo 4 роки тому +2

    Не ну за хардбас только лукаса можно влипить\

  • @asphyx667
    @asphyx667 3 роки тому

    А я все ожидал, что минуте на 5ой будет изобретено Component-oriented programming, а потом и вовсе ECS.

  • @Сергей-ж5т8ы
    @Сергей-ж5т8ы 4 роки тому +2

    Я благодаря этому паттерну собес прошел успешно.

    • @ProkerKusaka
      @ProkerKusaka 4 роки тому +1

      - Вы умеете использовать наследие в ООП?
      - Наследие мусор!
      - Вы приняты

  • @СергійЩерба-н3в
    @СергійЩерба-н3в 4 роки тому +1

    Слоны как раз отлично умеют плавать.

  • @jmik4956
    @jmik4956 4 роки тому +4

    А разве следование "принципу единой ответственности" не должно на корню присечь подобные ситуации?

  • @Rostik-pk1ik
    @Rostik-pk1ik 4 роки тому

    дождались!

  • @ВсеволодЧистяков
    @ВсеволодЧистяков 4 роки тому +2

    Спасибо! Схема гибкая бесспорно, но в защиту наследования хочется спрлсить - возможно не в парадигме дело, а в детализации архитектуры? Ведь если подумать перед тем как писать код можно же превентировать будущие изменения добавив пару промежуточных классов? Или это бред? У вас просто в видео так обставленно, что наследование изначально неумёхи используют)

  • @ТамирланБельгибаев

    Чета загнул все фразой - «Нахрен не нужный».
    Я пока что студент и довольно больших проектов не писал.( максимум университетская система )
    Но, скажу одно! На мой скромнейший опыт, я понял то что нужно использовать - то что нужно. А говорить что «нахрен не нужно то-то» как то глупо.
    Но видео само качественное, лайк

  • @ДаниилГончаренко-г8я

    Поставил лайк под видео, видос хороший, но сейчас меня зачмырят...
    Как же я рад что я учил только Java))) Там как бы с этим делом реально по проще.

  • @sergobelich6963
    @sergobelich6963 4 роки тому

    Как услышал хардбасс. Сразу лайк подписка колокольчик

  • @maslyonoklesnoy6699
    @maslyonoklesnoy6699 4 роки тому +5

    Животное может выполнять массу действий. Если добавлять на каждое действие по свойству IAction, то класс разбухнет. Как организовать возможные действия для животного?

    • @klerg321
      @klerg321 4 роки тому

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

    • @Oleksandp
      @Oleksandp 4 роки тому +1

      все же нужно расматривать конкретного слона, а не абстрактного в вакуме. очень, ОЧЕНЬ много зависит от того что изачем делаешь.

  • @2012knp
    @2012knp 4 роки тому +1

    Шаблон «Компоненты» стучится в дверь

    • @DenisShaver
      @DenisShaver 3 роки тому

      Именно. Хоть кто-то написал.

  • @konstantine_2761
    @konstantine_2761 4 роки тому +1

    ВЫЗЫВАЮ ПОЯСНИТЕЛЬНУЮ БРИГАДУ.
    А на. уя было в первом примере добавлять столько сущностей, если можно было просто добавить виртуальную функцию, переопредедив ее в гребаном пингвине?

  • @agweprint27
    @agweprint27 3 роки тому +1

    а почему нельзя обращаться просто penguin.Swim и penguin.Walk, в примере с дефолтными рализациями в интерфейсе?
    Там класс Penguin имплементирует 2 интерфейса (IWalker и ISwimmer), которые уже имеют реализацию.

  • @danyylhidden4598
    @danyylhidden4598 3 роки тому

    Penguin это модель данных, в ней не должно быть зависимостей. Попробуйте сделать стратегию с применением clean architecture. Вся логика обработки событий должна быть в сервисном слое. Этот пример не применим к реальным бизнес задачам.

  • @ДенисКисель-к7у
    @ДенисКисель-к7у 4 роки тому +2

    Угарнул на моменте трейтов и PHP программистов)

  • @eugenesidelnyk4600
    @eugenesidelnyk4600 4 роки тому +8

    Возможно я ошибаюсь, но разве шаблон проектирования "Декоратор" не решает показанную проблему?

    • @vinik_tfo
      @vinik_tfo 4 роки тому +3

      Да, в большинстве своём решает, но шаблон Декоратор скорее подходит для четкой логики без нюансов, например такой, как тот же самый класс Stream: в Java использован как раз таки Декоратор, и в "производных" от него классах следует логика "базового", но она постоянна и преследует декорируемый объект всегда. В нашем же случае такое скорее будет вредно, чем полезно, так как наш зоопарк имеет огромное количество нюансов, вытекающих из биологии: пингвины хоть и птицы, но не летают; киты и дельфины - млекопитающие, но живут под водой; утконосы тоже млекопитающие, но откладывают яйца и многие другие подобные моменты.
      Могу и сам ошибаться, поэтому waiting for feedback.

    • @serhiis_
      @serhiis_ 4 роки тому

      @@vinik_tfo лучше использовать один класс без наследования в данном случае с животными. В этом классе нужно определить все поля которые могут существовать (добавлять по мере необходимости) и уже конкретно в обьекте определять те поля, которые используются. Если полей очень много - можно/лучше использовать хешмап. А касательно методов тут все тоже логично, добавлять методы по мере необходимости. Скажете а как же полиморфизм? А что мы не можем в одном методе if (type) прописать? В полиморфизме это тоже делается, только неявно.
      Я не говорю что наследование плохо, просто как это в видео указано, не всегда применимо удачно. В большинстве случаев достаточно хешмап использовать в качестве полей-значений или полей с дефолтным значением.

    • @0imax
      @0imax 3 роки тому

      @@serhiis_ если этих type-ов 2-3, то ещё терпимо, а как набирается ближе к десятку - поди проконтролируй, что во всех "полиморфных" методах перечислены варианты для всех типов.

    • @0imax
      @0imax 3 роки тому

      @@serhiis_ А что касается примера - надо было в базовом классе определить метод Move(), чтобы управлять животными единообразно, а уже в подклассах реализовывать те или иные особенности передвижения либо промежуточным абстрактным классом, либо навешиванием через декоратор, тут уже от конкретики зависит.

    • @serhiis_
      @serhiis_ 3 роки тому

      @@0imax Касательно C# в нем есть только 2 механизма избегания падения приложения, когда мы пытаемся вызвать метод, которого нету в классе,
      1) Ручная проверка класса на интерфейс, в котором прописан этот метод. Топорно но работает и не падает!
      2) Отражение/рефлексия. На этапе загрузки либы/классов мы можем через рефлексию добавить в интересующие нам классы методы по умолчанию, если их там нет. Например если метода нету у класса, можно добавить метод который будет присылать багрепорт разработчику при попытке вызвать этот метод. При этом приложение у пользователя не крашнется - что для нас очень важно! Ведь краш приложения - это потеря всех данных!!! Кроме того по статистике при краше приложение примерно 40% пользоветелей на 2-3 краш удаляют такое приложение и ставят 3 на плеймертеке!!! Оно вам нужно?
      Поэтому я не рекомендую использовать ни чего, что могло бы вызвать краш у пользователя! Лучше пусть у него на экране верстка поедет криво накось чем упадет приложение. В случае верстки данные не потеряются, в случае краша все данные навсегда теряются вместе с пользователем!

  • @ЯГречка
    @ЯГречка 4 роки тому +13

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

  • @Gameplayer55055
    @Gameplayer55055 4 роки тому +7

    Смотрю и понимаю что лучше продолжу использовать
    life:
    jmp poszrat
    jmp posrat
    jmp sleep
    jmp life

    • @Firefly_3161
      @Firefly_3161 4 роки тому

      Еще не хватает несколько строк для обработки прерывания:
      jz death
      jnz Paradise
      jmp God's judgment
      jmp Hell
      Paradise:
      ...
      Hell:
      ...

  • @НиколайКальмар
    @НиколайКальмар 3 роки тому

    Глупо винить молоток за то, что он не работает как отвёртка. ЭТО ПРОСТО РАЗНЫЕ ИНСТРУМЕНТЫ!

  • @oleghardy4622
    @oleghardy4622 4 роки тому

    по сути это пересказ первой главы книги про паттерны фрименов)

  • @СергейПетров-е5ы2п
    @СергейПетров-е5ы2п 7 місяців тому

    Если не множественное, тогда может селективное наследование? В описании производного класса перечисляем что наследуем, а что отбрасываем?

  • @alonev1875
    @alonev1875 4 роки тому

    Мне кажется не плохой вариант, когда мы создаем пустые емкости через абстрактный класс Trait и наполняем их расширенными методами статического класса.
    Extrimiсты по вашему мнению какой лучший вариант? C#8.0 позволяет реализовывать методы в интерфейсе. В чем плюсы и минусы.?

  • @ryazanov13
    @ryazanov13 4 роки тому +1

    ок, если я получаю список животных и они в начале должны говорить, а потом ходить, какой интерфейс мне указывать?
    Сам по себе интерфейс с точки зрения ООП разве ни есть наследование? Например, в случае с++ вообще нет интерфейсов как языковой конструкции, но можно создавать абстрактные методы, при этом есть множественное наследование, в итоге можно через наследование реализовать то что ты показал через интерфейсы.

  • @dmytrolambru2984
    @dmytrolambru2984 4 роки тому

    Аффигенно! Спасибо за хорошие примеры и аргументацию )

  • @ShadxEl
    @ShadxEl 2 роки тому +1

    Я столько раз пытался тоже самое объяснить разрабам, но всегда встречал полное непонимание)

  • @ИванНикитин-ч7б
    @ИванНикитин-ч7б 3 роки тому +1

    Это не проблема наследования, а проблема кривых рук и мозгов. Внезапно, действия (методы) в реальной жизни тоже попадают под классификацию, но данные (существительные) в оопе воспринимаются как имеющие механизм наследования, а функции (глаголы) - нет. Например у конкретных методов walk и swim должен быть родительский абстрактный метод move. Конкретные методы (действия передвижения в реальном мире) основаны на том, в какую среду "погружён" объект, и это ясно показывает, что они зависят от внешних объектов, а не от наследования. Добавляем животинам методы перехода в среду (паттерн Стратегия), которые у каждого разные и получаем, что при прыжке пингвина в воду метод move будет плавать, а при прыжке в воду особого-не-умещюего-плавать-слона метод move - плавать не будет. Естественный ход вещей реального мира предполагает, что животное умеет/не умеет особым образом передвигаться (move) в разных средах; при передвижении животное может попадать в другую среду и там нужно будет передвигаться иным, чем только что способом. По этому в случаях, подобных данному примеру, проблема состоит не в наследовании, а в не правильном понимании происходящего. Но, конечно проще всего сказать что это не разрабы тупые, а ООП должно само не явно уметь паттерн стратегия, а если не умеет, то это его (ООП) большая проблема. Но то, что мы в абстрактный класс добавили метод walk, это точно не мы тупые. Я уже не говорю про то, что различные уровни абстракции люди запихивают в один абстрактный класс, а потом огребают и бегут плакаться в бложики.
    Если исходить из понятия наследования, как биологического термина, то у наследования в ООП есть проблема отсутствия механизма доминантности и рецесивности признаков; иными словами у биологических потомков некоторые свойства могут пропадать и эта пропажа наследуется далее, а у в ООП наследники не могут исключать из наследования родительские признаки. Но при появлении такого механизма будут массово появляться разработчики подкидывающие петуха со словами "э ну чё он не летает", а так же появятся разработчики, которые нашли "решение проблемы не летающего петуха" не понимая, что это не была проблема и петух так и должен себя вести. По этому: проблема всегда в человеке.

  • @Rumpelstilzchen_M
    @Rumpelstilzchen_M 4 роки тому +1

    О. Как раз исключения изучаю. Рассказывай.

  • @mitrus4
    @mitrus4 4 роки тому

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

  • @artemsokolov5007
    @artemsokolov5007 4 роки тому +9

    путаешь наследование, сабтайпинг и полиморфизм.
    почему то наследование интерфейсов не называешь наследованием (или мне показалось)
    советую почитать про 3 вида полиморфизма - сабтайпиг (то что обычно ассоциируется с наследованием в ооп), параметрический полиморфизм (дженерики) и ad-hoc полиморфизм
    а также попрогать на фп языках типа haskell, scala, elm, f#

  • @ilya9485
    @ilya9485 4 роки тому +5

    Ребят, а как вы доступ к полям через свою стратегию получать то будете?

    • @klerg321
      @klerg321 4 роки тому +2

      А легко, прокидывать также. Лучше каждый сеттер/геттер оформить отдельным экшэном :D

  • @igorlegostayev1447
    @igorlegostayev1447 4 роки тому

    Отлично! Была одна х*ня. Стало две х*ни. Да еще и сложность и количество писанины увеличились.

  • @andrewgrant6179
    @andrewgrant6179 4 роки тому

    Включил сонный, не смотрел ролик, только слушал, после половины урока понял что это не о пхп хД

  • @МихаилСлуцкий-м7г
    @МихаилСлуцкий-м7г 4 роки тому

    Я не программист, а только учу, но эм, не так давно читал про SOLID принципы ООП, 4ый принцип этой аббревиатуры ISP, Принцип разделения интерфейса (The Interface Segregation Principle) Следование этому принципу помогает системе оставаться гибкой при внесении изменений в логику работы и пригодной для рефакторинга. Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы программные сущности маленьких интерфейсов знали только о методах, которые необходимы им в работе. В итоге, при изменении метода интерфейса не должны меняться программные сущности, которые этот метод не используют. Не противоречит ли пример автора видео этому принципу?

  • @specificcross
    @specificcross Рік тому

    Пересматриваю этот ролик после обучения для проверки навыков сишарпа
    3:53 - мой рекорд по пониманию происходящего (skull)

  • @victor_bozhok
    @victor_bozhok 4 роки тому

    Прекрасная подача

  • @smaugterrible5785
    @smaugterrible5785 3 роки тому

    Я правильно понял, что для обхода проблем с наследованием пришлось реализовать typeclasses из Хацкеля?

  • @GorgeousFrog
    @GorgeousFrog 4 роки тому

    Теперь зверюшки умеют ходить! Ходить, гулять, себя показать! ТЕПЕРЬ ЗВЕРЮШКИ УМЕЮТ ХОДИТЬ! ЗВЕРЮШКИ УМЕЮТ ХОДИТЬ!