1

我现在正在学校学习编程和软件设计以及 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是后两个。据说,最后一个模块甚至可能不需要在那里,我解决了这个问题。对初学者有帮助吗?

4

1 回答 1

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                                  

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

于 2010-08-13T15:41:41.803 回答