Что такое абстракция в контексте ООП?

«Что такое абстракция в контексте ООП?» — вопрос из категории ООП, который задают на 28% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример в контексте тестирования: При написании автотестов мы часто используем абстракцию для создания Page Object Model (POM). Сложная логика поиска элементов и взаимодействия с ними скрывается за простыми методами.

// Абстрактный класс или интерфейс, определяющий контракт для страницы
public abstract class BasePage {
    protected WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
    }

    // Абстрактный метод, который должен быть реализован для проверки загрузки конкретной страницы
    public abstract boolean isPageLoaded();

    // Конкретный метод, предоставляющий общую функциональность
    public String getPageTitle() {
        return driver.getTitle();
    }
}

// Конкретная реализация, скрывающая детали локаторов и действий
public class LoginPage extends BasePage {
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton = By.id("submit");

    public LoginPage(WebDriver driver) {
        super(driver);
    }

    @Override
    public boolean isPageLoaded() {
        return driver.findElement(submitButton).isDisplayed();
    }

    // Публичный метод — простая абстракция для действия "выполнить вход"
    public HomePage login(String user, String pass) {
        driver.findElement(usernameField).sendKeys(user); // Сложность скрыта
        driver.findElement(passwordField).sendKeys(pass);
        driver.findElement(submitButton).click();
        return new HomePage(driver);
    }
}

Преимущества для QA-инженера:

  • Упрощение тестов: Тестовые сценарии становятся читаемыми: loginPage.login("user", "pass").
  • Устойчивость к изменениям: Если изменится локатор поля username, правку нужно внести только в одном месте — в классе LoginPage.
  • Переиспользование кода: Общая логика (например, ожидание элемента) выносится в базовый класс.
  • Четкое разделение ответственности: Тест-код занимается бизнес-сценариями, а Page Object — техническим взаимодействием с UI.

Видео-ответы