Що таке ООП? Назвіть його принципи з прикладами?

Що таке ООП?

ООП (Об’єктно-орієнтоване програмування) – це підхід у програмуванні, де програма моделюється у вигляді об’єктів, що мають стан (поля) та поведінку (методи).

💡 Основна ідея ООП – це інкапсуляція, наслідування, поліморфізм і абстракція, що допомагає створювати масштабовані, зручні в підтримці та розширенні програми.

🔹 Основні принципи ООП

1️⃣ Інкапсуляція (Encapsulation)

Приховування деталей реалізації об’єкта та контроль доступу до його даних через геттери/сеттери.
✅ Переваги:
✔️ Забезпечує безпеку даних.
✔️ Контролює зміни стану об’єкта.

📌 Приклад в Java (Page Object + Selenide)

javaCopyEditpublic class LoginPage {
    private SelenideElement usernameField = $("#username");
    private SelenideElement passwordField = $("#password");
    private SelenideElement loginButton = $("#login");

    // Методи для взаємодії (контроль доступу)
    public LoginPage enterUsername(String username) {
        usernameField.setValue(username);
        return this;
    }

    public LoginPage enterPassword(String password) {
        passwordField.setValue(password);
        return this;
    }

    public void clickLogin() {
        loginButton.click();
    }
}

🔹 Тут поля usernameField, passwordField, loginButton приховані (private), і доступ до них можливий лише через методи (enterUsername(), enterPassword(), clickLogin()).


2️⃣ Наслідування (Inheritance)

Створення нового класу на основі існуючого, що дозволяє використовувати його методи без дублювання коду.
✅ Переваги:
✔️ Уникає дублювання коду.
✔️ Розширює функціональність без зміни існуючих класів.

📌 Приклад в Java (Базовий Page Object + Наслідування)

javaCopyEdit// Базовий клас для всіх сторінок
public class BasePage {
    public void openPage(String url) {
        Selenide.open(url);
    }
}

// Наслідуваний клас для сторінки логіна
public class LoginPage extends BasePage {
    private SelenideElement usernameField = $("#username");
    private SelenideElement passwordField = $("#password");
    private SelenideElement loginButton = $("#login");

    public LoginPage enterUsername(String username) {
        usernameField.setValue(username);
        return this;
    }

    public LoginPage enterPassword(String password) {
        passwordField.setValue(password);
        return this;
    }

    public void clickLogin() {
        loginButton.click();
    }
}

// Використання
LoginPage loginPage = new LoginPage();
loginPage.openPage("https://example.com/login"); // Метод з батьківського класу
loginPage.enterUsername("admin").enterPassword("12345").clickLogin();

🔹 Клас LoginPage наслідує BasePage та отримує можливість відкривати сторінки (openPage()) без дублювання коду.


3️⃣ Поліморфізм (Polymorphism)

Однаковий інтерфейс – різна реалізація. Використовується для спрощення коду та зменшення залежностей.
✅ Переваги:
✔️ Дозволяє використовувати один і той самий метод для різних типів об’єктів.
✔️ Покращує масштабованість коду.

📌 Приклад: Оверрайдінг (Method Overriding)

javaCopyEdit// Базовий клас
public class BaseTest {
    public void runTest() {
        System.out.println("Running base test...");
    }
}

// Дочірній клас перевизначає метод
public class UIAutomationTest extends BaseTest {
    @Override
    public void runTest() {
        System.out.println("Running UI test using Selenide...");
    }
}

public class APITest extends BaseTest {
    @Override
    public void runTest() {
        System.out.println("Running API test using RestAssured...");
    }
}

// Використання
BaseTest test1 = new UIAutomationTest();
BaseTest test2 = new APITest();
test1.runTest(); // "Running UI test using Selenide..."
test2.runTest(); // "Running API test using RestAssured..."

🔹 Метод runTest() викликається для різних об’єктів (UIAutomationTest, APITest), але результат – різний.


4️⃣ Абстракція (Abstraction)

Приховує складність реалізації, залишаючи лише необхідні методи для взаємодії.
✅ Переваги:
✔️ Полегшує використання коду, приховуючи деталі реалізації.
✔️ Зменшує залежність між модулями.

📌 Приклад: Абстрактний клас Page Object

javaCopyEditpublic abstract class BasePage {
    public abstract void openPage(); // Абстрактний метод без реалізації

    public void waitForElement(SelenideElement element) {
        element.shouldBe(Condition.visible);
    }
}

// Наслідуваний клас, що реалізує openPage()
public class LoginPage extends BasePage {
    private SelenideElement usernameField = $("#username");
    private SelenideElement passwordField = $("#password");
    private SelenideElement loginButton = $("#login");

    @Override
    public void openPage() {
        Selenide.open("https://example.com/login");
    }

    public void login(String username, String password) {
        usernameField.setValue(username);
        passwordField.setValue(password);
        loginButton.click();
    }
}

// Використання
LoginPage loginPage = new LoginPage();
loginPage.openPage();
loginPage.login("admin", "password123");

🔹 Клас BasePage містить абстрактний метод openPage(), який обов’язково потрібно реалізувати у дочірніх класах.


🔥 Висновки

ПринципЩо робить?Приклад у Java/Selenide
ІнкапсуляціяХоває внутрішню логіку, обмежує доступ до данихprivate поля, public геттери/сеттери в Page Object
НаслідуванняДочірній клас наслідує методи батьківськогоLoginPage наслідує BasePage
ПоліморфізмОдин метод – різна поведінкаПеревизначення runTest() в UIAutomationTest
АбстракціяПриховує складність реалізаціїАбстрактний клас BasePage

☝️ ООП у Java/Selenide допомагає створювати гнучкі та підтримувані автоматизовані тести! 🚀