Уроки ООП

G
Завершён
1
автор
Размер:
5 страниц, 1 326 слов, 1 часть
Описание:
Примечания:
Посвящение:
Публикация на других ресурсах:
Уточнять у автора / переводчика
1 Нравится 0 Отзывы 1 В сборник

Урок 1

Настройки
Примечания:
Подземелья замка были переоборудованы. Вместо котлов — ряды мониторов с зелёным текстом на чёрном фоне. Вместо банок с ингредиентами — стеллажи с книгами по основам ООП, корешки которых, казалось, тоже боялись своего владельца. Профессор Снейп стоял у доски и писал мелом — он принципиально отказывался от проектора. На доске росла одна-единственная строка: абстрактный класс «Зелье», у которого есть метод «сварить», но нет ни единой подсказки, как именно его варить. — Откройте ваши... — он поморщился, — ноутбуки. Слово прозвучало так, будто он говорил «учебники по Прорицанию». Двадцать крышек щёлкнули одновременно. Невилл уронил зарядку. — Долгопупс. Пять баллов с Гриффиндора за попытку убить электрическую розетку. Невилл пробормотал извинения и полез под парту. — Мы пишем на Python, — произнёс Снейп, и Рон зачем-то поднял руку. — Сэр, а это потому что Python — это змея? Ну, Слизерин, парселтанг... выходит, мы теперь типа змееписцы? Разговариваем с кодом на змеином, как вы с Нагайной? В подземелье повисла тишина, в которой было слышно, как где-то крутится кулер. Снейп медленно повернулся. — Нет, мистер Уизли. — Пауза. Та самая, отточенная годами, — от которой даже компилятор бы занервничал. — Долбоёбы. Те, кто пишут на Python, называются долбоёбы, если пишут так, как сейчас напишете вы. Язык назван в честь комик-группы «Монти Пайтон», а не в честь змеи. Минус пять баллов с Гриффиндора за попытку превратить серьёзную дисциплину в зоопарк. И опустите руку — на сегодня вы исчерпали лимит мыслей. Он развернулся обратно к доске. — Сегодня мы поговорим о четырёх столпах. Не о тех, что подпирают потолок Большого зала, а о тех, без которых ваш код обрушится куда зрелищнее. Инкапсуляция. Наследование. Полиморфизм. Абстракция. Четыре слова, которые большинство из вас выучит к экзамену и не поймёт ни одного. — Начнём с того, что вы любите больше всего. С того, чтобы лезть туда, куда вас не звали. Инкапсуляция. Мисс Паркинсон. Пэнси дёрнулась. — Это... когда данные внутри объекта спрятаны? — «Спрятаны». — Снейп произнёс это так, будто попробовал слово на вкус, и оно ему не понравилось. — Инкапсуляция — не про то, чтобы прятать. Это про границу. Стена, за которой объект сам отвечает за своё состояние, а вы — снаружи — не суёте пальцы в его внутренности. Он навис над ближайшей партой. — У зелья есть температура котла. Если кто угодно снаружи может в любой момент выставить её в минус триста — у вас не объект. У вас открытый котёл посреди коридора, в который любой первокурсник плюнет. Хороший объект не даёт менять температуру напрямую. Он даёт метод «нагреть» — и сам проверяет, что вы не пытаетесь охладить зелье ниже абсолютного нуля, мистер Долгопупс. Подчёркивание перед именем поля означает «не трогай». Это не замок. Это просьба джентльмена. Он скользнул взглядом по Гриффиндору. — А поскольку джентльменов здесь меньшинство, для остальных язык предусмотрел двойное подчёркивание. Но если вам приходится защищать свой код от собственных однокурсников физически, мисс Грейнджер, — он не дал ей даже поднять руку, — это уже не инкапсуляция. Это семейная терапия. — Поттер. Что такое наследование? Гарри вздрогнул. — Это... когда один класс получает свойства другого? Снейп выдержал паузу. — Потрясающе. Вы только что процитировали первую строку статьи из Википедии. Слово в слово. Я впечатлён. Гермиона подняла руку. — Я не спрашивал, мисс Грейнджер. Я знаю, что вы знаете. Это никому не помогает. Опустите руку. Рука не опустилась. — Грейнджер. Рука опустилась. — Наследование, — Снейп начал расхаживать между рядами, и каждый студент инстинктивно прикрывал экран ладонью, — это не просто «получение свойств». Это — контракт. Когда вы объявляете, что ваше «Лечебное зелье» наследует «Зелье», вы обещаете, что ваш объект будет вести себя как зелье. Что у него будет метод «сварить». Что он не взорвётся при вызове. Он остановился у парты Малфоя. — Мистер Малфой. Что у вас? Драко с достоинством развернул ноутбук. Его «Эликсир» наследовал «Зелье», но метод «сварить» у него состоял ровно из одной осмысленной строки: варить — ниже моего достоинства, после чего вызывал того же метода у домашнего эльфа. Снейп несколько секунд смотрел на экран. — Делегирование домашнему эльфу. Технически... это работает. Принцип подстановки Барбары Лесков не нарушен: ваш эликсир по-прежнему можно использовать всюду, где ждут зелье. Пять баллов Слизерину за находчивость. Рон наклонился к Гарри: — Он поставил баллы за то, что Малфой заставил работать кого-то другого? — Уизли. Мне не нужно оборачиваться, чтобы знать, что вы шепчетесь. Покажите, что написали вы. Рон побледнел и открыл файл. Его «зелье» тоже наследовало «Зелье» и тоже имело метод «сварить». Внутри метода была ровно одна строка: комментарий «доделать потом» — и больше ничего. Заглушка. Метод, который обещал сварить зелье и молча ничего не делал. Тишина. — Поздравляю, Уизли. Вы написали класс, который обещает результат, а потом тихо вас обманывает. В реальном проекте из-за таких, как вы, падает продакшн в пятницу вечером. — Но оно же не падает! — возразил Рон. — Оно запускается! Снейп наклонился к нему. Близко. Слишком близко для code review. — Код, который «не падает», но не делает того, что обещает, — это худший вид кода. Это код, который лжёт. Вы бы предпочли зелье, которое взрывается в котле, или зелье, которое выглядит правильно, но медленно вас отравляет? Рон открыл рот. — Вопрос был риторический. Десять баллов с Гриффиндора. — Третий столп. Тот, ради которого мы вообще терпим первые два. Полиморфизм. Снейп обвёл взглядом аудиторию, как полководец перед заведомо проигранным сражением. — Представьте список: лечебное зелье, эликсир мистера Малфоя и... то, что написал мистер Уизли. Я прохожу по списку и каждому говорю одно и то же слово: вари. Ни одной проверки «а это лечебное или эликсир». Просто — вари. Он сделал паузу. — И каждый варит по-своему. Лечебное — лечит. Эликсир — будит эльфа. А зелье мистера Уизли гордо ничего не делает и роняет продакшн. Одна команда — разное поведение. Это полиморфизм. Не магия. Хуже. Дисциплина. Симус неуверенно поднял руку. — А если я не знаю заранее, какое зелье придёт? — В том и смысл, мистер Финниган. Вам и не нужно знать. — Снейп почти оживился, как человек, наступивший на любимую мозоль. — Плохой программист пишет двадцать проверок на каждый тип зелья и добавляет двадцать первую каждый раз, когда я изобретаю новое. Хороший — говорит «вари» один раз и идёт пить чай. Полиморфизм — это искусство не переписывать код каждый раз, когда мир оказывается сложнее, чем вы надеялись. А он всегда оказывается сложнее. Снейп постучал мелом по самой первой строке на доске — по той, с которой начался урок. — И вот мы вернулись к началу. К четвёртому столпу, который держал всё это с самого звонка, а вы его даже не заметили. Абстракция. Тишина стала чуть более внимательной. — «Зелье» — абстрактный класс. Вы не можете сварить «просто зелье». Не существует «зелья вообще» — существуют лечебные, оборотные, любовные. «Зелье» лишь говорит: чем бы ты ни было, ты обязано уметь вариться. Оно описывает что — и принципиально молчит про как. Он повернулся. — Абстракция — это умение отбросить лишнее. Когда вы говорите зелью «варись», вам не нужно знать, кипит ли там кровь дракона или мистер Малфой будит эльфа. Вам нужен результат. Детали — не ваше дело. Хорошая абстракция — это милосердие к тому, кто будет читать ваш код. Включая вас же через полгода, когда вы забудете, что вообще имели в виду. — Профессор, — не выдержала Гермиона, — но ведь абстракция и инкапсуляция — почти одно и то же, обе про сокрытие... — Нет. — Снейп произнёс это с такой окончательностью, что Невилл на всякий случай закрыл ноутбук. — Инкапсуляция прячет данные, чтобы вы их не сломали. Абстракция прячет сложность, чтобы вы её не видели. Первое — про границы. Второе — про то, что важно, а что нет. Путать их — всё равно что путать дверной замок с умением не задавать лишних вопросов. Минус пять баллов за то, что вы заставили меня объяснять разницу вслух. Снейп вернулся к доске и вывел одну строку: «SOLID — не предложение. Это приказ». — К следующему занятию каждый напишет иерархию классов для системы управления зельями. Минимум три уровня наследования. Интерфейсы. Абстрактные классы. Документация. — Документация? — переспросил Симус. — Я знаю, что для некоторых из вас написать комментарий к собственному коду — задача сложнее, чем сварить Феликс Фелицис. Но я верю в вас. Он не улыбнулся. Снейп никогда не улыбался. Но в уголке его рта что-то дрогнуло — может быть, подавленный сарказм, может быть, тень удовольствия. — И Долгопупс... Невилл замер. — Если ваш код ещё раз уйдёт в бесконечную рекурсию при создании объекта, я превращу ваш ноутбук в жабу. Это не метафора. Свободны. Студенты начали собираться. Гермиона задержалась, уже протягивая руку к клавиатуре Снейпа. — Профессор, я заметила, что ваш абстрактный класс «Зелье» не умеет сравнивать себя с другими зельями, а если вы планируете использовать зелья как ключи словаря... — Вон.
Примечания:
1 Нравится 0 Отзывы 1 В сборник