ООП Flashcards

1
Q

Что такое объект?

A

Объект — конкретный экземпляр класса созданный по шаблону.

Объект — часть кода, которая описывает элемент с конкретными характеристиками и функциями. Карточка товара в каталоге интернет-магазина — это объект. Кнопка «заказать» — тоже.

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

Что такое класс?

A

Класс - шаблон, на базе которого можно построить объект в программировании. Например, у интернет-магазина может быть класс «Карточка товара», который описывает общую структуру всех карточек. И уже из него создаются конкретные карточки — объекты.

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

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

Что такое метод?

A

Метод - функция внутри объекта или класса, позволяющая взаимодействовать с ним или другой частью кода.

В примере с карточками товара метод может:

● Заполнить карточку конкретного объекта нужной информацией.
● Обновлять количество товара в наличии, сверяясь с БД.
● Сравнивать два товара между собой.
● Предлагать купить похожие товары.

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

Суть: все данные и методы необходимые для работы объекта должны находиться внутри объекта и не должны быть доступны снаружи.

Доступ к методам и переменным ограничивается, что предотвратит изменение данных извне.

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

Например, метод для внесения данных в карточку товара должен обязательно быть прописан в классе «Карточка товара». А не в классе «Корзина» или «Каталог товаров».

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

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

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

A

Наследование — Функциональность дочернего класса наследуются от уже родительского класса.

В этом принципе — вся суть объектно-ориентированного программирования.
Разработчик создаёт:

● Класс с определёнными свойствами;
● Подкласс на его основе, который берёт свойства класса и добавляет свои;
● Объект подкласса, который также копирует его свойства и добавляет свои.

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

Например, в каталоге товаров:

У класса «Карточка товара» есть атрибуты тип товара, название, цена, производитель, а также методы «Вывести карточку» и «Обновить цену».
Подкласс «Смартфон» берёт все атрибуты и методы, записывает в атрибут «тип товара» слово «смартфон плюс добавляет свои атрибуты — «Количество сим-карт» и «Ёмкость аккумулятора».
Объект «Смартфон Xiaomi 11» заполняет все атрибуты своими значениями и может использовать методы класса «Карточка товара».
Наследование хорошо видно в примере кода выше, когда сначала создавали класс, потом подкласс, а затем объект с общими свойствами.

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
  1. Легче писать
  2. Легче читать
  3. Легче обновлять
  4. Переиспользуемый код
  5. Легче работать в команде
  6. Шаблоны проектирования

● В парадигме объектов легче писать код. Удобно один раз создать класс или метод, а потом его использовать. Не нужно повторно переписывать десятки строк кода. Можно пользоваться специальными рекомендациями по написанию ООП-кода — SOLID.
Читать код гораздо проще. Даже в чужом коде обычно сразу видны конкретные объекты и методы, их удобно искать, чтобы посмотреть, что именно они делают.
Код легче обновлять. Класс или метод достаточно изменить в одном месте, чтобы он изменился во всех наследуемых классах и объектах. Не нужно переписывать каждый объект отдельно, выискивая, где именно в коде он расположен.
Программистам удобнее работать в команде. Разные люди могут отвечать за разные объекты и при этом пользоваться плодами трудов коллег.
Код можно переиспользовать. Один раз написанный класс или объект можно затем переносить в другие проекты. Достаточно однажды написать объект «Кнопка заказа» и потом можно вставлять его в почти неизменном виде в разные каталоги товаров и мобильные приложения.
Шаблоны проектирования. Именно на базе ООП построены готовые решения для взаимодействия классов друг с другом, которые позволяют не писать этот код с нуля, а взять шаблон.

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

Недостатки ООП?

A

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

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

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

A

Абстракция — скрытие внутренних характеристик функции от пользователей

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

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

A

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

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

Что такое парадигма?

A

Парадигмой называют набор правил и критериев, для написания кода. (Стандарт написания кода)

Если представить, что код — это рецепт блюда, то парадигма — то, как рецепт оформлен в кулинарной книге. Парадигма помогает стандартизировать написание кода.

Это снижает риск ошибок, ускоряет разработку и делает код более читабельным для других программистов.

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

Что такое SOLID?

A

SOLID - это принципы позвляющие получить масштабируемый и поддерживаемый код

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

SOLID - S?

A

S - Single Responsibility Principle (принцип единственной ответственности).

Каждый класс должен иметь только одну зону ответственности.

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

SOLID - O?

A

O - Open closed Principle (принцип открытости-закрытости)

Классы должны быть открыты для расширения, но закрыты для изменения.

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

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

SOLID - L?

A

L - Liskov substitution Principle (принцип подстановки Барбары Лисков)

Наследующий класс должен дополнять, а не замещать поведение базового класса.

If it looks like a duck, quacks like a duck, but needs batteries - you probably have the wrong abstraction

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

Лисковский принцип подстановки - это правило о том, что объекты в программе должны быть заменяемы между собой, не нарушая работу программы. Грубо говоря, если у нас есть классы “родитель” и “потомок”, то потомок должен вести себя так, чтобы его можно было использовать везде, где используется родительский класс.

Например, если у нас есть класс “Птица” с методом “летать()”, и класс “Страус” - потомок класса “Птица”, то страус не должен реализовывать метод “летать()”, потому что страус не умеет летать. Он должен вести себя так, как от него ожидают, иначе это нарушает принцип подстановки Лисков.

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

17
Q

SOLID - I?

A

I - Interface Segregation Principle (принцип разделения интерфейсов)

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

В контексте Python, интерфейс - это абстрактный класс (или просто класс), который определяет набор методов, которые должны быть реализованы в подклассах. Интерфейсы в Python обычно создаются с использованием абстрактных методов, то есть методов без реализации, которые должны быть переопределены в классах-наследниках.

Давай представим, у нас есть класс “Писатель” и интерфейс “Создатель”, который имеет методы “написатькнигу()”, “создатькартину()”, “создатьмузыку()”. Но класс “Писатель” нуждается только в методе “написатькнигу()”. Согласно принципу разделения интерфейсов, необходимо разделить интерфейс на три: “ПисательИнтерфейс”, “ХудожникИнтерфейс”, “МузыкантИнтерфейс”. Теперь класс “Писатель” будет реализовывать только “ПисательИнтерфейс”, а другие классы - соответствующие им интерфейсы.

Это помогает уменьшить зависимости между классами, делает код более гибким и прозрачным, а также позволяет избежать излишней сложности взаимодействия между классами.

18
Q

SOLID - D?

A

D - Dependency Inversion Principle (принцип инверсии зависимостей)

Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракции.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

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

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

Или проще говоря, если тебе нужна мороженка, ты не спрашиваешь у продавца, как оно готовится, ты просто говоришь, что хочешь мороженку, а продавец сам изготавливает и даёт тебе мороженое.

19
Q

Что такое паттерны проектирования GOF?

A

Паттерны проектирования GoF (Gang of Four - от 4-х авторов) - это набор шаблонов проектирования, описанных в книге “Design Patterns: Elements of Reusable Object-Oriented Software” (“Паттерны проектирования. Переиспользуемые объектно-ориентированные программы”), написанной Эрихом Гаммой, Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидесом. Эта книга является классическим источником знаний о паттернах проектирования.

Всего 23 паттерна в 3-х категориях:
* Паттерны создания (creational)
* Паттерны структуры (structural)
* Паттерны поведения (behavioral)

Паттерн проектирования — это часто встречаемое решение определённой проблемы при проектировании архитектуры программ.

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

Паттерны часто путают с алгоритмами, ведь оба понятия описывают типовые решения каких-то известных проблем. И если алгоритм — это чёткий набор действий, то паттерн — это высокоуровневое описание решения, реализация которого может отличаться в двух разных программах. Если привести аналогии, то алгоритм — это кулинарный рецепт с чёткими шагами, а паттерн — инженерный чертёж, на котором нарисовано решение, но не конкретные шаги его получения.

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