Пункты охраны и принцип единой ответственности (SRP)

В настоящее время вы читаете фантастическую книгу "Практический объектно-ориентированный дизайн в Ruby" и прорабатываете простое ката, чтобы по-настоящему попрактиковаться в некоторых обсуждаемых принципах.

У меня есть метод, который делает следующее:

def release_bike
  capacity_empty_error if empty?
  bike
end

Это "освобождает объект велосипеда" из моего класса DockingStation (я знаю, что объект велосипеда должен быть аргументом, но пока я просто хочу, чтобы метод возвращал объект велосипеда, а не удалял его).

#Capacity_empty_error делает следующее:

def capacity_empty_error
  raise "Docking Station is empty."
end

И # пустой? похоже:

def empty?
  bike == nil
end

Где bike - это метод-оболочка для моей переменной экземпляра @bike. Следовательно, текущая емкость класса DockingStation равна 1, поскольку код предполагает, что он заполнен, когда для параметра #bike установлено что-то (я планирую добавить правильную емкость позже).

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

Я чувствую, что строка охранника в #release_bike:

capacity_empty_error if empty?

одна ответственность за метод и возвращение bike на следующей строке вниз - вторая ответственность. Тогда это, очевидно, нарушает SRP, но я не могу понять, как использовать условие защиты, кроме как добавить его к существующему методу в качестве второй обязанности.

Это можно сделать? Как другие достигли этого?

1 ответ

Решение

Как насчет перемещения функциональности в другие классы / модули?

module BikeChecker
  def capacity_empty_error
    raise "Docking Station is empty."
  end

  def release_bike
    capacity_empty_error if empty?
  end

  def empty?
    false
  end
end

class YourClass
  include BikeChecker

  def release_bike
    super
    bike
  end

  def empty?
    bike == nil
  end
end 

Вы можете отказаться от #empty? метод от BikeChecker, я оставил его здесь для лучшего понимания

Другие вопросы по тегам