2010-08-11 4 views
1

Je suis en train d'apprendre la programmation et la conception de logiciels et Java à l'école en ce moment. La classe qui me fait confondre est la conception de logiciels. Nous utilisons Word pour exécuter du code VB simple pour faire des programmes simples. Mon instructeur dit que je perds la cohésion en utilisant des totaux cumulés. J'ai du mal à trouver un moyen de les éviter. Voici un exemple de certains pseudo-code dont je parle (les modules sont appelés forment un module pilote non représenté):Comment éviter d'utiliser les totaux cumulés dans mon code?

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 

Fondamentalement DiscountPrice est utilisé pour joindre les deux premiers modules, puis DeliveryPrice les deux secondes. Supposément, le dernier module peut même pas besoin d'être là est j'ai résolu ce problème. Toute aide au débutant?

+0

J'ai ajouté un tag agnostique au langage parce que vous mentionnez Java, donc je pense que vous souhaitez une solution générale au problème, pas seulement VBA. – Fionnuala

+0

+1 pour poser une question de débutant réfléchie – jtolle

Répondre

1

Quand je regarde votre exemple, ce qui me saute aux yeux est un problème avec couplant entre les modules. (Si vous n'avez pas déjà étudié ce concept, vous le ferez probablement bientôt.) Cependant, trop de couplage et trop peu de cohésion vont souvent de pair, donc j'espère que je peux encore vous donner une réponse utile. (Des définitions sursimplifiées mais adéquates pour: Les modules cohésifs font une chose focalisée au lieu de plusieurs choses sans rapport, et les modules couplés dépendent les uns des autres pour faire ce qu'ils font: nous voulons généralement que les modules aient une forte cohésion interne d'autres modules)

Je déduis de votre pseudo que vous voulez calculer le prix d'un lit comme ceci:.

* 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 

Lorsque vous exprimez comme ça, vous remarquerez peut-être que ces opérations sont (ou peuvent être) assez indépendants les uns des autres. Par exemple, les frais de livraison ne dépendent pas vraiment du prix réduit, seulement si des frais de livraison doivent être facturés.

Maintenant, la façon dont vous avez structuré votre design, votre variable «DeliveryPrice» est vraiment un prix «tel que livré» que ne dépendent du prix réduit. C'est le genre de chose dont nous voulons nous débarrasser. Nous pouvons dire que vos modules sont trop étroitement couplés parce qu'ils dépendent les uns des autres d'une manière qui n'est pas vraiment nécessaire pour résoudre le problème. Nous pouvons dire qu'ils manquent de cohésion parce qu'ils font vraiment plus d'une chose - c'est-à-dire le module de prix de livraison est ajoutant les frais de livraison au prix réduit au lieu de seulement calculant les frais de livraison.

Il est difficile de voir avec des exemples de jouets, mais cela est d'autant plus important que les dessins deviennent plus complexes. Avec juste quelques lignes de pseudocode, il semble parfaitement naturel d'avoir un "running running" entre eux. Mais que faire si les frais de livraison dépendent d'un calcul complexe impliquant la distance à la maison du client, le poids de l'achat, et le jour de la semaine? Maintenant, ayant également impliquer tout ce que le prix réduit serait vraiment déroutant.

Donc, avec tout cela à l'esprit, considérer cette autre conception:

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         

Maintenant, le couplage est réduite - la fourniture et les modules commerciaux en ne savent pas quoi que ce soit sur les prix des lits. Cela améliore également leur cohésion, car ils font quelque chose de plus ciblé - calcul des frais, pas de sommation des prix et des frais. Le calcul du prix réel dépend des autres modules, mais c'est inhérent au problème. Et le calcul est cohérent - la "seule chose" qu'il fait est de calculer le prix du lit!

+0

Très belle réponse. Je vous remercie. – nicorellius

Questions connexes