正确封装数组集合

时间:2011-11-04 14:43:21

标签: ruby oop design-patterns encapsulation

您好我的任务是使用以下简介构建应用程序。

实施一个界面,根据促销规则计算价格。

co = Checkout.new(promotional_rules)
co.scan(item)
co.scan(item)
price = co.total

基本上,根据设置的促销规则,某些商品会相应打折。

我在我的代码,指出我已封装的组promotional_rules的,然后暴露的规则作为数组反正一些反馈 - 坏OO

我最初创建了一个promotional_rules对象,其中包含一系列规则。

  def initialize
    @rules = []
  end

 def addrule(rule)
   @rules.push(rule)
 end

然后在我的结帐对象中,我有promote_rules对象已经设置并传递给初始化程序。我遍历promote_rules对象中包含的规则数组,并将它们应用于结帐对象扫描的项目。

def initialize(promotionalrules=Promotionalrules.new)
  @promotionalrules = promotionalrules
end

....Other code

for rule in @promotionalrules.getrules
  for item in @items
    ##Execute rule on current item.
  end
end

我对我的代码不太满意...循环与循环等。但我只是寻求一些帮助封装,因为我不知道我哪里出错了。

关于适用于简报的良好设计模式的任何建议也是有益的,因为对我采取的方法不太自信。感谢

1 个答案:

答案 0 :(得分:2)

我猜他们抱怨这种“曝光”:

for rule in @promotionalrules.getrules

将您的Promotionalrules(可能应该称为PromotionalRules)的内部规则输出到调用者。解决方法是稍微颠倒你的逻辑:

class Promotionalrules
  #...
  # and possibly remove the getrules method completely
  def apply_to_item(item)
    # Apply @rules to item
  end
  #...
end

然后再说:

# I'm not sure how the rules and item interact so this "each" might
# be a different iterator in reality
@items.each { |i| @promotional_rules.apply_to_item(i) }

基本的变化是您将规则集作为一个整体应用于每个项目。这隐藏了规则集实现细节,并且作为额外奖励,允许您轻松支持彼此依赖的规则(“除非您使用优惠券Y,否则可以获得折扣X”等等。)