Здравствуйте, дорогие друзья!
Начинаем презентацию курса «Теория ООП на С#»
Да, это будет практический подход. Видеокурс этот экспериментальный. Эксперимент заключается в том, что в нашем видеокурсе каждый урок всего по 10 минут – 9, 8, 9, 9, 10. Один, правда 25-минутный – небольшой такой теоретический, 14. Но в целом – каждый урок короткий.
Рис. 2. Скрин экрана-1
И должен заметить, эксперимент удался – легко выполнять эти уроки, информации не так много, ее можно быстро усвоить, и самое главное – повторить и убедиться в том, что все работает.
Всего в этом курсе 39 видеоуроков общей продолжительностью 7 часов 40 минут.
Рис. 3. Скрин экрана-2
Я подготовил специальную презентацию о том, чтобы рассказать о каждом уроке: что мы будем делать, как делать, зачем, и что получится в итоге, чему вы в конце концов научитесь.
Весь видеокурс разделен на 2 части. До 22 урока включительно – это создание геометрических примитивов, их рисование, обработка. А потом, после 23 урока, после 24 даже, мы начнем создавать одну интересную простенькую игру в догоняшки с использованием интерфейса.
Но обо всем по порядку.
Рис. 4. Инкапсуляция мечты
Что же такое инкапсуляция, и зачем она нужна – именно это вы увидите в самом первом уроке. Необходимо будет дать определение этого термина своими словами, не очень замысловато, а так, как вы понимаете.
Изучение материала наглядно и понятно потому, что сначала мы будем писать программы обычным способом – как на Бейсике, в лоб, как называется решение. А потом переделывать их под объектную модель, чтобы сразу был виден смысл этих действий.
Дело в том, что рано или поздно мы столкнемся с моментом, что такой вот «обычный» способ решения задачи в лоб исключает возможность модификации этой программы, легкой модификации. И мы будем постепенно рефакторить программу, подходя с позиции «как?» Вернее, вы сами убедитесь в том, что необходимо это сделать, даже если часто задаете вопрос – зачем же все так усложнять?
Забегаю немножко вперед, но давайте сейчас еще такое лирическое отступление сделаем.
Рис. 5. Подведение итогов от бабушки Ларисы
Хочу похвастаться – подведение итогов от бабушки Ларисы – именно так можно ее назвать – ей 75 лет, она записалась на этот видеокурс, великолепнейшим образом его прошла, и составила вот такой отчет, чему она научилась и что было сложным, что было интересным.
Рис. 6. Карточка регистрации бабушки Ларисы
Сейчас даже покажу ее карточку – 75 лет, город проживания – Киев, и даже включу ее видеообзор, чтобы вы услышали ее голос, что на самом деле ей 75 лет:
(голос бабушки)
- Здравствуйте, участники проекта Videosharp.info, здравствуйте, Евгений Витольдович!
Это видео-отчет о другой программе «Хранитель экрана», который тоже рекомендую пройти потому, что там тоже объектно-ориентированная модель используется.
Ну что ж, надеюсь, что вы прочитали вкратце, и наконец-таки приступим к следующему пункту.
Рис. 7. Второй урок «Рисование»
Мы нарисуем домик из двух линий и прямоугольника. Как я и говорил, мы будем рисовать в лоб, то есть:
И все у нас получится замечательно.
Рис. 8. Рисуем домик
Дальше – ага, вот это то, что у нас получится. Вот такой домик незамысловатый и вот даже весь алгоритм, как это все будет получено, какая программа. Спасибо Александру Львовичу, это, по всей видимости, его отчет.
Рис. 9. Круглый класс
Дальше мы будем создавать круглый класс. Круглый – потому что для окружности будет создаваться. Создадим класс Circle, дополним окружность в центре домика – класс создали, надо его как-то использовать. Вот в центре домика нарисуем эту окружность.
Рис. 10. Структура пикселя
Дальше мы обратим внимание, что каждая точка у нас требует две переменные, и вполне логично завести структуру для пикселей. На самом деле в языке C# уже есть хорошая структура Point, но мы не будем ее использовать, а создадим свою, чтобы как бы чувствовать все, что мы делаем, как оно все добавляется в наш проект, чтобы как бы контролировать все изменения.
Я рекомендую вот эту ссылочку открыть и посмотреть замечательнейшую статью о том, чем отличается структура от пикселя. Я настолько воодушевился этой статьей, что на следующем видеоуроке записал 25-минутное объяснение своими словами, чем структура отличается от класса. Да, 7 главных отличий.
Причем сделано это было не просто – это и это, а на примере с пошаговым прохождением: где начальные данные, как они отличаются, где data values, где объектное значение, и так далее. Короче, очень даже подробно и досконально рассмотрели этот вопрос.
Рис. 12. Продолжаем рефакторить
Следующие 5 уроков мы продолжаем рефакторить. Вот мы нарисовали домик и окружность по центру. Больше ничего не менялось в нашей программе, не меняется, но мы начинаем рефакторить:
Рис. 13. Рисуем снеговика
Вот такой результат у нас получился, и слева можете посмотреть, как это примерно выглядело. Не сказать, что прямо вот супер-пупер, но вот пиксели создавались – одна окружность, другая окружность, и конечно, сейчас уже чувствуется, что код хоть и использует структуры, классы, но очень такой тяжелый… Даже вернее, не код, а управление этими графическими примитивами достаточно проблематичное.
Хотелось бы как-то это все-таки упорядочить, чем мы и будем заниматься дальше. Кстати, да, каждый рисует, что хочет, Артур вот нарисовал два танчика.
Рис. 14. Рисунок Артура «2 танчика»
Наконец-то мы возьмемся за наследование, и будем убирать повторяющийся код из цветных классов и осмысливать значение термина «наследование».
Если кратко, наследование – это когда мы берем два класса, у которых очень много общего – вот это все общее выделяем в отдельный класс, родительский, и каждый из этих классов наследуется от того.
Тут я, конечно, не могу в 10 минутах все рассказать, что за 39 уроков рассказано, но хотя бы, чтобы у вас было общее представление, о чем мы будем разговаривать.
Рис. 16. Фигуральный базовый класс
Дальше мы создаем очень интересный класс – фигуральный базовый класс. Фигуральный от слова «фигура». Смотрите, здесь
snowman = new Shape;Shape – это фигура. Будет 7 фигур в этом массиве, и каждая фигура может быть чем угодно: или это цветная окружность или цветная линия, или цветной прямоугольник.
И, тем не менее, все эти разноцветные и разнообразные фигуры помещаются в один массив потому, что все они унаследованы от Shape и все они являются фигурой.
После размещения фигур в массив можно видеть, что каждая фигура в нем хранится под своим типом, а все под одной крышей они могут находиться, так как все они унаследованы от Shape .
Едем дальше.
Рис. 17. Следующие 5 уроков
Следующие 5 уроков мы будем использовать эти нововведения. У нас будет:
Что такое полиморфизм и зачем он? Каждая фигура имеет свой метод Draw и, в зависимости от того, чем является элемент списка – та фигура или другая, вызывается соответствующий метод рисования. И все это работает самостоятельно, без дополнительных кучи проверок.
Сначала нам пришлось, когда мы начали переезд на этот Draw, делать длинный список if-ов – вот тут он очень длинный: «Если фигура – линия, рисуем так, если фигура – цветная линия – рисуем так!» А когда мы подключили полиморфизм, то все это стало выглядеть значительно короче.
Здесь его, к сожалению, нет, просто Draw для каждого метода вызван, и потом рисуем все, как надо. Не знаю, насколько понятно, но в уроках уделено время для того, чтобы подробно каждый элемент, каждый момент рассмотреть.
Я особо горжусь этим курсом потому, что он о теории с практикой, практический подход к каждому аспекту, то есть не просто – так или так и какие-то непонятные примеры, а вот доводим до такого момента, что уже чувствуется, что уже необходимо применить полиморфизм и видим, как это применяется.
Классный видеокурс!
Рис. 18. Перемещение круга
Дальше – перемещение круга. Под конец первой части мы задумали создать метод Move, который перемещает. Само перемещение мы делать не стали, просто получилось две картинки нарисованные, но тем не менее, мы создали метод Draw, и не только для окружности, но и потом для остальных классов, и даже наш снеговик переместился на несколько пикселей.
Рис. 19. Перемещение других фигур
Вот на этих двух уроках мы этим и занялись. Для этого нам не нужно будет менять метод Draw, мы воспользуемся полиморфизмом - опять же это все у нас будет друг с другом связано.
Прочитайте отзывы от Владимира Андреева и Александра Львовича в полуфинальных уроках о первой части нашего видеокурса.
Рис. 20. Отзывы о полуфинальном уроке
А я сейчас вам покажу, какая программа получилась в результате. Самая высокая ценность в некотором смысле – это класс Shape, который является абстрактным, то есть нельзя его экземпляр создать, в нем есть также абстрактный метод Draw и для полиморфизма виртуальный метод Move.
Рис. 21. Результат
Потом, например, для окружности – окружность является фигурой Shape – наследуется, и вот для окружности переопределяется метод Draw, а также реализуется абстрактный метод – да, тут метод Move не переопределялся потому, что он не менялся, а вот абстрактный метод Draw, конечно же, необходимо было переопределить override.
Дальше вот еще интересно Color Circle – это не просто фигура. Для Circle у нас тут несколько наследований используется, и это очень даже оправданно.
Еще хочу показать класс Sprite, который является тоже фигурой, но он в себя включает список вот этих вот фигур. И тут вот, кстати, переопределяется метод Move, который сначала вызывает у базового класса Move, а потом в цикле для всех этих фигур, которые у нас в массиве есть, тоже вызывает метод Move, как нужно. Ну, и для рисования Draw тоже, конечно же, переопределено.
И вот эта вся структура замечательно работает, и как она создавалась рассказывается во всем этом видеокурсе. Можно конечно запустить программу, но выглядит она не так красочно, как хотелось бы. Здесь вся идея – это все-таки теоретическая часть.
А вот вторая часть у нас была более практическая и мы сейчас приступим ко второй части, которая называется «Интерфейс».
Рис. 22. Интерфейс
Что такое интерфейс и зачем он нужен? Чтобы ответить на этот вопрос, мы написали небольшую игрушку, на примере которой стало понятно, зачем необходим интерфейс.
Ребята! На самом деле очень – не один день и даже не одну неделю думал о том, что взять за основу для примера. Что такое интерфейс я, конечно же, сам хорошо знаю, но вот как, не слишком углубляясь в дебри, тем не менее продемонстрировать, что он на самом деле нужен этот интерфейс, что в некоторых случаях без него не обойтись. Но в каких случаях и как?
И вот то, что я придумал для этой цели, и рассказано во второй части этого курса «Теория ООП».
Рис. 23. Правила и алгоритм игры
Мы начали с правил игры. Игра «Догоняшки», или «сифа», как ее по-другому называют. На прошлом уроке мы выясняли, что должны уметь делать игроки, и на этом уроке мы создали интерфейс «Игрок». Я умышленно назвал его по-русски, и поля тоже назвал по-русски – можете меня за это поругать, но, тем не менее, я придерживаюсь вариантов, что экспериментировать хорошо и можно по-русски называть переменные.
И здесь это используется для того, чтобы увидеть, куда в код программы переходят вот эти русские названия, где этот интерфейс реально был задействован. Поэтому я использовал русские буквы, чтобы на этом акцентировать внимание.
Так вот, игрок умеет бежать, умеет становиться Голи или не Голи, а также может ответить, поймал он кого-то или не поймал.
Сейчас я, конечно, не буду подробно объяснять, а вот этот класс GameCatch соответственно и обеспечивает правила игры и алгоритм какой-либо игры. Catch – это поймать – вот догоняшки.
Рис. 24. Создаем кружок
Дальше создаем кружок – должны быть какие-то объекты, которые умеют играть. На этом уроке мы создадим объект кружок – у него есть координаты центра, радиус, цвет. И цель этого урока была собственно создать класс.
Рис. 25. Площадка для игры
После того, как мы его создали, нам необходимо их куда-то запустить, предоставить арену, где они могут играть. И для этой цели подошел класс Arena, у которого есть какие-то границы, который может кого-то показать, обновить, добавить новую окружность или что-нибудь там еще, и получилась достаточно интересная структура для этого класса.
Рис. 26. Кружок на площадке
Дальше, когда у нас есть площадка, мы можем этот кружок на площадку запускать. Вот у нас есть Arena, с такими полями и методами, и окружность.
Рис. 27. Запуск кружков на площадку
Все готово к созданию кода для отображения кружка, и на следующем уроке мы запускаем кружочки на нашу площадку. Пока они просто нарисованы, никуда не двигаются, и при нажатии на плюсик, вызывается функция, которая сразу 10 окружностей добавляет, чтобы много не щелкать.
И получается достаточно классно, оживленно, уже повеселее становится – то были снеговики с 3 кругами, а тут окружностей целая куча!
Рис. 28. Кружок хочет играть, кружок готов к игре!
Ну что ж, кружки появились, но надо же, чтобы была игра, чтобы они бегали! Кружок хочет играть, кружок готов к игре! И для того, чтобы у нас игра произошла, мы Circle наследуем от интерфейса Игрок, то есть говорим о том, что эта окружность умеет играть, она является игроком, и чтобы она была игроком, необходимо реализовать вот эти 4 метода, и даже дополнительно добавить переменную, которой не было, но тут она пригодится. Это смещение – куда он едет, в какую сторону step_x, step_y.
Да, в конце урока я ответил на многочисленные вопросы, которых было – уйма! Столько всего интересного, и для начала непривычного, необычного, но я очень подробно ответил на все вопросы.
Рис. 29. Кружочки гоняются друг за другом
Кружочки гоняются друг за другом. Да, на этом уроке мы разместим наконец-таки таймер и запустим нашу игру – и уже кружочки начнут бегать.
Рис. 30. Изменяем правила и создаем новую игру
Дальше, то есть к этому этапу мы уже создали готовую игру, и теперь появилась идея – а не создать ли нам какую-то новую игру? То был GameCatch, а пусть будет GameVirus! Смысл игры подробно рассказан во время урока, и мы создали этот класс, и классно! У нас так быстро получилась новая игра потому, что игроки у нас уже есть – нам нужно было просто составить новые правила и сказать: «Дорогие игроки! У нас теперь новые правила!»
Причем в классах игроков ничего не нужно было менять, потому что правила игры обеспечивает арбитр, он говорит, кто Голя, кто не Голя, Поймал – не поймал, задает вопрос, и это вообще – супер! Вся прелесть объектно-ориентированного программирования!
Рис. 31. Интерфейс
Вот на финальном уроке мы дописали две последние функции и надолго залипли к экрану, наблюдая за новой игрой для наших кружков. Я даже покажу, как она выглядит.
Рис. 32. Финальный урок
Это наш интерфейс, с которого все началось. И сейчас мы понабираем – да, потом еще VIP-урок будет. И вот тут игра вирус – красненькие, когда затрагиваются до темненьких, все становятся вирусами. Потом, кто остался один, он считается уже завирусованным, и начинается игра заново. И когда фигур очень много, достаточно интересно наблюдать. Можем еще что-нибудь добавить.
Реально можно долго смотреть на эту игру, как она интересно реализовывается, как вирус распространяется, и самая прелесть, что мы создали новую игру буквально просто определив, создав новый класс GameVirus, который определяет правила игры в отличие от GameCatch. У них вот есть список игроков и все такое.
А все начинается с интерфейса. Почему он нужен при создании программы стало ясно, для чего он в самом деле необходим, почему без него не обойтись.
Рис. 34. VIP-квадратики тоже хотят играть
Я далеко не всем рекомендую приходить к VIP -урокам, но если хотите – пожалуйста! VIP-квадратики тоже хотят играть – пересечение прямоугольников, тяжелая дружба кругов и квадратиков. Там возникли некоторые сложности – как определить, окружность с квадратом пересекается или не пересекается? Или окружность с окружностью.
И на этом уроке яркий способ – чего стоит избегать в программах, что не стоит сравнивать конфеты со слонами, что круги – это круги, квадраты – это квадраты, но все равно, поскольку они бегают на одной арене, хочется им какие-то правила написать.
И вот получился достаточно сложный алгоритм для того, чтобы это все реализовать.
Рис. 35. Записывайтесь на курс «Теория ООП»
Записывайтесь на курс «Теория ООП». Это уникальный, замечательный получился проект, видеокурс – 39 уроков в нем, и каждый урок достаточно короткий и проходится на одном дыхании. И вот что интересно, мне особо удивительно – во второй части, полуфинальный урок – вон сколько человек прошло, почти 30, и только пятерки, только пятерки оценены – это удивительно! Вообще везде 4,9-5 баллов – круто!
Но так оно и есть! Замечательный урок, я был в восторге! И еще, кстати, хочу добавить, что вот эту всю вторую часть, от 24 до 39 урока мы записали на одном вебинаре, который длился 5,5 часов - 6 вечера начали, и почти до полуночи это все создавали. Но получилось классно! Правда потом пришлось последние три урока переписывать на следующий день, а то я там уже совсем запутался.
Ну, что ж, дорогие друзья! Записывайтесь на курс «Теория ООП», уверен, он вам понравится, и до встречи на наших уроках.
Автор: Волосатов Евгений Витольдович.
Написать комментарий: