Как мне избегать использования беговых итогов в моем коде?

StackOverflow https://stackoverflow.com/questions/3463648

Вопрос

Я изучаю программную и программный дизайн и 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                                  

Теперь соединение уменьшается - модули доставки и обменов не знают ничего о ценах постели. Это также улучшает свою сплоченность, поскольку они делают что-то более ориентированные - расчетные сборы, а не подводят цены и сборы. Фактический расчет цены зависит от других модулей, но это присуще к проблеме. И расчет является сплоченным - «одно», которое это делает, вычисляют цену кровати!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top