Toutes mes excuses pour la durée de cette réponse!
"existe-t-il une raison concevable pour laquelle ce composant pourrait être remplacé par une implémentation différente" et si la réponse est oui, alors je dois concevoir une abstraction et une interface appropriées pour ce composant.
«Toute raison concevable» est une position beaucoup trop extrême pour être adoptée. Presque chaque fonction peut être paramétrée d'une manière ou d'une autre, chaque module peut recevoir une stratégie ou une politique différente, et chaque constante peut être modifiée. Si vous fournissez un niveau d'abstraction supplémentaire pour chacun d'eux, vous finissez par écrire 2x plus de code sans gain immédiat, juste un gain potentiel plus tard si vous avez besoin de cette flexibilité.
Si vous suivez la voie de la fourniture d'interfaces afin que chacune de ces choses puisse être une façade pour l'une des différentes options, vous devez alors décider comment vous fournissez ces différentes options, y compris les valeurs par défaut, et quand vous essayez de rendre cela aussi simple comme l'objet d'origine était, vous vous retrouvez souvent avec une couche supplémentaire entière sur le dessus. Cela peut (et devient) absurde dans de nombreux logiciels `` d'entreprise '' du monde réel - puis-je suggérer humblement de lire cette satire qui, malheureusement, se rapproche trop près de chez soi dans de nombreux cas: Pourquoi je déteste les cadres .
Le plus grand argument contre cela est la complexité. Faisons l'hypothèse (probablement incorrecte) qu'il existe une bonne interface qui pourrait s'appliquer aussi bien à deux API de rendu 3D, et que quelqu'un peut vous le décrire dans une réponse ici. Vous travailleriez alors sur cette interface qui, en raison de sa nature polyvalente, couvrirait sans aucun doute les éléments que DX9 n'utilise pas - par exemple, la pléthore d'extensions d'API disponibles dans OpenGL mais pas dans DirectX 9. C'est une complication supplémentaire qui rendra votre code plus difficile à comprendre et à maintenir, et ralentira votre processus d'apprentissage. C'est déjà assez grave lorsque vous utilisez une bibliothèque multi-plate-forme existante telle que SDL, car les gens rencontrent toujours des fonctions et des restrictions étranges qui existent uniquement pour réparer quelque chose sur une plate-forme, mais vous '' Il faut non seulement savoir pourquoi cette partie de l'interface est là, mais aussi comment elle peut ou non interagir avec les parties que vous êtes sur le point d'écrire. par exemple. Vous finiriez par écrire des objets abstraits qui encapsulent les aspects des extensions OpenGL qui sont nécessaires dans votre code de rendu principal, même si vous n'avez pas encore de moyen de les utiliser.
Cependant, à l'avenir, une fois que vous maîtriserez le fonctionnement du système DX9, vous pourrez examiner le fonctionnement du système OpenGL. Vous verrez alors comment vous devez adapter votre système existant pour faire fonctionner les deux pièces, et le ferez, avec l'existence pratique de votre chemin de code DX9 existant comme test unitaire efficace pour vous assurer que votre refactoring est correct.
Vous avez la chance de travailler avec l'un des matériaux les plus fluides et les plus malléables connus de l'ingénierie - le code source stocké sous forme de données informatiques. Embrassez cette bénédiction en y apportant des changements lorsque vous savez que vous en avez besoin, plutôt que de les faire des mois à l'avance et de vous surcharger en attendant en ayant à écrire dans une abstraction que vous ne gagnez pas encore.