Скажем, я написал жемчужину, которая делает ленивые звонки в Google Distance API и делает результаты доступными. Примерно так:
module GoogleDirections
class Journey
attr_reader :directions, :origin, :destination
# Origin and destination can either be string addresses or
# pairs of lat,long co-ordinates
def initialize(origin, destination)
@origin = origin.is_a?(Array) ? origin.join(',') : origin
@destination = destination.is_a?(Array) ? destination.join(',') : destination
end
# calculate the trip distance
def trip_distance
@trip_distance ||= directions.inject(0){|sum,leg| sum += leg["distance"]["value"] }
end
# This method requests directions from Google when we need to
def directions
@directions ||= JSON.parse(# get the directions from )
end
end
end
Итак, теперь я добавляю этот драгоценный камень в свой проект Rails. У проекта Tis rails есть автобусы с пунктами назначения и направлениями. Итак, что я хочу сделать, это спросить Google о направлениях, прежде чем я сохраню маршрут в базу данных.
class Bus < ActiveRecord::Base
before_save :set_trip_distance
def set_trip_distance
self.trip_distance = GoogleDirections::Journey.new(self.origin, self.destination).trip_distance
end
end
но затем, если я добавлю метод продолжительности поездки в свой драгоценный камень, я мог бы в конечном итоге также установить его на своей модели шины. Очевидно, что если я сделаю это, я должен извлечь создание экземпляра Journey.
class Bus < ActiveRecord::Base
before_save :set_trip_distance, :set_trip_duration
def journey
GoogleDirections::Journey.new(self.origin, self.destination)
end
def set_trip_distance
self.trip_distance = journey.trip_distance
end
def set_trip_duration
self.trip_duration = journey.trip_duration
end
end
но методы set_trip_distance
и set_trip_duration
кажутся очень похожими друг на друга. Я могу представить себе случай, когда я могу установить 6 разных атрибутов маршрута в автобусе. Это заставляет меня чувствовать, что должен быть лучший шаблон дизайна, который я могу использовать здесь.
Полагаю, я мог бы спроектировать Драгоценный камень таким образом, чтобы я мог include
сделать это, но при этом усилилась бы связь между Драгоценным камнем и именами столбцов на моих Автобусах, что кажется плохим?
Какой вариант лучше?