CORE -1 Flashcards
Что такое ООП?
Методология программирования согласно которой программа есть набор обменивающихся сообщениями объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Каждый объект содержит присущие ему данные (поля) и умеет выполнять действия (методы).
Объекты обладают состоянием, единственный способ изменить состояние объекта – послать ему сообщение, в ответ на которое объект может изменить собственное состояние.
3 требования для ООП Программы
- объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;
- каждый объект является экземпляром определенного класса;
- классы образуют иерархии.
Какие преимущества у ООП?
- Возможность легкой модификации (при грамотном анализе и проектировании)
- Возможность отката при наличии версий
- Более легкая расширяемость
- Более естественная декомпозиция (разделение целого на части) программного обеспечения, которая существенно облегчает его разработку
- Слабая связанность кода.
- Сокращение количества межмодульных вызовов и уменьшение объемов информации, передаваемой между модулями.
- Увеличивается показатель повторного использования кода.
Какие недостатки у ООП?
- Потребление памяти - обьекты потребляют больше оперативной памяти, чем примитивные типы данных
- Неэффективность и неэкономное распределения памяти на этапе выполнения (по причине издержек на динамическое связывание и проверки типов на этапе выполнения).
- Излишняя универсальность. Часто содержится больше методов, чем это реально необходимо текущей программе. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом.
- Сложно начать - парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени
- Резко увеличивается время на анализ и проектирование систем
- Увеличение времени выполнения
- Размер кода увеличивается
Назовите основные принципы ООП
- Инкапсуляция - сокрытие реализации.
- Наследование - создание новой сущности на базе уже существующей.
- Полиморфизм - возможность иметь разные формы для одной и той же сущности.
- Абстракция - набор общих характеристик.
- Посылка сообщений - форма связи, взаимодействия между сущностями.
- Переиспользование - все озвученные принципы заточены под повторное использование кода.
Что такое инкапсуляция?Пример
Это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании.
*Модификаторы доступа:
(Access modifiers:
-private
-default (package visible)
-protected
-public)
* Геттеры и Сеттеры (Getters and Setters)
Внешние объекты и классы не имеют прямого доступа к полям объекта. Объект имеет внешние методы (API), позволяющие внешнему миру с ним взаимодействовать. Но каким образом работа выстроена внутри объекта - на это внешние пользователи влиять не должны.
Цель инкапсуляции - уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.
Состояние объекта - это значение всех его полей. Объект не должен изменяться чем то из вне, кроме своих методов.
Необходимо убрать возможность случайного/умышленного изменения объекта.
Пример:
Кондиционер (берем пульт включаем допустим режим холод - запускаются разные процессы, которые не показываются пользователю), пользователю на пульте высвечивается температура воздуха на выходе, остальное все скрыто.
Инкапсуляция является фундаментальным концептом в Java (а также во многих других объектно-ориентированных языках программирования), который предполагает скрытие деталей реализации объекта от внешнего мира и предоставление четко определенного интерфейса для взаимодействия с объектом.
В Java инкапсуляция достигается с помощью определения private, protected и public полей и методов в классе. Поля и методы, объявленные как private, могут быть доступны только внутри класса и не могут быть изменены или прочитаны извне. Protected поля и методы могут быть доступны только внутри класса и его наследников. Public поля и методы могут быть доступны из любого места в программе.
При использовании инкапсуляции объекты скрывают свою внутреннюю реализацию от клиента, что позволяет легко модифицировать и расширять код без необходимости изменения внешнего интерфейса. Это также повышает безопасность программы, так как позволяет контролировать доступ к объектам и их методам.
Что такое наследование?Пример
Наследование - свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью(поля и методы).
Класс, от которого производится наследование, называется предком, базовым или родительским.
Новый класс – потомком, наследником или производным классом.
class Employee extends Person {}
Запретить наследование - public final class.
Что такое полиморфизм? Пример
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
К объекту можно обращаться через интерфейсы родительского класса, а реализация их уже будет зависеть от самого объекта.
Полиморфизм бывает динамическим (переопределение) и статическим (перегрузка).
**Животное[] –> {собака, кошка}.
Животное[1].голос –> “Гав”;
Животное[2].голос –> “Мяу”;
Преимущество полиморфизма
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий.
Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования.
Ключевая особенность полиморфизма
Использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа).
Полиморфная переменная и функция
Полиморфная переменная, это переменная, которая может принимать значения разных типов.
Полиморфная функция, это функция у которой хотя бы один аргумент является полиморфной переменной. Выделяют два вида полиморфных функций:
- ad hoc, функция ведет себя по разному для разных типов аргументов (например, функция draw() — рисует по разному фигуры разных типов);
- параметрический, функция ведет себя одинаково для аргументов разных типов (например, функция add() — одинаково кладет в контейнер элементы разных типов).
Абстрагирование и Абстракция
Абстрагирование - это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые.
Абстракция - это набор всех таких характеристик. (телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).
Объект-класс-абстрактный класс-Интерфейс (макс. уровень абстракции).
Что представляет собой «обмен сообщениями»
Объекты взаимодействуют, посылая и получая сообщения.
Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
В ООП отправка сообщения (вызов метода) — это единственный путь передать управление объекту.
Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод.
Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding).
Что такое Класс?
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
Класс - описывает существование всех характеристик объекта, но в общем случае не дает им конкретных значений.
С точки зрения структуры программы, класс является сложным типом данных.
Укажите, из каких элементов состоит класс.
1) Поля
2) Методы
3) Конструкторы
4) Статический и
5) динамический блоки инициализации.
Поля - хранилища данных.
Методы - операции, выполняемые классами.
Конструкторы - особые методы, работающие при создании экземпляра класса. Они инициализируют поля объекта.
Что такое Объект?
Объект (экземпляр) – это представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.
Что такое Интерфейс?
Интерфейс - набор всех публичных методов класса в совокупности с набором публичных атрибутов.
Интерфейс специфицирует класс, четко определяя все возможные действия над ним.
Что такое ассоциация?
Ассоциация обозначает связь между объектами.
Композиция и агрегация - частные случаи ассоциации часть-целое .
- является(IS A) подразумевает наследование.
- имеет(HAS A) подразумевает ассоциацию (агрегацию или композицию).
Что такое композиция?
Композиция - это метод проектирования, методика создания классов из уже существующих.
При композиции новый класс включает в себя прошлые, то есть реализуется отношение “has-a”.
Машина HAS-A Двигатель
Что такое агрегация?
Агрегация - метод проектирования, менее строгий вариант композиции. Реализуется отношение “has-a”.
Но: время существования внутренних объектов не зависит от времени существования объекта-контейнера.
Агрегация предполагает, что объекты связаны взаимоотношением part-of (часть).
Реализация Агрегации и Композиции в Java?
Например, книга состоит из страниц и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция. В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация.
Агрегация и Композиция реализуются в Java с помощью полей, ссылающихся на объекты других классов. Например:
~~~
class Auto {
Engine engine;
Wheel wheel;
…
}
~~~
Что такое связывание методов (binding)?
Связывание - это присоединение вызова метода к телу метода.
Иначе говоря - когда на строчке вызван метод, куда идти за инструкциями, что делать.
Существует:
* Раннее (статическое) связывание;
* Позднее (динамическое) связывание.
Исходя из того, что раннее связывание выполняется на этапе компиляции, а позднее - в рантайме, первый вариант обладает лучшим быстродействием, однако второй необходим для реализации полиморфизма.
Что такое РАННЕЕ связывание методов (early binding)?
Раннее (статическое) связывание - проводится компилятором перед запуском программы- на этапе компиляции.
Вызываемый метод определяется по типу переменной.
Например, перегрузка методов; приватные, статические и final методы.
Что такое ПОЗДНЕЕ связывание методов (late binding)?
Позднее (динамическое) связывание -проводится на этапе выполнения(runtime), в зависимости от типа объекта.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
Например переопределение методов. Компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода.
Какой тип связывания в Java используется для перегруженных методов? А для переопределенных методов?
1) Для перегруженных - раннее. Вызываемый метод определяется на этапе компиляции по типу переменной.
2) Для переопределенных - позднее. Метод определяется по типу объекта во время выполнения программы (Runtime).
Различия между ранним и поздним связыванием в Java
1) в языке Java Статическое связывание используется для перегруженных методов, динамическое для переопределенных.
2) Следовательно, приватные, статические и терминальные (final) методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять, а все виртуальные методы разрешаются при помощи динамического связывания.
3) В статическом связывании для выбора метода используется тип ссылочной переменной, при динамическом связывании для нахождения нужного метода в Java используется конкретный объект.
SOLID принципы
SOLID — это акроним, образованный из заглавных букв первых пяти принципов ООП и проектирования.
При создании программных систем использование принципов SOLID способствует созданию такой системы, которую будет легко поддерживать и расширять в течение долгого времени.
Введен Майклом Фэзерсом
S - Single Responsibility - Каждый класс должен отвечать за какую-то одну логику.
O - Open-Closed - описываемый класс должен быть открыт для расширения, но закрыт для изменений.
L - Liskov Substitution - Методы, использующие ссылки на базовые классы, должны иметь возможность использовать объекты классов-наследников, не зная об этом.
I - Interface Segregation - клиенты не должны быть вынуждены реализовывать методы, которые они не будут использовать..
D - Dependency Inversion - Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
SOLID: Single Responsibility
Каждый класс должен получать информацию из системы ровно столько, сколько достаточно для работы логики этого класса.
А так же, класс не должен быть мастером на все руки, выполняя множество разноплановых задач.
Он должен выполнять только одну конкретную задачу. Класс может содержать много методов, но все они должны быть направлены на решение одной и только одной задачи. (класс должен выполнять только одну задачу, и только одну.)
SOLID: Open Closed Principle
- Классы должны быть открыты к расширению, и закрыты к модификации.
- Это значит, что код должен быть написан так, чтобы другие разработчики могли изменить поведение существующего кода, при этом, не изменяя основной код.
- То есть, классы должны быть такими, чтобы каждый мог дописать что-то своё, не меняя при этом содержимого исходного кода.
- В хорошо спроектированных программах новая функциональность вводится путем добавления нового кода, а не изменением старого, уже работающего.
SOLID: Liskov Substitution Principle
- Используемый класс должен иметь возможность использовать базовый класс или любой подкласс, производный от базового, при этом не изменяя собственный код или логику работы, независимо от реализации.
- То есть, родительский класс должен быть полностью взаимозаменяемым любыми его подклассами, при этом, клиентский код даже не должен знать о том, что мы работаем с каким-то подклассом, ему не должно быть разницы.
SOLID: Interface Segregation Principle
- Клиентский код не должен имплементировать интерфейсы, которые он не использует, не должен определять методы, которые ему не нужны.
- Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более мелкие и специфические, чтобы клиенты мелких интерфейсов знали только о методах, необходимых в работе.
SOLID: Dependency inversion Principle
- Зависимости внутри системы строятся на основе абстракций.
Объектом зависимости должна быть абстракция, а не что-то конкретное. - Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей.
- Детали должны зависеть от абстракций.
- Программное обеспечение нужно разрабатывать так, чтобы различные модули были автономными и соединялись друг с другом с помощью абстракции.
Классическое применение этого принципа — Spring framework. В рамках Spring framework все модули выполнены в виде отдельных компонентов, которые могут работать вместе. Они настолько автономны, что могут быть быть с такой же легкостью задействованы в других программных модулях помимо Spring framework. Это достигнуто за счет зависимости закрытых и открытых принципов. Все модули предоставляют доступ только к абстракции, которая может использоваться в другом модуле.