Comment puis-je Évitez d'utiliser cumuls dans mon code?
-
27-09-2019 - |
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?
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