Core-1 Flashcards
Что такое ООП?
Представление программы в виде совокупности
обменивающихся сообщениями объектов, каждый из которых
является экземпляром определенного класса, а классы образуют иерархию наследования.
Объекты могут обладать состоянием, единственный способ изменить состояние объекта – послать ему сообщение, в ответ на которое объект может изменить собственное состояние.
3 требования для ООП Программы
- объектно-ориентированное программирование использует в качестве основных
логических конструктивных элементов объекты, а не алгоритмы; - каждый объект является экземпляром определенного класса;
- классы образуют иерархии.
Какие преимущества у ООП?
Легко читается – не нужно выискивать в коде функции и выяснять, за что они отвечают.
Быстро пишется – можно быстро создать сущности, с которыми должна работать программа.
Простота реализации большого функционала – т. к. на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей.
Какие недостатки у ООП?
Потребление памяти – объекты потребляют больше оперативной памяти, чем примитивные
типы данных.
Снижается производительность – многие вещи технически реализованы иначе, поэтому
они используют больше ресурсов.
Сложно начать – парадигма ООП сложнее функционального программирования, поэтому на
старт уходит больше времени.
Инкапсуляция
СОКРЫТИЕ РЕАЛИЗАЦИИ:
Объединение данных и работающих с ними методов
в классе с целью скрыть детали реализации от пользователя, открыв только то, что необходимо при использовании этого класса.
=> Всё то, что не входит в интерфейс, инкапсулируется в классе.
Полезна для:
- контроль доступа
- контроль целостности/валидности данных
- возможность изменения реализации
Наследование
Создание нового класса на основе уже существующего с частично или полностью заимствующейся функциональностью.
Полиморфизм
ВОЗМОЖНОСТЬ ИМЕТЬ РАЗНЫЕ ФОРМЫ ДЛЯ ОДНОЙ И ТОЙ ЖЕ СУЩНСТИ:
это свойство системы использовать объекты с одинаковым интерфейсом
без информации о типе и внутренней структуре объекта.
ключевая особенность
полиморфизма
использование объекта производного класса вместо объекта базового:
потомки могут переопределять родительское поведение, даже если обращение к ним будет
производиться по ссылке родительского типа.
Преимущество полиморфизма
он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования.
2 Типа Полиморфизма
- Динамический: переопределение
- Статический: перегрузка
Полиморфная переменная
Может принимать значение разных типов
Полиморфная функция
хотя бы 1 ее аргумент - полиморфная переменная.
2 типа полиморфных функций
- Ad hoc - Ф. ведет себя по разному для разных типов ( draw() )
- Параметрический: Ф. ведёт себя одинаково для аргументов разных типов (Collections.sort )
Абстракция
Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция – это набор всех таких
характеристик.
Что такое обмен сообщениями?
Сообщение - запрос на выполнения действия, отправка сообщения = вызов метода.
Класс
Класс описывает состояние и зависящее от него поведение сущности, а также правила для взаимодействия с данной сущностью (контракт).
Объект
Объект (экземпляр) – это представитель класса, имеющий конкретное состояние
и поведение, полностью определяемое классом.
Что такое Интерфейс и как он связан с классом?
И. - набор всех публичных методов класса в совокупности с набором
публичных атрибутов.
И. специфицирует класс, четко определяя все
возможные действия над ним.
Ассоциация
означает, что объекты двух классов могут ссылаться один на другой. Композиция и агрегация – частные случаи ассоциации «часть-целое».
«is a» - наследование
«has a» - ассоциаия
Агрегация
Агрегация предполагает, что объекты связаны взаимоотношением «part-of». Student - Course
Композиция
более жесткое отношение , чем агрегация: когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Engine - Car.
Связывание метода (binding)
Присоединение вызова метода к телу метода
early binding
статическое или раннее связывание: связывание
проводится компилятором (компоновщиком) перед запуском программы
late binding
позднее связывание (dynamic или runtime binding) - связывание, проводимое непосредственно во время выполнения программы в зависимости от типа объекта.
Виртуальный метод
Метод, который может быть переопределен в классах наследниках так, что конкретная реализация будет определяться во время исполнения.
Различия между ранним и поздним связыванием в Java (3)
1) в языке Java Статическое связывание используется для перегруженных методов, динамическое для переопределенных.
2) Следовательно, приватные, статические и терминальные (final) методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять, а все виртуальные методы разрешаются при помощи динамического связывания.
3) В статическом связывании для выбора метода используется тип ссылочной переменной, при динамическом связывании для нахождения нужного метода в Java используется конкретный объект.
Перечислите SOLID принципы
https://javarush.com/groups/posts/osnovnye-principy-dizajna-klassov-solid-v-java
https://habr.com/ru/company/ruvds/blog/426413/
S - Single Responsibility - Каждый класс должен иметь только одну зону ответственности.
O - Open-Closed - описываемый класс должен быть открыт для расширения, но закрыт для изменений.
L - Liskov Substitution - Методы, использующие ссылки на базовые классы, должны иметь возможность использовать объекты классов-наследников, не зная об этом.
I - Interface Segregation - клиенты не должны быть вынуждены реализовывать методы, которые они не будут использовать..
D - Dependency Inversion - Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
SOLID: Single Responsibility
Принцип единственной ответственности: На каждый объект возлагается единственная обязанность, полностью инкапсулированная в класс. Такие классы всегда будет просто изменять и не бояться последствий — влияния на другие объекты.
SOLID: Open-Closed
https://habr.com/ru/company/tinkoff/blog/472186/
программные сущности (классы, модули, функции и т.п.) должны быть открыты для расширения, но закрыты для изменения:
классы разрабатываются так, чтобы для подстройки класса к конкретным условиям применения было достаточно расширить его и переопределить некоторые функции.
Это можно решить с помощью интерфейса: он закрыт для изменения, но его можно расширить, добавив новую имплементацию.
=> В хорошо спроектированных программах новая функциональность вводится путем добавления нового кода, а не изменением старого, уже работающего.