Объектно-ориентированное программирование
| English | Русский |
|---|---|
| object/ˈɒbdʒekt/ | самого тела |
| encapsulation/ɪnˌkæpsjʊˈleɪʃn/ | инкапсуляции |
| class/klæs/ | класс |
| instance/ˈɪnstəns/ | экземпляр |
| constructor/kənˈstrʌktə/ | конструктор |
| inheritance/ɪnˈherɪtəns/ | наследование |
| subclass/ˈsʌbklæs/ | подкласс |
| superclass/ˈsuːpəklæs/ | суперкласс |
| polymorphism/ˈpɒlɪmɔːfɪzəm/ | полиморфизм |
| abstraction/əbˈstrækʃn/ | абстракцией |
| containment/kənˈteɪnmənt/ | вложенность |
| aggregation/ˌæɡrɪˈɡeɪʃn/ | агрегация |
Изменение в одном месте, которое раньше требовало изменений в пятидесяти
- Программа хранит баланс клиента как публичное число. Двадцатьdirname читают его, а пятнадцать записывают. Теперь баланс никогда не должен становиться отрицательным.
- Без объектов это правило приходится добавлять в пятнадцати местах, и в тот день, когда кто-то добавляет шестнадцатый источник записи, правило снова нарушается.
- Для объектов состояние приватно, и изменить его можно только с помощью метода, который обеспечивает соблюдение правила. Есть одно место для добавления этого правила и нет обходных путей.
- Это инкапсуляция, и именно поэтому существует объектно-ориентированное программирование. Этот урок посвящён объектам, классам и четырём столпам.
Объекты и классы
- Объект объединяет атрибуты, свои данные, и методы, операции, действующие на эти данные. Это единица состояния и поведения вместе.
- Класс — это чертёж: он определяет, какие атрибуты и методы будет иметь каждый объект такого типа. Объект — это экземпляр класса со своими собственными значениями.
- Один
Taxiкласс, а каждая фактическая такси является объектом со своей регистрацией и вместимостью.

Атрибуты сверху, методы снизу, их видимость отмечена
Лабораторная работа по программированию
Сопоставьте примеры с показанной ими программной идеей.
Объект объединяет:
Объект объединяет свои данные (атрибуты) с операциями (методами), которые действуют над ним.
Какова связь между классом и объектом?
Один класс Taxi определяет атрибуты и методы; каждая реальная такси — это объект со своей емкостью и регистрацией.
Конструкторы, геттеры и сеттеры
- Конструктор — это специальный метод, который выполняется при создании объекта, чтобы установить его атрибуты в допустимые начальные значения.
- Поскольку атрибуты приватны, класс предоставляет геттер-методы (get) для чтения значения и сеттер-методы (set) для его изменения. Метод сеттера — это место, где обеспечивается правило, например «никогда не быть отрицательным».
- Именно это делает наличие приватного атрибута целесообразным: правило обеспечивается при любом изменении, потому что нет другого пути к данным.
CLASS Taxi
PRIVATE Capacity : INTEGER
PUBLIC PROCEDURE NEW(StartCapacity : INTEGER)
Capacity ← StartCapacity
ENDPROCEDURE
PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
RETURN Capacity
ENDFUNCTION
ENDCLASS
Конструктор — это специальный метод, который:
Конструктор инициализирует атрибуты нового объекта во время создания.
Столп 1: инкапсуляция
- Инкапсуляция означает, что данные объекта скрыты за его методами. Атрибуты приватны; внешний код использует публичные методы.
- Два преимущества, и экзамен требует оба: объект может обеспечивать соблюдение собственных правил при каждом изменении, а внутреннее представление можно безопасно изменить позже, поскольку от него не зависит никакой внешний код.
- Хранить баланс сегодня в фунтах, а завтра в пенсах: каждый пользователь класса по-прежнему вызывает
GetBalance(), и ничего снаружи не сломается.
Инкапсуляция означает:
Инкапсуляция скрывает данные; внешний код использует публичные методы, поэтому внутреннюю часть можно изменять безопасно.
Что дает инкапсуляция? Выберите все подходящие варианты.
Инкапсуляция относится к поддерживаемости и корректности, а не к скорости. Приватные данные с публичными методами обеспечивают обе эти возможности.
Столп 2: наследование
- Наследование позволяет определить подкласс относительно суперкласса, беря все его атрибуты и методы, а затем добавляя собственные или переопределяя их.
- Оно моделирует отношение «является» (is-a): Менеджер является Сотрудником, поэтому
Managerнаследует отEmployeeи добавляет отдел. - Преимущество заключается в том, что общий код пишется один раз в суперклассе, и любое изменение в нём затрагивает все подклассы.

Общая часть находится сверху; различия находятся снизу
Наследование моделирует отношение «является» (Manager является Employee), поэтому подкласс наследует и расширяет свой суперкласс.
Наследование — это специализация отношения «является»; отношения «имеет» моделируются с помощью композиции.
Наследование моделирует отношение «____ a», например, когда Manager является Employee.
У автомобиля есть двигатель, что является композицией, а не наследованием. Правильное понимание этого различия проверяется в вопросе.
Столпы 3 и 4: полиморфизм и абстракция
- Полиморфизм означает, что разные объекты реагируют на один и тот же вызов метода своим собственным образом. Каждый
Shapeимеет методArea();CircleиRectangleреализуют его по-разному. - Его ценность: код может перебирать список фигур, вызывая
Area()для каждой из них, не зная и не заботясь о том, какой это тип. Если позже добавить классTriangle, этот цикл вообще не потребует изменений. - Абстракция означает отображение простого интерфейса и сокрытие сложности за ним: вызывающий код для
Area()не должен знать ничего о геометрии.
Полиморфизм позволяет:
Один и тот же вызов (например, Area()) ведет себя корректно для каждого типа — вызывающему коду не нужно знать точный класс.
Расставьте последствия полиморфизма по порядку: от определения до преимущества.
один вызов, несколько реализаций, и код, использующий их, никогда не должен узнавать о новых.
Разобранный пример: назовите столп
- Класс
BankAccountхранит свой баланс приватно и предоставляет методыDeposit()иWithdraw(), которые отказываются делать его отрицательным. Инкапсуляция: данные скрыты, а правило обеспечивается единственными путями доступа к ним. - Класс
SavingsAccountопределен какBankAccountс добавленной процентной ставкой. Наследование: отношение is-a, переиспользование кода суперкласса. - Цикл вызывает
Print()для каждого документа в списке, и каждый тип печатает себя по-разному. Полиморфизм: один вызов, несколько реализаций. - Назовите столп и характеристику сценария, которая его демонстрирует.
Соотнесите каждый столп ООП с его значением.
Инкапсуляция = скрытие; наследование = специализация «является»; полиморфизм = одинаковый интерфейс, разнообразное поведение.
Разобранный пример: почему ООП для крупной системы
- Назовите два преимущества использования объектно-ориентированного программирования для крупной системы. [4]
- Инкапсуляция означает, что внутренности каждого класса можно изменять без влияния на остальную программу, поэтому систему легче поддерживать, а команда может работать над классами параллельно.
- Наследование означает, что общее поведение пишется один раз и переиспользуется, поэтому меньше дублированного кода, и исправление применяется везде одновременно.
- Полиморфизм означает, что новые типы можно добавлять без изменения кода, который их использует. Каждый ответ — это характеристика и её последствие.
У команды есть игроки; она не является игроком
- Композиция означает, что объект содержит другой объект как свой атрибут. В агрегации содержимый объект может существовать независимо: команда
Teamхранит ссылки на объектыPlayer, которые могут перейти в другую команду. - Выбирайте по типу отношения: команда
Goalkeeperявляется игрокомPlayer— используйте наследование; командаTeamсодержает игроков — используйте агрегацию. Наследование игроком метода командыKick()является ошибкой проектирования, даже если команде хотелось бы ударить со штрафного.
Команда хранит ссылки на объекты Игрока. Игроки сохраняются после удаления команды. Какое отношение подходит?
Команда содержит независимые объекты Игроков. Наследование требовало бы отношения «является» (is-a).
Разобранный пример: спроектируйте команду без копирования её игроков
- Известно: у
Playerесть приватное имя иGetName()метод. СпроектируйтеTeamс приватной коллекциейMembers, содержащей ссылки на объектыPlayer, иAddPlayer(NewPlayer)методом, добавляющим ссылку. - Игрок
Playerможет существовать до создания команды, а команда может быть удалена при сохранении игроков. Это агрегация. Изменение имени игрока через его собственный метод будет видно всем объектам, хранящим ссылку на него; скопированная строка имени станет устаревшей.
Player object: name = "Sam"
Team object: Members = [reference to Sam's Player object]
Goalkeeper class: inherits the Player attributes and methods
В этой архитектуре удаление Команды должно также уничтожить все содержащиеся в ней Игроки.
Игроки существуют независимо. Удаление команды удаляет ссылки на неё, но не обязательно сами объекты Игроков.
Соотнесите каждую архитектуру с её типом связи.
Наследование моделирует отношение «является»; агрегация моделирует отношение «имеет» с независимыми объектами; инкапсуляция контролирует доступ к данным.
Потерянные баллы
- Класс — это чертёж, объект — это его экземпляр. Не используйте эти слова взаимозаменяемо.
- Инкапсуляция — это сокрытие данных за методами, а её преимущества — обеспечение соблюдения правил и безопасное изменение внутренних деталей. Фраза «это более безопасно» слишком расплывчата.
- Наследование — это отношение is-a (является). У машины есть двигатель, что является композицией, а не наследованием.
- Полиморфизм — это одинаковый вызов, ведущий себя по-разному в зависимости от класса, что позволяет добавлять новый подкласс без изменения существующего кода.
Вы поняли
- Объект объединяет атрибуты и методы; класс — это чертёж, а объект — это экземпляр, настроенный с помощью конструктора.
- Инкапсуляция: приватные данные за публичными методами, благодаря чему правила соблюдаются при каждом изменении, а внутренние детали можно менять безопасно.
- Наследование: подкласс принимает членов суперкласса и добавляет или переопределяет их, моделируя is-a иWriting shared code once (пишет общий код один раз).
- Полиморфизм: одинаковый вызов, реализованный по-разному для каждого класса, поэтому новые типы не требуют изменений в существующем коде; Абстракция: простой интерфейс, скрывающий сложность.