Пункты охраны и принцип единой ответственности (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, я оставил его здесь для лучшего понимания