Sobes.tech
Назад к вопросам
Junior — Middle
69

Применяешь ли ты в своей практике абстрактные классы для архитектурных решений?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Да, абстрактные классы используются там, где нужно задать общий контракт и частичную реализацию для группы похожих сущностей. Это удобно, когда есть общий шаблон поведения, но часть логики должна быть реализована в наследниках. В QA Automation это часто помогает убрать дублирование и централизовать общие шаги.

Определение:

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

Пример использования:

Например, в автотестах можно сделать абстрактный класс для страниц или API-клиентов, где общими будут логирование, ожидания, проверка статуса ответа и базовые методы работы с драйвером или HTTP-клиентом.

public abstract class BasePage {
    protected WebDriver driver;

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

    public void open(String url) {
        driver.get(url);
    }

    public abstract boolean isPageLoaded();
}

public class LoginPage extends BasePage {

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

    @Override
    public boolean isPageLoaded() {
        return driver.getTitle().contains("Login");
    }
}

Пояснение кода:

BasePage задаёт общий контракт для всех страниц: у всех есть driver, метод open() и обязательный метод isPageLoaded(). Метод open() уже реализован один раз в базовом классе, поэтому не дублируется в наследниках. LoginPage наследует общую логику и реализует только специфичную проверку загрузки страницы.

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

Ключевые моменты:

  • Абстрактный класс полезен, когда есть общий каркас и частично общая реализация.
  • Он помогает уменьшить дублирование в тестовом фреймворке.
  • Хорошо подходит для Page Object, базовых API-клиентов, общих компонентов тестов.
  • Если нужен только контракт без реализации, чаще подходит интерфейс.
  • Не стоит делать абстрактный класс слишком “толстым”, чтобы не жёстко связывать наследников.
  • Использовать его стоит тогда, когда действительно есть отношение “is-a” между базовым и дочерними классами.