您好我的任务是使用以下简介构建应用程序。
实施一个界面,根据促销规则计算价格。
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
我对我的代码不太满意...循环与循环等。但我只是寻求一些帮助封装,因为我不知道我哪里出错了。
关于适用于简报的良好设计模式的任何建议也是有益的,因为对我采取的方法不太自信。感谢
答案 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”等等。)