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
проектировании сущности связанных с
бизнес логикой то с очень большой
вероятностью мы наткнемся на выше
продемонстрирую проблему когда мы просто
лезем в базовый класс и полностью все
ломаем путем изменения или добавления
новых членов в интерфейсе класс
на этом пожалуй все подписываемся на
канал ставим безо тилль на колокольчик и
лайк под видео
[музыка]
Watch, read, educate! © 2021