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

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

SUBTITLE'S INFO:

Language: Russian

Type: Robot

Number of phrases: 236

Number of words: 1186

Number of symbols: 6553

DOWNLOAD SUBTITLES:

DOWNLOAD AUDIO AND VIDEO:

SUBTITLES:

Subtitles generated by robot
00:00
так короче с оригинальными принципами у п творится невнятное дичь некоторые из них настолько противоречивы что следование им скорее приносит больше вреда чем пользы и конечно же больше всего проблем доставляет именно наследование тут уже в принципе можно начинать скука реки от типа да вот наследование кококо повторное использование кода куд-куда открывает путь к полиморфизм у ку-ка-ре-ку и всякое такое так вот полиморфизм в принципе можно использовать и без наследования что мы в дальнейшем мы
00:31
увидим но именно в самом наследование есть один нюанс здоровенный нюанс который просто ломает всю логику отношений между различными сущностями в общем-то в этом видео я продемонстрирую его а также расскажу когда именно нужно использовать наследование пожалуй приступим берем стандартный пример на основе которого всегда обучают как наследованию так и полиморфизмом конечно же это наши любимые зверушки нас тут будет собачка слон и например пингвинчик
01:00
[музыка] занимательно в этих примерах то что на их основе всегда все прекрасно складывается вот есть абстрактный класс a animal вот есть конкретный тип elephant вот он наследуется от абстрактного animal определяет там его метод пик и в принципе слоняра может дудеть а вот собачка тоже наследуется от animal может гавкать и на данный момент никаких проблем нету все прекрасно функционирует окей тут мы внезапно
01:38
осознаем что нам нужно научить наш зоопарк ходить по земле что мы первым делом делаем правильно лезем в абстрактный класс и изменяем его интерфейс путем добавления метода волк и вот всем нашим зверушкам добавился этот метод и теперь все они имеют возможность передвигаться [музыка] проходит еще какое-то время и тут мы осознаем что пингвин помимо дефолтной ходьбы по земле может ещё и плавать под водой мы конечно же лезем в последнем all чтобы добавить новые абстрактный
02:13
метод у и и тут как бы внезапно осознаем что у нас есть слоны и они тоже не умеют плавать и тут мы начинаем грозить абстрактную тишью когда нас 10000 абстрактных классов зависит от 100 тысяч других абстрактных типов которые предусматривают различные способы передвижения зверушек [музыка] и скажем спасибо что в современные oubey языки не добавляют возможность множественного наследования так как все это делает наш реализации
02:51
конкретных зверей пипец какими хрупкими так как изменение всего лишь в одном базовом классе приводит к тому что не все моментально применяются ко всем конкретным реализациях зверей и на самом деле мы должны были напрячься еще на моменте с добавлением метода волк так как это изменение интерфейса моментально применяется ко всему зоопарку ведь возможно у нас есть какой-нибудь вор червяк виде рыбка который в принципе не могут ходить ногами по земле в этом и есть вся главная проблема наследования она не учитывает будущие изменения
03:22
которые с огромной вероятностью рано или поздно придется вносить в этот код вместо того чтобы просто добавить возможность плавать пингвинчику нам пришлось городить лютую хрень выводить новой сущности и чуть ли не переписывать весь этот грёбаный код связаны с нашим зоопарка и все это только добавляет проблем в будущем как нет стопроцентной гарантии того что это не заставит нас носить изменений в этот код но решение этой проблемы есть я даже могу сказать что этих решений существует огромное количество и некоторые из них я с радостью продемонстрирую первые самые
03:54
элементарные способ использовать интерфейс и вместо абстрактных классов все характеристики животных мы задаем отдельными интерфейсами например отдельный интерфейса walker будет сдавать контракт до наших типов что он должен иметь и реализацию метода волк который как раз таки отвечает за передвижение по земле потом создадим отдельный интерфейс у имя который будет определять метод в который в свою очередь содержит реализацию плавания потом уже создаём конкретный тип пингвина которые реализуют два этих интерфейсов [музыка]
04:27
будет и [музыка] алё extreme код вы обосрались а как же повторное использование кулады в чем в каждом зверьке быть по новый пилить алгоритм ходьбы или как к ну это проблема легчайшем образом решается шаблоном проектирования стратегии про который у нас кстати есть отдельное видео на канале рекомендую вам его посмотреть нужно просто расширить предыдущий пример для этого мы создадим новый интерфейс
04:59
action который будет отвечать за стратегии передвижения ну или в принципе каких-либо других действий которые могут совершать зверьки и затем мы сделаем конкретной реализации волка action issue in action [музыка] и
05:33
на [музыка] затем при помощи композиции просто добавим в инициализацию этих полей в пингвине и про бросим вызов методов в интерфейс нарисуем и волк [музыка]
06:21
все легчайшем образом мы можем расширять существующие класса а также наделял зверей различными функциональности при этом у нас логически ничего не ломается также используется вышеупомянутый полиморфизм так как мы конкретные стратегии передвижения просто об костюм к базовому интерфейсу действия ok а теперь рубрика мэтт сайнс на канале extreme код в шарпе 8 версии добавили возможность интерфейсом содержать реализацию методов по дефолту это например можно использовать в наших целях и расширить интерфейс и волкер яйцами
06:53
делается это следующим образом [музыка]
07:30
единственный недостаток этого способа в том что нам необходимы явно опросить объект нужному типу интерфейсом для того чтобы была возможность использовать его дефолтные методы [музыка] он [музыка] ok это на самом деле достаточно скучный способ да и доступен только тем кто являет последний dot net чулки которые сидят на легаси конечно пускают слезу типа как же так нам тоже
08:05
хочется хипстерских методологии так вот хорошей новости есть дедовский способ добавлять реализацию методов по дефолту в интерфейсах доступен она в доисторической версии тут не то а точнее с тех пор как появились методы расширения вообще эту методику можно назвать псевдо trade a mi pah боги конечно сейчас сидят кивают бла митька такие да да у нас тоже trade и есть мы крутые мы можем повторно использовать код без наследования уж так вот применив небольшую магию с абстрактным классом и обобщенным интерфейсом мы можем получить
08:35
следующую конструкцию в принципе не абстрактный класс не интерфейсы могут не содержать себе абсолютно ничего вся соль как раз таки в статическом классе в котором мы реализуем методы расширения для наших псевдо trade of на каждый такой trade можно создавать отдельный статичный класс в котором вы прописываете всю логику но я же запихнуть в кучу дабы не усложнять код
08:58
[музыка] ну вот в принципе и готова как мы видим все же созданном пингвине есть методы как ходьбы так и плавание все примеры которые я показала доступны в гитхабе ссылочка в описании так что можете зайти и самостоятельно ознакомиться со всем кодам теперь о насущном наследование следует использовать в каких-то системных штуках которые явно не будут
09:42
подвержены частым изменениям например при проектировании фреймворка что в принципе в том же тут найти и прослеживается на примере класса стримы всех его производных другой пример хорошего использования наследования можно пронаблюдать при реализации исключений абсолютно все из них реализованы от базовой эксепшен но проблема в том что исключение как и наследование тоже на хрен не нужны но об этом я расскажу в другой раз так что ставь лукасы и тогда я быстренько занимаюсь производством контент и что на эту тему когда мы используем наследование при
10:13
проектировании сущности связанных с бизнес логикой то с очень большой вероятностью мы наткнемся на выше продемонстрирую проблему когда мы просто лезем в базовый класс и полностью все ломаем путем изменения или добавления новых членов в интерфейсе класс на этом пожалуй все подписываемся на канал ставим безо тилль на колокольчик и лайк под видео [музыка]

DOWNLOAD SUBTITLES: