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

Я прохожу «Практический объектно-ориентированный дизайн» Сэнди Мец. В главе 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, а затем путаюсь в формулировках, особенно когда речь идет о получателе и отправителе. Я просто хочу быть уверенным, что я правильно понимаю, поэтому я полностью понимаю, куда должны идти методы и в каком классе.

На этой диаграмме сказано, что «дата_начала, сложность, потребность_велосипед» должны быть аргументами для suitable_trips, а не атрибутами клиента.

Sergio Tulentsev 30.05.2019 22:37

Я внес правку, чтобы отразить это спасибо. Будет ли это по-прежнему точным представлением?

Dan Rubio 30.05.2019 22:41

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

Sergio Tulentsev 30.05.2019 22:43

Также обратите более пристальное внимание на актеров на диаграмме. Это "клиент Мо" (конкретный экземпляр), а "классовая поездка" (не конкретная поездка)

Sergio Tulentsev 30.05.2019 22:46

К сожалению, все это показано на большем количестве диаграмм UML и не закодировано, но я просто продолжу попытки

Dan Rubio 30.05.2019 22:46

да, держись, награда того стоит.

Sergio Tulentsev 30.05.2019 22:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 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, и мой совет личный — выбрать вместо этого одну из них. Санди Мец, вероятно, отличный популист, но имеет смысл читать уроки от людей, которые действительно хороши в кодирование.

эта книга не о рубине, однако :)

Sergio Tulentsev 31.05.2019 08:55

@SergioTulentsev ну как угодно :)

Aleksei Matiushkin 31.05.2019 10:05

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