如何最好地重构具有大量条件逻辑的两个类?

时间:2009-07-20 12:14:54

标签: ruby oop architecture

我有一个Event类,它保存一个事件的开始和结束时间。每个Event对象都可以有许多关联的ChildEvent对象,表示父事件的每次重复。这些类中的每一个都需要根据它们的编辑方式采取不同的操作,例如

只删除一个事件:

  • 事件:在删除之前,让第一个孩子成为所有其他孩子的父母。
  • ChildEvent:正常删除

删除活动及所有后续活动:

  • 事件:删除所有子事件然后自行删除
  • ChildEvent:删除所有未来的兄弟姐妹然后自行删除

仅编辑一个事件:

  • 事件:让第一个孩子成为所有其他孩子的父母,然后更新
  • ChildEvent:照常更新

编辑活动及所有后续活动:

  • 事件:更新所有子事件然后自行更新
  • ChildEvent:更新所有未来的兄弟姐妹,然后自行更新

目前我通过检查条件并采取适当行动来实现这一目标,但它开始变得混乱(还有其他相关行为的条件)。我很想知道更有经验的程序员会如何处理这个问题(我正在使用ruby)。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

听起来specification pattern封装你的逻辑

的情况

答案 1 :(得分:0)

为什么不直接以双向链表的形式链接事件?

一个事件将有一个previous和一个next位置(如果链的第一个或最后一个,则为零)。

只删除一个事件(delete):

  • previous活动的next位置设置为此活动的previous位置
  • next活动的previous位置设置为此活动的next位置
  • 删除此活动

删除活动及所有后续活动(delete-all):

  • 删除此活动
  • next活动的previous个广告位设为nil
  • 递归next活动
  • 直到next为零

仅编辑一个事件(edit):

  • 编辑此活动
  • previous活动的next个广告位设置为此活动的previous个广告位
  • next活动的previous个广告位设置为此活动的next个广告位

编辑活动和所有后续活动(edit-all):

  • 如果是初始通话,请将next事件的previous位置设为nil
  • 编辑此活动
  • 递归next活动
  • 直到next为零

答案 2 :(得分:0)

我建议尝试不同的对象模型。而不是EventsChildEvents,您可以将其视为EventTypeEvent s。

EventType  # Has many Events
---------
name
# ...

Event      # Belongs to EventType
-----
event_id
start_time
end_time
# ...

然后您的编辑操作将大大简化。

查找上一个活动...

Event.find(:first, :conditions => [
  'event_type_id = ? AND start_time > ?',
  event.type.id,
  event.start_time],
  :order => 'ASC'
)

删除事件以及该类型的所有后续事件......

events_to_delete = Event.find(:all, 
  :conditions => [
    'event_type_id = ? AND start_time >= ?', 
    event.event_type.id,
    event.start_time
  ])

Event.destroy( all_events_to_delete.map { |event| event.id } )