2010-08-11 29 views
1

我現在在學習編程和軟件設計以及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第二兩項。據說,最後的模塊可能甚至不需要在那裏我解決了這個問題。對初學者有幫助嗎?

+0

因爲您提到了Java,所以我添加了與語言無關的標記,所以我認爲您希望解決問題的一般解決方案,而不僅僅是VBA。 – Fionnuala 2010-08-12 08:40:09

+0

+1問一個深思熟慮的初學者問題 – jtolle 2010-08-13 15:42:06

回答

1

當我看着你的例子,跳到我身上的是模塊之間耦合的問題。 (如果你還沒有研究過這個概念,那麼你可能很快就會這樣做。)但是,過多的耦合和過少的凝聚力經常會在一起,所以希望我仍然可以給你一個有用的答案。 (過分簡化但適合於此處的定義:內聚模塊完成一個關注的事情而不是幾個不相關的事情,並且耦合的模塊依賴於彼此來做他們所做的任何事情。我們通常希望模塊內部具有強大的內聚力,但是耦合力弱其他模塊)

我從你的僞推斷,要計算一個牀的價格,像這樣:

* 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 

當你表達出來這樣的,你可能會注意到,這些操作是(或者可以be)相互獨立。例如,運送費用並不取決於折扣價格,而僅僅取決於是否收取運送費用。

現在,您設計結構的方式,您的'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         

現在,耦合減少 - 交付和以舊換新模塊不知道任何關於牀的價格。這也提高了他們的凝聚力,因爲他們正在做更重點的事情 - 計算費用,而不是總結價格和費用。實際的價格計算取決於其他模塊,但這是問題所固有的。計算結果是一致的 - 它所做的「一件事」是計算牀的價格!

+0

非常好的答案。謝謝。 – nicorellius 2010-09-07 15:15:09

相關問題