我正在学习编程和软件设计以及学校的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
连接后两个模块。据说,最后一个模块甚至可能不需要我解决了这个问题。对初学者有什么帮助吗?
答案 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
现在,耦合减少了 - 交付和以旧换新模块对床价一无所知。这也提高了他们的凝聚力,因为他们正在做一些更有针对性的事情 - 计算费用,而不是总结价格和费用。实际的价格计算确实取决于其他模块,但这是问题所固有的。计算是有凝聚力的 - 它正在做的“一件事”是计算床的价格!