Domanda

Sto imparando programmazione e progettazione del software e Java a scuola in questo momento. La classe che si sta mi è confuso Software Design. Stiamo usando Word per eseguire semplice codice VB per fare semplici programmi. Il mio istruttore dice che sto perdendo la coesione utilizzando totali parziali. Sto avendo un momento difficile pensare a un modo per evitarli. Ecco un esempio di alcuni pseudocodice sto parlando (i moduli sono chiamati forma di un modulo del driver che non viene mostrato):

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

Fondamentalmente DiscountPrice viene utilizzato per unire i primi due moduli e quindi DeliveryPrice secondo due. Presumibilmente, l'ultimo modulo non può nemmeno bisogno di essere lì è ho risolto questo problema. Qualsiasi aiuto al principiante?

È stato utile?

Soluzione

Quando guardo il tuo esempio, quello che salta fuori di me è un problema con accoppiamento tra i moduli. (Se non avete già studiato questo concetto, è probabilmente presto sarà.) Tuttavia, troppo accoppiamento e troppo poco la coesione vanno spesso insieme, quindi spero di poter ancora dare una risposta utile. (Definizioni troppo semplificata, ma adeguate-for-qui: moduli coesive fanno uno focalizzato cosa invece di diverse cose non collegati, e moduli accoppiati dipendono gli uni dagli altri a fare qualunque cosa facciano Noi di solito vogliono moduli per avere una forte coesione interna, ma l'accoppiamento debole per. altri moduli.)

deduco dal pseudocodice che si desidera calcolare il prezzo di un letto in questo modo:

* 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

Quando si esprimono così, si potrebbe notare che queste operazioni sono (o possono essere) abbastanza indipendenti l'uno dall'altro. Per esempio, la tassa di consegna in realtà non dipende dal prezzo scontato, proprio sulla necessità o meno di una tassa di consegna è da addebitare.

Ora, il modo in cui hai strutturato il vostro disegno, la variabile 'DeliveryPrice' è in realtà un prezzo "al momento della consegna", che fa dipendono dal prezzo scontato. Questo è il genere di cosa che vogliamo eliminare. Possiamo dire che i moduli siano troppo strettamente accoppiati perché dipendono vicenda in modi che non sono realmente necessari per risolvere il problema. Possiamo dire che mancano di coesione perché stanno realmente facendo più di una cosa - vale a dire il modulo prezzo di consegna è aggiungendo la tassa di consegna per il prezzo scontato invece di il calcolo della tassa di consegna .

E 'difficile vedere con esempi di giocattoli, ma questo importa come i disegni diventano più complessi. Con poche righe di pseudocodice, sembra perfettamente naturale avere un "totale parziale" filettato tra loro. Ma cosa succede se la tassa di consegna dipende da un calcolo complesso che coinvolge la distanza a casa del cliente, il peso dell'acquisto, e il giorno della settimana? Ora, avendo esso anche coinvolgere qualunque sia il prezzo scontato otterrebbe davvero confuso.

Quindi, con tutto questo in mente, prendere in considerazione questo progetto alternativo:

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                                  

Ora, l'accoppiamento è ridotto - la consegna e moduli di trade-in non si sa nulla circa i prezzi da letto. Ciò migliora anche la loro coesione, dal momento che stanno facendo qualcosa di più concentrato - calcolare le tasse, non sommando i prezzi e le tariffe. Il calcolo prezzo effettivo non dipende gli altri moduli, ma che è inerente al problema. E il calcolo è coesa - la "una cosa" che sta facendo è il calcolo del prezzo del letto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top