ООП

Вопросы для собеседования

Вопросы:

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

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

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

Много букф: ООП в картинках

Какие преимущества у ООП?

Преимущества ООП:

Какие недостатки у ООП?

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

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

Принципы:

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

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

Полиморфизм - это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Хорошие примеры: ООП с примерами (часть 2)

Альтернативное мнение об ООП: Я не знаю ООП

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

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

В контексте ООП, это означает, что детали реализации класса скрываются от пользователя.

В Java, абстракцию можно достичь двумя способами:

  1. Абстрактные классы: Это классы, которые не могут быть инстанцированы, и они обычно содержат один или несколько абстрактных методов (методы без тела).

  2. Интерфейсы: Это полностью абстрактные классы, которые могут содержать только абстрактные методы.

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

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

В JAVA реализуется с помощью модификаторов доступа и геттеров/сеттеров.

Модификаторы доступа (Access modifiers):

Табличка модификаторов доступа

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

Доступ к таким переменным обычно предоставляется через "геттеры" и "сеттеры" (getters and setters) - методы, которые возвращают значение переменной или устанавливают его значение.

Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.

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

Пример – кондиционер (берем пульт включаем холод - запускаются разные процессы, которые не показываются пользователю), пользователю на пульте показывается температура воздуха на выходе, остальное все скрыто.

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

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

Наследование форма отношения «is a» (является).

Класс наследника является классом предка, но класс предка не является классом наследника: собака – наследник животного, но животное не наследник собаки. Наследник – более «узкий» класс.

Пример: кондиционер наследуется от холодильной техники.

Есть одиночное и множественное.

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

Это широко используется в некоторых языках программирования, таких как C++ и Python.

В Java множественное наследование ограничено.

В Java множественное наследование для классов не поддерживается, чтобы избежать проблем, связанных с "проблемой ромба" (diamond problem), когда класс наследуется от двух классов, которые имеют одинаковый метод, и неясно, какую версию метода следует использовать.

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

Также, начиная с Java 8, интерфейсы могут содержать реализации методов по умолчанию, что позволяет классам "наследовать" поведение от нескольких источников.

Запретить наследование:

public final class

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

class Employee extends Person {}

Делегирование – один класс вызывает другой класс, не связанный наследованием.

Задачи на тему

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

Полиморфизм - это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Пример: интерфейс «охлаждать» имеет место в технике, холодное пиво)) и т.п.

Все if –ы можно заменить на полиморфизм (способ рефакторинга).

Позволяет уменьшать размер программы.

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

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

Unit ref = new Refrigerator("ref", 24);

Полиморфная переменная - это переменная, которая может принимать значения разных типов.

Полиморфная функция - функция у которой хотя бы один аргумент является полиморфной переменной.

Выделяют два вида полиморфных функций:

Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые.

Соответственно, абстракция – это набор всех таких характеристик.

(телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).

Объект - Класс - Абстрактный класс - Интерфейс(макс. уровень абстракции).

Что такое ассоциация, агрегация и композиция?

Ассоциация обозначает связь между объектами.

Композиция и агрегация — частные случаи ассоциации «часть-целое».

Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть).

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

Композиция более строгий вариант агрегации.

Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.

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

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

«Является» подразумевает наследование.
«Имеет» подразумевает ассоциацию (агрегацию или композицию).

Расскажите про раннее (статическое) и позднее (динамическое) связывание.

Связывание - присоединение вызова метода к телу метода.

Раннее (статическое) связывание - проводится компилятором (компоновщиком) перед запуском программы.

Например, перегрузка методов; приватные, статические и final методы.

Позднее (динамическое) связывание - непосредственно во время выполнения программы (runtime), в зависимости от типа объекта.

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

Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).

public class Main {
    public static void main(String[] args) {
        Insurance current = new CarInsurance();

        // Динамическое связывание на основе объекта потому что метод premium() нестатический
        int premium = current.premium();

        // Статическое связывание на основе класса, метод category() статический (принадлежит классу)
        String category = current.category();

        System.out.println("premium : " + premium);
        System.out.println("category : " + category);
    }
}

class Insurance {
    public static final int LOW = 100;

    public static String category() { return "Insurance"; }
    public int premium() { return LOW; }
}

class CarInsurance extends Insurance {
    public static final int HIGH = 200;

    public static String category() { return "Car Insurance"; }
    public int premium() { return HIGH; }
}

REST

REST (Representational state transfer) – это стиль архитектуры программного обеспечения для распределенных систем, таких как World Wide Web, который, как правило, используется для построения веб-служб.

Системы, поддерживающие REST, называются RESTful-системами.

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

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

Каждая единица информации однозначно определяется URL – это значит, что URL по сути является первичным ключом для единицы данных.

Как происходит управление информацией сервиса – это целиком и полностью основывается на протоколе передачи данных. Наиболее распространенный протокол конечно же HTTP.

Архитектура REST очень проста в плане использования. По виду пришедшего запроса сразу можно определить, что он делает, не разбираясь в форматах (в отличие от SOAP, XML-RPC). Данные передаются без применения дополнительных слоев, поэтому REST считается менее ресурсоемким, поскольку не надо парсить запрос чтоб понять что он должен сделать и не надо переводить данные из одного формата в другой.

источник