Donc, probablement comme beaucoup, je me retrouve souvent confronté à des maux de tête avec des problèmes de conception dans lesquels, par exemple, il existe un modèle / approche de conception qui semble s'adapter intuitivement au problème et présente les avantages souhaités. Très souvent, il y a une mise en garde qui rend difficile la mise en œuvre du modèle / de l'approche sans une sorte de travail autour qui annule alors l'avantage du modèle / de l'approche. Je peux très facilement finir par itérer à travers de nombreux modèles / approches, car il est prévisible que presque tous ont des mises en garde très importantes dans des situations du monde réel dans lesquelles il n'y a tout simplement pas de solution facile.
Exemple:
Je vais vous donner un exemple hypothétique basé vaguement sur un vrai que j'ai récemment rencontré. Supposons que je souhaite utiliser la composition plutôt que l'héritage, car les hiérarchies d'héritage ont nui à l'évolutivité du code dans le passé. Je pourrais refactoriser le code mais trouver ensuite qu'il existe certains contextes où la superclasse / classe de base a simplement besoin d'appeler des fonctionnalités sur la sous-classe, malgré les tentatives pour l'éviter.
La meilleure approche suivante semble implémenter un modèle à moitié délégué / observateur et un modèle à moitié composition pour que la superclasse puisse déléguer le comportement ou pour que la sous-classe puisse observer les événements de la superclasse. Ensuite, la classe est moins évolutive et maintenable car il n'est pas clair comment elle doit être étendue, il est également difficile d'étendre les écouteurs / délégués existants. De plus, les informations ne sont pas bien cachées car on commence à avoir besoin de connaître l'implémentation pour voir comment étendre la superclasse (sauf si vous utilisez très largement les commentaires).
Donc, après cela, je pourrais simplement choisir d'utiliser simplement des observateurs ou des délégués pour échapper aux inconvénients liés à la confusion des approches. Cependant, cela vient avec ses propres problèmes. Par exemple, je pourrais trouver que je finis par avoir besoin d'observateurs ou de délégués pour une quantité croissante de comportements jusqu'à ce que je finisse par avoir besoin d'observateurs / délégués pour pratiquement tous les comportements. Une option pourrait être d'avoir un seul gros écouteur / délégué pour tout le comportement, mais la classe d'implémentation se retrouve avec beaucoup de méthodes vides, etc.
Ensuite, je pourrais essayer une autre approche, mais il y a tout autant de problèmes avec cela. Ensuite, le suivant et le suivant, etc.
Ce processus itératif devient très difficile lorsque chaque approche semble avoir autant de problèmes que les autres et conduit à une sorte de paralysie des décisions de conception . Il est également difficile d'accepter que le code finira également par poser problème, quel que soit le modèle de conception ou l'approche utilisé. Si je me retrouve dans cette situation, cela signifie-t-il que le problème lui-même doit être repensé? Que font les autres lorsqu'ils rencontrent cette situation?
Edit: Il semble y avoir un certain nombre d'interprétations de la question que je veux clarifier:
- J'ai complètement exclu la POO car il s'avère que ce n'est pas réellement spécifique à la POO, et il est trop facile de mal interpréter certains des commentaires que j'ai faits en passant à propos de la POO.
- Certains ont prétendu que je devrais adopter une approche itérative et essayer différents modèles, ou que je devrais rejeter un modèle lorsqu'il cesse de fonctionner. C'est le processus auquel je comptais me référer en premier lieu. Je pensais que c'était clair à partir de l'exemple mais j'aurais pu le rendre plus clair, j'ai donc édité la question pour le faire.