Question

Je suis d'apprentissage et de programmation conception de logiciels et de Java à l'école en ce moment. La classe qui devient moi est mêlé logiciel de conception. Nous utilisons Word pour exécuter simplement le code VB pour faire des programmes simples. Mon instructeur dit que je suis en train de perdre la cohésion en utilisant les totaux en cours d'exécution. J'ai du mal à penser à une façon 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é):

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 et DeliveryPrice ensuite les deux secondes. Soi-disant, le dernier module peut même pas besoin d'être là est je fixe ce problème. Toute aide au débutant?

Était-ce utile?

La solution

Quand je regarde votre exemple, ce qui me saute aux yeux est un problème avec couplage entre les modules. (Si vous ne l'avez pas déjà étudié ce concept, vous avez probablement allez bientôt.) Cependant, trop de couplage et la cohésion trop peu vont souvent de pair, si tout va bien je peux quand même vous donner une réponse utile. (Simplifié à l'extrême mais les définitions adéquates-pour-ici: modules cohésif font un concentré chose au lieu de plusieurs choses sans rapport, et les modules couplés dépendent les uns des autres pour faire tout ce qu'ils font Nous voulons généralement des modules pour avoir une forte cohésion interne mais le couplage faible pour. 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

Quand 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épend pas vraiment du prix réduit, juste ou non des frais de livraison doit être chargée.

Maintenant, la façon dont vous avez structuré votre conception, votre variable « DeliveryPrice » est vraiment un « tel que livré » prix que Finalité dépendent du prix réduit. C'est le genre de chose que nous voulons nous débarrasser. On peut dire que vos modules sont trop serré, car ils dépendent les uns des autres d'une manière qui ne sont pas vraiment nécessaires pour résoudre le problème. On peut dire que leur manque de cohésion parce qu'ils font vraiment plus d'une chose - à savoir le module de prix de livraison est ajouter les frais de livraison à prix réduit au lieu de simplement calculer les frais de livraison .

Il est difficile de voir des exemples de jouets, mais cela importe que des dessins deviennent plus complexes. Avec seulement quelques lignes de pseudocode, il semble tout à fait naturel d'avoir un « total en cours d'exécution » fileté entre eux. Mais si les frais de livraison dépend d'un calcul complexe impliquant la distance par rapport à la maison du client, le poids de l'achat, et le jour de la semaine? Maintenant, l'avoir aussi impliquer quel que soit le prix réduit obtiendrait vraiment la confusion.

Donc, avec tout cela à l'esprit, considérez cette conception alternative:

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                                  

, le couplage est réduite - la fourniture et les modules d'échange 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 concentré - le calcul des droits, pas la somme des prix et des frais. Le calcul du prix réel ne dépend des autres modules, mais qui est inhérent au problème. Et le calcul est cohérent - la « une chose » qu'il fait est le calcul du prix du lit

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top