Как избежать использования итоговых сумм в моем коде? - PullRequest
1 голос
/ 12 августа 2010

Сейчас я изучаю программирование и дизайн программного обеспечения и Java в школе. Класс, который меня запутывает - это Software Design. Мы используем 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 вторых двух. Предположительно, последний модуль может даже не понадобиться, там я исправил эту проблему. Любая помощь новичку?

1 Ответ

1 голос
/ 13 августа 2010

Когда я смотрю на ваш пример, у меня выскакивает проблема с связью между модулями. (Если вы еще не изучали эту концепцию, вы, вероятно, скоро это сделаете.) Однако, слишком сильная связь и слишком слабая сплоченность часто идут вместе, так что, надеюсь, я все еще могу дать вам полезный ответ. (Упрощенные, но подходящие для этого определения: связующие модули выполняют одну целенаправленную вещь вместо нескольких несвязанных между собой, а связанные модули зависят друг от друга в том, что они делают. Обычно мы хотим, чтобы модули имели сильную внутреннюю связь, но слабую связь другие модули.)

Из вашего псевдокода я делаю вывод, что вы хотите рассчитать цену кровати следующим образом:

* 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                                  

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...