ООП Flashcards

1
Q

Что такое ООП?

A

Объектно-ориентированное программирование.
ООП - методология программирования, использующая объекты, каждый из которых является экземпляром класса, образующего иерархию наследования. Программа в ООП состоит из объектов, обменивающихся сообщениями. Объекты могут иметь состояние, изменяемое посылаемыми сообщениями. Наследование, классы и абстрактные типы данных ключевые элементы ООП.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Назовите основные принципы ООП.

A
  1. Инкапсуляция - сокрытие реализации.
  2. Наследование - создание новой сущности на базе уже существующей.
  3. Полиморфизм - возможность иметь разные формы для одной и той же сущности.
  4. Абстракция - набор общих характеристик.
  5. Посылка сообщений - форма связи, взаимодействия между сущностями.
  6. Переиспользование- все что перечислено выше работает на повторное использование кода.

Это единственно верный порядок парадигм ООП, так как каждая последующая использует предыдущие.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое «инкапсуляция»?

A

Инкапсуляция в ООП - свойство системы, объединяющее данные и методы в классе, скрывающее детали реализации. Цель - избежать зависимости внешнего интерфейса класса от его реализации. Пример: модификатор private делает поля и методы видимыми только внутри класса, обеспечивая сокрытие и защиту от несанкционированного доступа.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое «наследование»?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое «полиморфизм»?

A

Полиморфизм в ООП - свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Пример: метод callAnotherUser класса User, который принимает абстрактный тип AbstractPhone и вызывает метод call для любого объекта, наследующего от этого типа (например, ThomasEdisonPhone, Phone, VideoPhone). Полиморфизм позволяет коду работать с разными объектами, используя общий интерфейс, и выбирать конкретную реализацию во время выполнения программы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое «абстракция»?

A

Абстракция в ООП - способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Пример: абстрактный класс Animal, содержащий абстрактный метод animalSound и обычный метод sleep. Конкретный класс Pig наследует от абстрактного класса Animal и реализует абстрактный метод. Абстракция позволяет описать общие свойства и действия, игнорируя детали реализации, что упрощает использование в коде.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что представляет собой «обмен сообщениями»?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Расскажите про основные понятия ООП: «класс», «объект», «интерфейс».

A

Класс в объектно-ориентированном программировании (ООП) представляет собой описание сущности, определяющей состояние и поведение, а также правила взаимодействия с этой сущностью.

Объект (или экземпляр) - это конкретный представитель класса, обладающий определенным состоянием и поведением в соответствии с определением класса.

Интерфейс - это набор методов класса, доступных для использования. Он определяет все возможные действия с объектом, являясь своеобразным контрактом, который класс должен соблюдать. Интерфейс содержит публичные методы и, в некоторых случаях, атрибуты, предоставляя внешнему коду определенные точки взаимодействия с объектом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?

A

Преимущества объектно-ориентированного подхода в программировании:

  1. Естественность:
    • Ориентирован на человеческое восприятие мира.
    • Улучшает читаемость и понимание кода.
  2. Конструирование из компонентов:
    • Позволяет создавать сложные системы из компонентов, обладающих простыми интерфейсами.
    • Абстрагирует от деталей реализации.
  3. Локализация кода и данных:
    • Улучшает наглядность и сопровождаемость кода.
    • Операции и данные описываются вместе, что улучшает организацию.
  4. Инкапсуляция:
    • Привносит свойство модульности.
    • Упрощает распараллеливание выполнения задач и обновление компонентов.
  5. Расширяемость:
    • Позволяет создавать расширяемые системы.
    • Добавление новых компонентов не требует изменения существующего кода.
  6. Полиморфизм:
    • Улучшает обработку разнородных структур данных.
    • Позволяет изменять поведение объектов во время выполнения.
  7. Повторное использование кода:
    • Сокращает время на разработку.
    • Уменьшает количество ошибок в многоразово используемых компонентах.
  8. Унификация:
    • Обеспечивает унифицированные структуры и интерфейсы при использовании стандартных компонентов.
    • Упрощает понимание и использование программ.

Недостатки объектно-ориентированного подхода в программировании:

  1. Сложность иерархий классов:
    • Поля и методы наследуются с разных уровней, что может затруднять определение, какие именно поля и методы относятся к классу.
  2. Размазанный код:
    • Обработка сообщений может быть размазана по многим методам, усложняя анализ кода.
  3. Сложности в документации:
    • Требует более тщательного документирования из-за возможности переопределения методов и широкого использования наследования.
  4. Неэффективность и расход памяти:
    • Издержки на динамическое связывание и проверки типов могут привести к неэффективности.
    • Накладные расходы на управление памятью.
  5. Избыточность:
    • Иногда содержит больше методов, чем необходимо текущей программе, что может стать мертвым грузом.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что подразумевают в плане принципов ООП выражения «является» и «имеет»?

A

В контексте принципов объектно-ориентированного программирования (ООП):

  1. “Является” (Is-A):
    • Этот термин обозначает отношение наследования между классами.
    • Он используется для описания отношения между базовым (родительским) классом и производным (потомком) классом.
    • Пример: “Квадрат является прямоугольником”. Здесь класс “Квадрат” наследует от класса “Прямоугольник”.
  2. “Имеет” (Has-A):
    • Этот термин обозначает отношение ассоциации между классами.
    • Он используется, когда один класс содержит экземпляры другого класса в качестве своих членов данных.
    • Ассоциация может быть агрегацией или композицией.
    • Пример: “Автомобиль имеет двигатель”. Здесь класс “Автомобиль” ассоциирован с классом “Двигатель”, предполагая, что двигатель является частью автомобиля.

Таким образом, “является” относится к иерархии наследования между классами, а “имеет” относится к связи между объектами различных классов, где один класс содержит другой.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

В чем разница между композицией и агрегацией?

A

В контексте объектно-ориентированного программирования:

  1. Агрегация:
    • Это отношение, при котором объект может включать в себя другие объекты, но эти объекты остаются независимыми.
    • Объекты-части могут принадлежать более чем одному объекту-целому.
    • Отношение агрегации обозначается стрелкой со стрелкой от объекта-целого к объектам-частям.
    • Пример: У класса Car есть отношение агрегации с классом Wheel, так как колеса могут быть использованы не только в одной машине.
  2. Композиция:
    • Это более строгий вид агрегации, при котором объект-часть является частью только одного объекта-целого.
    • Когда объект-целое уничтожается, все его объекты-части также уничтожаются.
    • Отношение композиции также обозначается стрелкой со стрелкой от объекта-целого к объектам-частям, но с добавлением заполненного ромба к стрелке.
    • Пример: У класса House может быть композиционное отношение с классом Room, так как комнаты могут существовать только внутри дома и уничтожаются, когда дом уничтожается.

Таким образом, разница между композицией и агрегацией заключается в степени тесности связи между объектами и их жизненным циклом. Композиция более сильная связь, и объекты-части зависят от объекта-целого настолько, что они не могут существовать независимо. В случае агрегации объекты-части могут существовать независимо от объекта-целого.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Что такое статическое и динамическое связывание?

A

Статическое и динамическое связывание представляют собой два различных подхода к привязке вызова метода к его реализации.

  1. Статическое связывание (раннее связывание):
    • Происходит во время компиляции программы.
    • Компилятор определяет, какой метод вызывать на основе типа переменной или выражения в момент компиляции.
    • Пример: В статически типизированных языках, таких как Java или C++, тип переменной определяется на этапе компиляции, и вызов метода определяется статически, до выполнения программы.
  2. Динамическое связывание (позднее связывание):
    • Происходит во время выполнения программы.
    • Решение о том, какой метод вызывать, принимается в момент выполнения на основе фактического типа объекта, на который ссылается переменная.
    • Пример: В языках с динамической типизацией, таких как Python или JavaScript, тип переменной может изменяться во время выполнения, и вызов метода определяется динамически, когда программа выполняется.

Преимущество динамического связывания заключается в большей гибкости, так как это позволяет изменять тип объекта во время выполнения. Однако это также может привести к ошибкам, если тип объекта не соответствует ожидаемому.

В языках, таких как Java, где используется виртуальная машина (JVM), все методы, кроме final, static и private, используют динамическое связывание. Это означает, что решение о том, какой метод вызывать, принимается во время выполнения на основе фактического типа объекта, что обеспечивает гибкость полиморфизма.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly