Что такое идемпотентность метода в программировании?

«Что такое идемпотентность метода в программировании?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

Пример идемпотентного и неидемпотентного метода в контексте сервиса:

class UserService {
    // ИДЕМПОТЕНТНЫЙ метод (аналогичен HTTP PUT или DELETE)
    public function updateUserEmail(int $userId, string $newEmail): void {
        // Неважно, сколько раз вызвать этот метод с (1, 'alice@example.com')
        // В БД всегда будет установлен этот email для пользователя с ID=1.
        $this->userRepository->update($userId, ['email' => $newEmail]);
    }

    // НЕИДЕМПОТЕНТНЫЙ метод (аналогичен HTTP POST)
    public function createUser(string $name): int {
        // Каждый вызов создаст новую запись в БД с новым ID.
        // Повторные вызовы с теми же данными приведут к дублированию пользователей.
        $newId = $this->userRepository->insert(['name' => $name]);
        return $newId;
    }
}

// Использование
$service = new UserService();
$service->updateUserEmail(1, 'alice@new.com'); // Устанавливает email
$service->updateUserEmail(1, 'alice@new.com'); // Ничего не меняет — результат тот же

$id1 = $service->createUser('Bob'); // Создаёт пользователя с ID=100
$id2 = $service->createUser('Bob'); // Создаёт ДРУГОГО пользователя с ID=101
// $id1 != $id2 — метод не идемпотентен.

Практическое значение: Проектирование идемпотентных методов позволяет безопасно повторять запросы при таймаутах или ошибках сети без риска дублирования операций или нарушения консистентности данных.