Ответом на кризис программного обеспечения стало ООП: сначала Simula 67, затем Smalltalk. Почему объединение данных и поведения оказалось таким удачным решением, разбирается в следующих модулях курса – пока важно, откуда эта идея взялась и как она стала стандартом.
Дальше много незнакомых терминов – так задумано. Сейчас важно увидеть, что принесли эти языки; разбираться в каждом понятии будем в следующих модулях.
Simula 67: класс, объект, наследование
1967 Уле-Йохан Даль и Кристен Нюгор, Норвежский вычислительный центр
Simula писалась не для «красивого кода», а для имитационного моделирования: очереди в порту, потоки клиентов, процессы на производстве. Такую задачу естественно описывать сущностями – корабль, причал, клиент, – у каждой своё состояние и своё поведение. Из этой практической нужды и выросли понятия, которыми мы пользуемся до сих пор:
- класс и объект – описание сущности и её конкретный экземпляр со своим состоянием;
- наследование – новый класс как уточнение существующего, без копирования его кода;
- виртуальные методы – подкласс подменяет поведение, а вызывающий код об этом не знает; отсюда позже вырастет полиморфизм;
- сопрограммы и сборка мусора – к самому ООП отношения не имеют, но появились там же.
Ключевое здесь – данные и работающие с ними процедуры впервые лежат в одном месте. Ровно то, чего не хватало процедурному коду.
Smalltalk: всё – объект
1972 – 1980 Алан Кэй, Дэн Ингаллс, Адель Голдберг, Xerox PARC
Simula добавила объекты в язык общего назначения, Smalltalk пошёл дальше и построил на них вообще всё. Заодно Алан Кэй ввёл сам термин «объектно-ориентированное программирование» – и вкладывал в него не классы, а обмен сообщениями между независимыми объектами.
- объект – единственная единица: числа, символы, сами классы – всё объекты;
- сообщения вместо вызовов: объекту посылают сообщение, а как на него ответить, он решает сам; отсюда позднее связывание и динамическая типизация;
- инкапсуляция без исключений: до состояния объекта нельзя добраться иначе, чем через его же методы;
- среда, а не компилятор: система живёт целиком, код правится и перезапускается на ходу. В Smalltalk-80 родился и MVC.
Языки, на которых мы пишем сегодня, взяли из обоих понемногу: классы и наследование – от Simula, живые объекты и позднее связывание – от Smalltalk.
От исследовательской идеи к индустрии
Массовым стандартом индустрии ООП сделали 90-е и бум доткомов. Большинство бизнесов переходит в интернет, и рабочими лошадками этой новой экономики становятся C++ и Java.
Дело было не в моде: объекты дали процедурному коду то, чего ему не хватало, – масштаб. Систему стало можно разрезать на части, каждую понимать и менять отдельно, а потом собирать из них продукты, которые ни один человек не прочитает целиком: операционные системы, СУБД, браузеры, банковский софт. Кризис 60-х решался именно этим.
Парадигма настолько понравилась сообществу, что практически все мейнстримные языки 90-х и 2000-х строятся на её основе. На ней же выросли архитектурные стили и паттерны проектирования, которым посвящён последний модуль курса.
Почему это важно помнить
ООП не было изобретено как «правильный способ писать код». Оно появилось как инструмент против конкретной проблемы: программу стало невозможно удерживать в голове, потому что данные и работающие с ними процедуры лежали в разных местах и менялись независимо.
Держите эту причину в уме, когда будете разбирать инкапсуляцию, наследование и полиморфизм: каждый из этих механизмов решает свою часть той же самой задачи.