如何避免在代码中使用运行总计?
-
27-09-2019 - |
题
我现在在学校学习编程、软件设计和 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
现在,耦合性降低了——交付和以旧换新模块根本不知道有关床铺价格的任何信息。这也提高了他们的凝聚力,因为他们正在做更专注的事情 - 计算费用,而不是对价格和费用求和。实际价格计算确实取决于其他模块,但这是问题所固有的。而且计算是有凝聚力的 - 它所做的“一件事”就是计算床的价格!