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

Я изучаю практический объектно-ориентированный дизайн Сэнди Мец.В главе 4 «Создание гибких интерфейсов» мне представлены некоторые UML-диаграммы, на которых показаны взаимодействия и сообщения двух классов.Например, ниже приведена следующая схема из книги:

enter image description here

Описание этого изображения следующее:

Таким образом, эту диаграмму последовательности можно прочитать следующим образом: Клиент Мо отправляет сообщение fit_trips классу Trip, который активируется для его обработки, а затем, когда он завершается, возвращает ответ.

Будет лиТочная реализация, подобная следующей?

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

1 Ответ

0 голосов
/ 31 мая 2019

Следовательно, эту диаграмму последовательности можно прочитать следующим образом: Customer Мое отправляет сообщение suitable_trips в класс Trip, который активируется для его обработки, а затем, когда он завершается, возвращает ответ.

Давайте реализуем это точно так, как указано.

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`

Sidenote: Есть множество замечательных книг по Ruby, и мой персональный совет будет взять одну из них.Сэнди Метц, вероятно, отличный популист, но имеет смысл читать учебники от людей, которые на самом деле хороши в кодировании .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...