如何避免在我的代码中使用Running Totals?

时间:2010-08-11 23:30:33

标签: language-agnostic vba coupling cohesion

我正在学习编程和软件设计以及学校的Java。让我混淆的课程是软件设计。我们使用Word来运行简单的VB代码来完成简单的程序。我的导师说我通过使用跑步总数来失去凝聚力。我很难想到一种避免它们的方法。这是我正在讨论的一些伪代码的示例(模块被称为未显示的驱动程序模块):

CaluculateDiscountPrice module
    DiscountPrice = (FloorPrice * (1 – DiscountRate))
End module

CalculateDeliveryPrice module
    If DeliveryFee = “Yes” Then
        DeliveryPrice = DiscountPrice + 20  
    ElseIf DeliveryFee = “No” Then
        DeliveryPrice = DiscountPrice
    End If
End module

CalculateTradeInCredit module
    If TradeInCredit = “Yes” Then
        CreditedPrice = DeliveryPrice – 5
    ElseIf TradeInCredit = “No” Then
        CreditedPrice = DeliveryPrice
    End If
End module

CaluculateCostOfBed module
    CostOfBed = CreditedPrice
End module

基本上DiscountPrice用于连接前两个模块,然后用DeliveryPrice连接后两个模块。据说,最后一个模块甚至可能不需要我解决了这个问题。对初学者有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

当我看一下你的例子时,突然发现的是模块之间耦合的问题。 (如果你还没有研究过这个概念,你可能很快就会这样做。)但是,太多的耦合和太少的凝聚力经常会在一起,所以希望我仍然可以给你一个有用的答案。 (过度简化但足够用于这里的定义:有凝聚力的模块做一个集中​​的事情而不是几个无关的事情,并且耦合的模块依赖于彼此做它们做的任何事情。我们通常希望模块在内部具有强大的内聚力但是弱耦合到其他模块。)

我从您的伪代码中推断出您想要计算一张床的价格:

* start with the floor price
* discount it
* add in a delivery fee
* subtract a trade-in credit
* the result is the cost of the bed

当你这样表达时,你可能会注意到这些操作是(或可能)相互独立的。例如,运费并不取决于折扣价,只取决于是否收取运费。

现在,您构建设计的方式,您的'DeliveryPrice'变量实际上是一个“交付”价格, 取决于折扣价格。这是我们想要摆脱的东西。我们可以说你的模块耦合得太紧,因为它们以不是解决问题所不需要的方式相互依赖。我们可以说他们缺乏凝聚力,因为他们实际上做的不止一件事 - 即交付价格模块是将交货费添加到折扣价而不是仅仅计算交货费

很难看到玩具示例,但这很重要,因为设计变得更加复杂。只需几行伪代码,在它们之间有一个“运行总计”线程似乎是很自然的。但是,如果交付费用取决于涉及到客户住所的距离,购买的重量以及一周中的哪一天的复杂计算,该怎么办?现在,让它涉及任何折扣价格会让人感到困惑。

因此,考虑到所有这些,请考虑这种替代设计:

CalculateDeliveryFee module                                  
    If DeliveryFeeCharged = “Yes” Then                                  
        DeliveryFee = 20                                    
    End If                                  
End module                                  

CalculateTradeInCredit module                                  
    If TradeInCreditApplied = “Yes” Then                                  
        TradeInCredit = 5                                  
    End If                                  
End module                                  

CaluculateCostOfBed module 
    DiscountPrice = (FloorPrice * (1 – DiscountRate))  
    AsDeliveredPrice = DiscountPrice + DeliveryFee   
    WithTradeInPrice = AsDeliveredPrice - TradeInCredit                             
    CostOfBed = WithTradeInPrice 
End module                                  

现在,耦合减少了 - 交付和以旧换新模块对床价一无所知。这也提高了他们的凝聚力,因为他们正在做一些更有针对性的事情 - 计算费用,而不是总结价格和费用。实际的价格计算确实取决于其他模块,但这是问题所固有的。计算是有凝聚力的 - 它正在做的“一件事”是计算床的价格!