Когда я смотрю на ваш пример, у меня выскакивает проблема с связью между модулями. (Если вы еще не изучали эту концепцию, вы, вероятно, скоро это сделаете.) Однако, слишком сильная связь и слишком слабая сплоченность часто идут вместе, так что, надеюсь, я все еще могу дать вам полезный ответ. (Упрощенные, но подходящие для этого определения: связующие модули выполняют одну целенаправленную вещь вместо нескольких несвязанных между собой, а связанные модули зависят друг от друга в том, что они делают. Обычно мы хотим, чтобы модули имели сильную внутреннюю связь, но слабую связь другие модули.)
Из вашего псевдокода я делаю вывод, что вы хотите рассчитать цену кровати следующим образом:
* 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
Теперь связь снижена - модули доставки и обмена ничего не знают о ценах на кровати. Это также улучшает их сплоченность, поскольку они делают что-то более целенаправленное - расчет сборов, а не суммирование цен и сборов. Фактический расчет цены зависит от других модулей, но это присуще проблеме. И расчет сплоченный - единственное, что он делает, это вычисляет цену кровати!