Программа курса← Объектно ориентированное программирование
1История ООП
2Объект и Класс
3Базовые концепции ООП
4Принцип проектирования GRASP
5Принцип проектирования SOLID
6Паттерны GOF

Simula и Smalltalk

Ответом на кризис программного обеспечения стало ООП: сначала 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-х строятся на её основе. На ней же выросли архитектурные стили и паттерны проектирования, которым посвящён последний модуль курса.

Почему это важно помнить

ООП не было изобретено как «правильный способ писать код». Оно появилось как инструмент против конкретной проблемы: программу стало невозможно удерживать в голове, потому что данные и работающие с ними процедуры лежали в разных местах и менялись независимо.

Держите эту причину в уме, когда будете разбирать инкапсуляцию, наследование и полиморфизм: каждый из этих механизмов решает свою часть той же самой задачи.