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

有帮助吗?

解决方案

当我看你的例子时,我突然想到一个问题 耦合 模块之间。(如果您还没有研究过这个概念,您可能很快就会学习。)然而,过多的耦合和过少的内聚常常同时出现,所以希望我仍然可以给您一个有用的答案。(过于简单但适合此处的定义:内聚模块专注于一件事情,而不是几件不相关的事情,而耦合模块则相互依赖来完成它们所做的任何事情。我们通常希望模块内部具有强内聚性,但与其他模块的耦合性较弱。)

我从你的伪代码推断你想计算一张床的价格,如下所示:

* 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                                  

现在,耦合性降低了——交付和以旧换新模块根本不知道有关床铺价格的任何信息。这也提高了他们的凝聚力,因为他们正在做更专注的事情 - 计算费用,而不是对价格和费用求和。实际价格计算确实取决于其他模块,但这是问题所固有的。而且计算是有凝聚力的 - 它所做的“一件事”就是计算床的价格!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top