Как мне избегать использования беговых итогов в моем коде?
-
27-09-2019 - |
Вопрос
Я изучаю программную и программный дизайн и Java в школе прямо сейчас. Класс, который заставляет меня перепутать, - это дизайн программного обеспечения. Мы используем слово для запуска простого кода 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
Когда вы выражаете это, вы можете заметить, что эти операции (или могут быть) довольно независимы друг от друга. Например, плата за доставку на самом деле не зависит от цены на скидку, только в том, должна ли плата за доставку.
Теперь, как вы структурировали свой дизайн, ваша переменная «доставкойPRICE» действительно является «как доставленная» цена, которая делает зависеть от скидки цены. Это то, что мы хотим избавиться. Мы можем сказать, что ваши модули слишком плотно связаны, потому что они зависят друг от друга таким образом, которым на самом деле не требуется решить проблему. Можно сказать, что им не хватает сплоченности, потому что они действительно делают более одной вещи - то есть модуль цен доставки добавление платы за доставку со скидкой цена вместо всего расчет платы за доставку.
Трудно увидеть с примерами игрушек, но это имеет значение, так как дизайн становится более сложным. Благодаря нескольким строчкам псевдокода, кажется, вполне естественным, чтобы между ними было «проведение общего». Но что, если плата за доставку зависит от комплексного расчета, связанного с расстоянием до дома клиента, веса покупки, а также день недели? Теперь, имея это также вовлекать все, что цена скидки на самом деле будет запутаться.
Итак, со всеми, что имейте в виду, рассмотрите этот альтернативный дизайн:
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
Теперь соединение уменьшается - модули доставки и обменов не знают ничего о ценах постели. Это также улучшает свою сплоченность, поскольку они делают что-то более ориентированные - расчетные сборы, а не подводят цены и сборы. Фактический расчет цены зависит от других модулей, но это присуще к проблеме. И расчет является сплоченным - «одно», которое это делает, вычисляют цену кровати!