Я прохожу «Практический объектно-ориентированный дизайн» Сэнди Мец. В главе 4 «Создание гибких интерфейсов» мне представлены некоторые UML-диаграммы, показывающие взаимодействия и сообщения двух классов. Например, ниже приведена следующая схема из книги:
Описание этого изображения следующее:
Therefore, this sequence diagram can be read as follows: Customer Moe sends the suitable_trips message to the Trip class, which is activated to process it and then, when finished, returns a response.
Будет ли реализация, подобная следующей, точной?
class Customer
attr_reader :name, :on_date, :of_difficulty, :need_bike
def initialize(name, on_date, of_difficulty, need_bike)
@name = name
@on_date = on_date
@of_difficulty = of_difficulty
@need_bike = need_bike
end
end
class Trip
attr_reader :trip
def initialize(trip)
@trip = trip
end
def suitable_trips(on_date, of_difficulty, need_bike)
#gives list of suitable trips based on factors
end
end
moe = Customer.new("moe", "now", "easy", "yes")
trip = Trip.new('Grand Canyon')
trip.suitable_trips(moe.on_date, moe.of_difficulty, moe.need_bike)
Иногда мне кажется, что я понимаю, но потом я сталкиваюсь с другой диаграммой UML, а затем путаюсь в формулировках, особенно когда речь идет о получателе и отправителе. Я просто хочу быть уверенным, что я правильно понимаю, поэтому я полностью понимаю, куда должны идти методы и в каком классе.
Я внес правку, чтобы отразить это спасибо. Будет ли это по-прежнему точным представлением?
Нет, еще выключен. На диаграмме (и сопроводительном тексте) сказано, что клиент должен отправить это сообщение (и в вашем случае это какой-то безымянный объект более высокого уровня). Я не помню деталей этой конкретной книги, но если вы прокрутите немного дальше, велика вероятность, что вы найдете правильную реализацию этого. :)
Также обратите более пристальное внимание на актеров на диаграмме. Это "клиент Мо" (конкретный экземпляр), а "классовая поездка" (не конкретная поездка)
К сожалению, все это показано на большем количестве диаграмм UML и не закодировано, но я просто продолжу попытки
да, держись, награда того стоит.
Therefore, this sequence diagram can be read as follows:
Customer
Moe sends thesuitable_trips
message to theTrip
class, which is activated to process it and then, when finished, returns a response.
Давайте реализуем это именно так, как указано.
class Trip
class << self # class methods
def suitable_trips(on_date, of_difficulty, need_bike)
# gives list of suitable trips based on factors
[Trip.new(...), Trip.new(...), ...]
end
end
end
class Customer
attr_reader :name
def initialize(name)
@name = name
end
# this is a search function, specific for Moe
def best_fit(on_date, of_difficulty, need_bike)
trips = Trip.suitable_trips(on_date, of_difficulty, need_bike)
# get the best accordingly to some rules
# that are specific for Moe
trips.find { |trip| ... }
end
end
И используйте его как:
moe = Customer.new("Moe")
moe.best_fit("2019-06-01", :hard, false)
#⇒ Trip instance or `nil`
Примечание: существует множество отличных книг по Ruby, и мой совет личный — выбрать вместо этого одну из них. Санди Мец, вероятно, отличный популист, но имеет смысл читать уроки от людей, которые действительно хороши в кодирование.
эта книга не о рубине, однако :)
@SergioTulentsev ну как угодно :)
На этой диаграмме сказано, что «дата_начала, сложность, потребность_велосипед» должны быть аргументами для
suitable_trips
, а не атрибутами клиента.