Interfaces
Il est difficile de comprendre le but d'un outil qui résout un problème que vous n'avez jamais eu. Je n'ai pas compris les interfaces pendant un certain temps après avoir commencé la programmation. Nous aurons compris ce qu'ils ont fait, mais je ne savais pas pourquoi vous vouliez en utiliser un.
Voici le problème - vous savez ce que vous voulez faire, mais vous avez plusieurs façons de le faire, ou vous pouvez changer la façon dont vous le faites plus tard. Ce serait bien si vous pouviez jouer le rôle du manager désemparé - aboyez quelques commandes et obtenez les résultats que vous souhaitez sans vous soucier de la façon dont cela est fait.
Supposons que vous ayez un tout petit site Web et que vous enregistriez toutes les informations de vos utilisateurs dans un fichier csv. Ce n'est pas la solution la plus sophistiquée, mais elle fonctionne assez bien pour stocker les détails de l'utilisateur de votre maman. Plus tard, votre site décolle et vous avez 10 000 utilisateurs. Il est peut-être temps d'utiliser une base de données appropriée.
Si vous aviez été intelligent au début, vous auriez vu cela arriver et vous n'auriez pas fait les appels pour enregistrer directement sur csv. Au lieu de cela, vous pensez à ce dont vous avez besoin, quelle que soit la façon dont il a été mis en œuvre. Disons store()
et retrieve()
. Vous créez une Persister
interface avec des méthodes abstraites pour store()
et retrieve()
et créez une CsvPersister
sous-classe qui implémente réellement ces méthodes.
Plus tard, vous pouvez créer un DbPersister
qui implémente le stockage et la récupération réels des données complètement différemment de la façon dont votre classe csv l'a fait.
La grande chose est que tout ce que vous avez à faire maintenant est de changer
Persister* prst = new CsvPersister();
à
Persister* prst = new DbPersister();
et puis vous avez terminé. Vos appels à prst.store()
et prst.retrieve()
fonctionneront toujours, ils sont juste traités différemment "en coulisses".
Maintenant, vous deviez encore créer les implémentations cvs et db, vous n'avez donc pas encore expérimenté le luxe d'être le patron. Les vrais avantages sont évidents lorsque vous utilisez des interfaces créées par quelqu'un d'autre. Si quelqu'un d'autre a eu la gentillesse d'en créer un CsvPersister()
et DbPersister()
déjà, alors il vous suffit d'en choisir un et d'appeler les méthodes nécessaires. Si vous décidez d'utiliser l'autre plus tard, ou dans un autre projet, vous savez déjà comment cela fonctionne.
Je suis vraiment rouillé sur mon C ++, donc je vais juste utiliser des exemples de programmation génériques. Les conteneurs sont un excellent exemple de la façon dont les interfaces vous facilitent la vie.
Vous pouvez avoir Array
, LinkedList
, BinaryTree
, etc. toutes les sous - classes de ce Container
qui a des méthodes telles que insert()
, find()
, delete()
.
Maintenant, lorsque vous ajoutez quelque chose au milieu d'une liste chaînée, vous n'avez même pas besoin de savoir ce qu'est une liste chaînée. Vous venez d'appeler myLinkedList->insert(4)
et il parcourt comme par magie la liste et la colle dedans. Même si vous savez comment fonctionne une liste chaînée (ce que vous devriez vraiment faire), vous n'avez pas besoin de rechercher ses fonctions spécifiques, car vous savez probablement déjà ce qu'elles sont en utilisant une autre Container
auparavant.
Classes abstraites
Les classes abstraites sont assez similaires aux interfaces (eh bien, techniquement, les interfaces sont des classes abstraites, mais ici je veux dire des classes de base qui ont certaines de leurs méthodes étoffées.
Supposons que vous créez un jeu et que vous devez détecter les ennemis à proximité du joueur. Vous pouvez créer une classe de base Enemy
qui a une méthode inRange()
. Bien qu'il y ait beaucoup de choses différentes sur les ennemis, la méthode utilisée pour vérifier leur portée est cohérente. Par conséquent, votre Enemy
classe aura une méthode étoffée pour vérifier la portée, mais des méthodes virtuelles pures pour d'autres choses qui ne partagent aucune similitude entre les types ennemis.
La bonne chose à ce sujet est que si vous gâchez le code de détection de plage ou si vous souhaitez le modifier, vous n'avez qu'à le changer en un seul endroit.
Bien sûr, il existe de nombreuses autres raisons pour les interfaces et les classes de base abstraites, mais ce sont quelques raisons pour lesquelles vous pouvez les utiliser.
Singletons
Je les utilise occasionnellement et je n'ai jamais été brûlé par eux. Cela ne veut pas dire qu'ils ne ruineront pas ma vie à un moment donné, sur la base des expériences des autres.
Voici une bonne discussion sur l'état mondial de la part de gens plus expérimentés et méfiants:
pourquoi l'état mondial est-il si mal?