← Назад к вопросам

После каких функций можно ставить точку и вызывать следующий метод

2.0 Middle🔥 182 комментариев
#Теория тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое чейнинг методов (Method Chaining)?

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

После каких функций/методов можно вызывать следующий метод?

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

Ключевые возвращаемые типы для чейнинга:

  • self/this (return this;): Метод возвращает тот же самый экземпляр класса. Это основа Fluent Interface.
  • Другой объект того же или совместимого типа: Метод возвращает новый или другой объект, но с тем же набором доступных методов.
  • Объект любого другого класса: Если следующий метод существует в этом возвращённом классе.

Примеры на Java и Python

Пример 1: Классический Fluent Interface (возврат this)

Этот подход часто используется в билдерах и некоторых API.

public class QueryBuilder {
    private String selectClause = "";
    private String fromClause = "";

    public QueryBuilder select(String columns) {
        this.selectClause = "SELECT " + columns;
        return this; // Возвращаем тот же объект!
    }

    public QueryBuilder from(String table) {
        this.fromClause = " FROM " + table;
        return this; // Снова возвращаем тот же объект!
    }

    public String build() {
        return selectClause + fromClause;
    }
}

// Использование с чейнингом:
QueryBuilder query = new QueryBuilder()
    .select("id, name")    // Метод возвращает QueryBuilder
    .from("users")         // После select() можно сразу вызвать from()
    .build();              // И наконец build()
System.out.println(query); // Вывод: SELECT id, name FROM users

Пример 2: Возврат нового объекта того же типа

Часто встречается в immutable (неизменяемых) классах, например, String или BigDecimal.

// Методы класса String возвращают НОВЫЙ объект String
String result = "  Hello, World!  "
    .trim()             // Возвращает новый String: "Hello, World!"
    .toUpperCase()      // Возвращает новый String: "HELLO, WORLD!"
    .replace("WORLD", "QA"); // Возвращает новый String: "HELLO, QA"
System.out.println(result);

Пример 3: Возврат объекта другого типа (цепочечный вызов разных классов)

# Пример на Python с использованием Pandas (аналогично работает во многих библиотеках)
import pandas as pd

data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
df = pd.DataFrame(data)

# Каждый метод возвращает DataFrame или Series, позволяя продолжить цепочку
result = (df
          .query('Age > 26')          # Возвращает DataFrame
          .assign(IsAdult=True)       # Возвращает DataFrame
          .groupby('Name')            # Возвращает GroupBy объект
          .mean()                     # Возвращает DataFrame
         )
print(result)

Что НЕ позволяет чейнинг?

  • Методы, возвращающие void. После них нельзя поставить точку.
    list.add("item").get(0); // ОШИБКА! add() возвращает void в List.
    
  • Методы, возвращающие примитивные типы (int, boolean, double и т.д.). Хотя в некоторых языках (JavaScript, Python) примитивы "оборачиваются" и могут иметь методы.
    int length = "Hello".length().toString(); // ОШИБКА! length() возвращает int.
    

Главный принцип для QA Automation

При проектировании Page Object Model (POM) или создании кастомных утилитных классов вы можете активно применять чейнинг для повышения читаемости тестов.

// Пример "плоского" кода без чейнинга (неудобно для чтения):
LoginPage loginPage = new LoginPage(driver);
loginPage.enterUsername("user");
loginPage.enterPassword("pass");
loginPage.clickLogin();
HomePage homePage = new HomePage(driver); // Смена контекста

// Пример с использованием чейнинга (Fluent Page Object):
HomePage homePage = new LoginPage(driver)
    .open()                 // Возвращает LoginPage
    .setUsername("user")    // Возвращает LoginPage
    .setPassword("pass")    // Возвращает LoginPage
    .submitWithSuccess();   // Возвращает HomePage (новый объект!)
// Далее можно продолжить: homePage.checkWelcomeMessage()...

Итог:

Точку и следующий метод можно ставить после любого метода, возвращающего объект, который содержит этот следующий метод. В контексте автоматизации это мощный инструмент для создания читаемых, выразительных и поддерживаемых API для ваших тестов. Паттерн Builder для конструирования сложных тестовых данных и Fluent Interface для описания действий пользователя — ключевые области применения.