Программирование и ООП 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

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

Процесс выделения общих характеристик и функциональности объектов или системы, игнорируя детали реализации.

Позволяет скрывать сложность и детали нижележащего кода.

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

https://tproger.ru/articles/osnovnye-principy-oop-abstrakciya-v-programmirovanii

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 (принцип единственной ответственности).

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

Я повар, садовник, маляр и водитель

vs

  • Я повар
  • Я садовник
  • Я маляр
  • Я водитель
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 (принцип инверсии зависимостей)

Я режу пиццу своей рукой - ножом для пиццы
vs
Я режу пиццу любым доступным инструментом

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

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

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

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

19
Q

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

A

Gang of Four - от 4-х авторов

  • Паттерны создания (creational)
  • Паттерны структуры (structural)
  • Паттерны поведения (behavioral)
  • Стратегия (Strategy) - предлагает определить семейство схожих алгоритмов, которые часто изменяются или расширяются, и вынести их в собственные классы, называемые стратегиями.
    • Пример: способ построения маршрута в навигаторе (для авто, пешехода, велосипедиста, на общественном транспорте)
  • Строитель (Builder) - разделяет создание сложного объекта и инициализацию его состояния так, что одинаковый процесс построения может создать объекты с разным состоянием.
    • Пример: избавление от лишних опций конструктора (Lombok и создание экземпляров класса), StringBuilder
  • Итератор (Iterator) - предоставляет способ последовательного доступа к элементам множества независимо от его внутреннего устройства.
    • Пример: foreach
  • Одиночка (Singleton) - гарантирует, что класс имеет только один экземпляр и предоставляет глобальную току доступа к нему.
    • Пример: общий доступ к базе данных из разных частей программы, selenium driver
      ый метод (Factory Method) - определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать. Позволяет делегировать создание объекта подклассам.
  • Абстрактная фабрика (Abstarct Factory) - предоставляет интерфейс для создания групп связанных или зависимых объектов, не указывая их конкретный класс.
20
Q

Что такое функция?

A

Отдельный блок программы, который выполняет одно конкретное действие.

21
Q

Интерфейс

A

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

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

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

В Python нет встроенной поддержки интерфейсов, как это есть, например, в Java. Однако концепцию интерфейса можно реализовать с помощью абстрактного класса, в котором все методы являются абстрактными.

from abc import ABC, abstractmethod
 
class InterfaceExample(ABC):
 
    @abstractmethod
    def method1(self):
        pass
 
    @abstractmethod
    def method2(self):
        pass
22
Q

Интерфейс? Абстрактный класс? Чем они отличаются

A

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

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

23
Q

Что такое абстрактный класс?

A

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

Абстрактный класс: базовый класс, который не предполагает создания экземпляров и может содержать в себе нереализованные элементы

Абстрактный класс — похож на обычный, но отличается тем, что может содержать абстрактные методы — методы без реализации, и нельзя создать экземпляр абстрактного класса.

from abc import ABC, abstractmethod
 
class AbstractClassExample(ABC):
 
    @abstractmethod
    def do_something(self):
        pass

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

24
Q

Отличия интерфейса от абстрактного класса

A

Интерфейс - это просто описание методов, без их реализации. У абстрактного класса может быть и реализация методов.
- Класс может реализовать несколько интерфейсов, но наследовать только один абстрактный класс.
- Абстрактный класс может содержать конструкторы, поля и другие методы, в то время как интерфейс предоставляет только сигнатуры методов.

  1. Реализация методов: В абстрактном классе можно как описание метода (без его реализации), так и его реализацию. В интерфейсе же можно только объявить методы, без их реализации.
  2. Множественное наследование: В Python класс может наследовать только один абстрактный класс, но может реализовывать несколько интерфейсов. Это означает, что интерфейсы могут использоваться для создания более гибкой архитектуры программы.
  3. Отношение к реальным объектам: Абстрактный класс обычно описывает общие характеристики и поведение для группы объектов, в то время как интерфейс определяет только то, что объект должен уметь делать, но не определяет его внутреннюю структуру.
  4. Использование по умолчанию: Абстрактный класс может содержать реализации методов по умолчанию, которые класс-потомок может переопределить. Интерфейс, напротив, не содержит реализации по умолчанию и все методы должны быть обязательно реализованы в классе, использующем интерфейс.
25
Q

DRY

A

DRY (Don’t Repeat Yourself) - Избегайте повторного написания кода, вынося в абстракции часто используемые задачи и данные. Каждая часть вашего кода или информации должна находиться в единственном числе в единственном доступном месте. Это один из принципов читаемого кода.

26
Q

KISS

A

KISS (Keep It Simple, Stupid) - Не придумывайте к задаче более сложного решения, чем ей требуется. Простота кода – превыше всего, потому что простой код – наиболее понятный.

27
Q

YAGNI

A

YAGNI (You Ain’t Gonna Need It) - Если пишете код, то будьте уверены, что он вам понадобится. Не пишите код, если думаете, что он пригодится позже. Если вы занимаетесь рефакторингом метода, класса или файла, не бойтесь удалять лишние методы. Даже если раньше они были полезны – теперь они не нужны.

28
Q

PageObject

A

Шаблон проектирования для автотестов где каждая страница оформляется как объект, все ее элементы записываются в атрибуты и управление элементами прописывается в методах.

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

29
Q

When should I use inheritance?

A

Inheritance is a powerful tool, but it is a really bad idea to try to overuse it. Inheritance should only be used when all instances of a child class are also instances of the parent class.

When a child class inherits from a parent, it inherits everything. If you only want to share some functionality, inheritance is probably not the best answer. Better to simply share some functions, or maybe make a new parent class that both classes can inherit from.

30
Q

Low coupling, high cohesion

A

Low Coupling (Низкая связанность) и High Cohesion (Высокая связность) — это два ключевых принципа проектирования программного обеспечения.

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

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

31
Q

Abstraction vs encapsulation

A

Abstraction is about creating a simple interface for complex behavior. It focuses on what’s exposed.
Encapsulation is about hiding internal state. It focuses on tucking implementation details away so no one depends on them.