Combien de déclarations de fonctions abstraites d'une classe abstraite sont-elles trop nombreuses?Trop de fonctions abstraites - OOP Meilleures pratiques
Par exemple, pour un système de paiement fondé sur des membres:
Plusieurs modes de paiement sont pris en charge:
- Carte de crédit
- jeton (un paiement par carte de crédit, mais en utilisant un jeton)
- Redirect (par exemple Paypal)
- Manuel (admin charge manuellement l'utilisateur)
J'ai une classe abstraite PaymentMode et différents modes ci-dessus s'étendent à cette classe.
Chaque mode a sa propre logique unique des méthodes suivantes et je dois déclarer des méthodes abstraites en classe PaymentMode pour ces
// each mode has own way of validating the customer data
validate();
// own logic of cleaning customer data (e.g removing/adding/updating)
preparePaymentData();
// returns a string for saving in database, subclass must implement so developers plan to extend the PaymentMode abstract will be forced to return the correct value
getModeOfPayment();
// each mode has its own logic when determining payment gateways to attempt
getGatewaysToAttempt();
// before sending the payment to gateway, each mode has its own logic when adding specific data
addCustomDataSpecificForGateway();
// check if transaction has failed, different payment modes has different logic of determining a failed transaction
isTransactionFailed()
Il 6 logique unique pour chaque mode, j'ai réussi à commonized la commune codes déjà et placez-le dans la classe PaymentMode.
Ce nombre peut augmenter à mesure que nous implémentons de nouvelles fonctionnalités propres à chaque mode. Dans mon esprit, je crains que si un futur développeur étend ma classe PaymentMode, il doit implémenter toutes les déclarations de fonctions abstraites.
Ainsi, un grand nombre de déclarations de fonctions abstraites indique-t-il un BAD DESIGN? Combien est trop?
Si sa mauvaise conception, puis, peut vous recommander des techniques ou des modèles de conception qui permettra de résoudre ce problème
Merci
Si votre classe abstraite n'a vraiment aucune fonctionnalité implémentée, et vous ne vous attendez pas à ce qu'elle le soit, alors vous pourriez envisager d'utiliser un _interface_ à la place. Une interface serait une chose très appropriée à utiliser si vous voulez décrire _behavior_ de paiements sans spécifier exactement ce que ce comportement est. –
@TimBiegeleisen merci pour votre suggestion, mais ma classe abstraite a des fonctionnalités en elle puisque ces différents modes de paiement partagent des fonctionnalités communes – Bogz
Je ne vois rien de mal à avoir une poignée de méthodes abstraites. Vous pouvez également envisager d'utiliser à la fois une interface et une classe abstraite. –