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

Можно ли вставлять дополнительную бизнес-логику внутри метода получения значения свойства?

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

sobes.tech AI

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

Да, технически можно, но это плохая практика, если логика тяжёлая или имеет побочные эффекты. Геттер должен быть простым, предсказуемым и быстрым. Дополнительная бизнес-логика внутри него часто ухудшает читаемость, тестируемость и может приводить к неожиданным багам.

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

Метод получения значения свойства — это точка доступа к данным объекта. В нём допустимы простые вычисления, валидация или ленивое получение значения, если это не меняет состояние системы неожиданным образом. Если же внутри начинается сложная бизнес-логика, вызовы внешних сервисов, запись в БД или изменение других полей, такой геттер становится неявным источником побочных эффектов и нарушает принцип очевидности.

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

Допустимо: вычислить отображаемое имя на основе уже загруженных данных.

class User:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"

Нежелательно: в геттере ходить в БД или считать скидку по сложным правилам.

class Order:
    @property
    def total(self):
        # плохо: скрытая бизнес-логика и возможные побочные эффекты
        discount = get_discount_from_service(self.user_id)
        return self.items_sum - discount

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

В первом примере full_name — это удобное вычисляемое свойство: оно не меняет состояние объекта и зависит только от уже имеющихся полей. Такой подход обычно приемлем.

Во втором примере total выглядит как обычное свойство, но фактически может:

  1. обратиться к внешнему сервису;
  2. зависнуть или упасть по сетевой ошибке;
  3. дать разный результат при одинаковом вызове;
  4. скрыть дорогую операцию за простым доступом к полю.

Для таких случаев лучше вынести логику в отдельный метод, например calculate_total() или recalculate_discount(), чтобы по названию было понятно, что происходит не просто чтение значения.

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

  • Геттер должен быть простым, быстрым и предсказуемым.
  • Допустимы только лёгкие вычисления без побочных эффектов.
  • Сложная бизнес-логика в геттере ухудшает поддержку и тестирование.
  • Запросы к БД, сети, файловой системе и изменение состояния лучше выносить в методы.
  • Если поведение важное и неочевидное, его нужно делать явным через название метода.