协助将UML图转换为Ruby代码

时间:2017-02-24 20:00:56

标签: ruby uml diagram

UML Diagram

这是我图表的链接。

他们是3个班级。(任命,每月任命,和OneTimeAppointment)。我迷失在这一点上。我曾多次重复我的讲座,但我无法超越这一点。这只是一个练习题。任何一步一步的帮助都会非常有帮助。

这是我到目前为止的代码。

class Appointment 
  attr_accessor :location, :purpose, :hour, :min

  def initialize the_location, the_purpose, the_hour, the_min
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end 

  def to_s
  end    
end


class MonthlyAppointment
  attr_accessor :location, :purpose, :day, :hour, :min

  def initialize the_location, the_purpose, the_day, the_hour, the_min
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end

  def occurs_on?(the_year, the_month, the_day)
  return @day == the_day
  end
end


class OneTimeAppointment
  attr_accessor :year, :month, :day

  def initialize the_year, the_month, the_day
    @year = the_year
    @month = the_month
    @day = the_day
  end      

  def occurs_on?(the_year, the_month, the_day)
  return @year == the_year &&
         @month == the_month &&
         @day == the_day
  end      
end

编辑后的帖子:我想这样实现它......

 class Item
  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

  def quantity=(new_quantity)
    @quantity = new_quantity
  end

  def quantity
    @quantity
  end  
end

1 个答案:

答案 0 :(得分:1)

让我们以每月约会为例。 (我将为你留下另一个,所以我没有做你所有的功课:))

这里的顶级课程是约会,其中包含常用的字段和方法 到其他两个班级。所以我们可以从那里开始。

让我们定义班级

class Appointment
end

它需要一个带有几个字段的初始化程序

class Appointment
  def initialize(the_location, the_purpose, the_hour, the_min)
  end
end

现在,由于我们有一个我们已经定义了初始化程序的类,因此ruby会免费为我们提供新方法。

这个类中有几个字段,位置,目的,小时,分钟。我们可以将初始化程序中的那些保存到 实例变量。

class Appointment
  def initialize(the_location, the_purpose, the_hour, the_min)
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end
end

有。我们现在拥有所有字段,新方法和初始化方法。接下来我们需要location()。 这是一个getter,一种获取该字段值的方法。

class Appointment
  def initialize(the_location, the_purpose, the_hour, the_min)
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end

  def location
    return @location
  end
end

我们走了。但事实上,因为写这样的吸气剂是一项常见的任务(我们必须做5次才能完成 这个类),ruby有一个更短的方法来做到这一点。如果我们说attr_reader:location,ruby知道定义一个方法 就像上面那个。所以使用它,我们的新课程是这样的:

class Appointment
  attr_reader :location

  def initialize(the_location, the_purpose, the_hour, the_min)
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end
end

我们也可以为其他四个领域做同样的事情。

class Appointment
  attr_reader :location, :purpose, :hour, :min

  def initialize(the_location, the_purpose, the_hour, the_min)
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end
end

好的,现在我们拥有除了to_s()之外的所有东西。 to_s是一个返回约会的字符串版本的方法。 基本上是一个粗略的人类可读描述。让我们来定义

class Appointment
  attr_reader :location, :purpose, :hour, :min

  def initialize(the_location, the_purpose, the_hour, the_min)
    @location = the_location
    @purpose = the_purpose
    @hour = the_hour
    @min = the_min
  end

  def to_s
    "<Appointment #{@hour}:#{@min} at #{@location} for #{@purpose}>"
  end
end

这将给我们一个类似于&#34;在办公室预约2:34的描述,用于进度更新&#34;。 这对我来说很好看!

现在我们已经完成了Appointment类,让我们来做MonthlyAppointment类。 它显然应该是约会的子类,即使你的图表没有显示出来。

class MonthlyAppointment < Appointment
end

到目前为止一切顺利。它有一个初始化器。让我们来定义

class MonthlyAppointment < Appointment
  def initialize(the_location, the_purpose, the_day, the_hour, the_min)
  end
end

在那里,它符合UML为初始化接口指定的内容。 现在,我们看到有一个名为&#34; @ day&#34;的字段,因为初始化程序有一天的参数, 我们可以保存初始化程序的值。我们还想保存超类的一切 我也很关心,所以我们打电话给super来让父类的初始化程序也运行起来。

class MonthlyAppointment < Appointment
  def initialize(the_location, the_purpose, the_day, the_hour, the_min)
    super(the_location, the_purpose, the_hour, the_min)
    @day = the_day
  end
end

我们需要一个白天吸气剂

class MonthlyAppointment < Appointment
  attr_reader :day

  def initialize(the_location, the_purpose, the_day, the_hour, the_min)
    super(the_location, the_purpose, the_hour, the_min)
    @day = the_day
  end
end

最后,我们需要定义happen_on?。 occurs_on?需要一年零一天,并将返回真或假。 带问号的方法应始终返回true或false。 现在,每月都会进行一次预约,所以我们现在可以忽略它。 它也发生在每个月,所以我们可以忽略它。但它只发生在特定的一天 每个月,让我们比较一下被问及我们保存的那一天。 如果它们匹配,那么我们应该返回true。如果您每月预约15日, 你只需要知道它是否是第15个或者不知道它是否发生在约会。

class MonthlyAppointment < Appointment
  attr_reader :day

  def initialize(the_location, the_purpose, the_day, the_hour, the_min)
    super(the_location, the_purpose, the_hour, the_min)
    @day = the_day
  end

  def occurs_on?(the_year, the_mon, the_day)
    if @day == the_day
      return true
    else
      return false
    end
  end
end

瞧!那应该是你的MonthlyAppointment课程。你能尝试实现OneTimeAppointment吗? 如果你在这里发布,我会给出指示。