Lors de l'écriture d'une bibliothèque ou de l'API publique d'un module qui sera utilisé par un grand nombre d'autres codes dans divers cas d'utilisation, quel est le meilleur moyen d'équilibrer flexibilité et facilité d'utilisation? Je crois que les deux sont souvent contradictoires, plus vous faites quelque chose de flexible, plus il est difficile de faire quelque chose de bien. Par exemple, le C++ STL utilise des itérateurs, dont les IMHO sont horriblement bas et ennuyeux à travailler, mais en échange ils sont extrêmement flexibles en permettant au même code de fonctionner sur tous les types de conteneurs STL. Un autre exemple est la philosophie de conception de la bibliothèque standard Java, avec ses petites classes très spécifiques conçues pour une modularité et une flexibilité maximales, par rapport à la bibliothèque standard Python, avec sa préférence pour une hiérarchie de classes plus simple. . Comment les choses comme celles-ci devraient-elles être équilibrées?Conception API: Flexibilité Vs. Facilité d'utilisation
Répondre
Si vous faites partie d'un organisme de normalisation qui peut imposer l'utilisation de vos classes sur d'autres, vous pouvez aller avec flexible et compliqué (par exemple stl).
Pour tout le monde, à moins qu'il y ait des raisons vraiment convaincantes, la facilité d'utilisation devrait toujours être votre premier choix. Sinon, peu de personnes utiliseront votre code/API. Si la courbe d'apprentissage pour utiliser le code de quelqu'un d'autre est élevée, la plupart des gens choisissent de réimplémenter uniquement les parties dont ils ont besoin. C'est généralement beaucoup plus rapide et les problèmes sont plus faciles à résoudre. À mon avis, la «facilité de compréhension» est la deuxième seulement à «ça fonctionne correctement» quand il s'agit d'évaluer la qualité du code.
En conclusion, si l'ajout de flexibilité se fait au détriment de la facilité d'apprentissage et d'utilisation, n'accroissez pas la flexibilité tant que la flexibilité n'est pas prouvée.
Je pense que vous devez considérer le public cible de la bibliothèque - si vous écrivez une bibliothèque que les développeurs moins expérimentés peuvent bien utiliser, vous devez penser à la façon de les aider. Dans le cas de la STL C++, la plupart des développeurs qui les utilisent ne sont pas dérangés par la mécanique supplémentaire, car ils sont habitués à cela et apprécient beaucoup plus la flexibilité.
Vous voudrez peut-être penser à deux niveaux d'accès via votre API, qui a un niveau qui permet de garder les choses simples et une couche qui permet plus de contrôle. Mais vous voudrez peut-être voir comment le cadre se développe avant d'aller aussi loin.
Je suis friand de l'API de la bibliothèque de classes de base .NET. La conception de la bibliothèque la plus suit these guidelines.
En lisant ces derniers, et le livre qui l'accompagne, j'ai pris plusieurs éléments clés de la connaissance:
L'API a été conçu en gardant à l'esprit que les éditeurs modernes ont des capacités de IntelliSense. Les noms plus longs sont acceptables, car vous pouvez mettre en tabulation les noms complets des classes et des méthodes. Ceci est en opposition avec les fonctions de style C avec des noms plus courts et obfusqués comme
strnicmp()
Utilisation du pattern Create, Set, Call: Toujours avoir un constructeur par défaut, sans paramètre. Fournissez des propriétés qui peuvent être définies dans n'importe quel ordre, puis autorisez les méthodes à être appelées. L'utilisation de ce modèle permet à un objet d'être dans un état non valide pendant une courte période de temps. (Après que le constructeur a été appelé, mais avant que toutes les propriétés ont été définies) Mais c'est correct. Vous pouvez signaler une mauvaise utilisation de l'API en lançant des exceptions. Cela rend l'utilisation de la classe plus accessible.
- 1. API RESTful vs Web Service API
- 2. Conception d'une API XACML
- 3. Motifs CLI/Antipatterns pour la facilité d'utilisation
- 4. SharePoint API: 2003 vs 2007
- 5. Erreur Gestion de la flexibilité
- 6. Quelle est la flexibilité subsonique
- 7. API Google Map vs MS Earth Earth API
- 8. Api de géolocalisation Maxmind: Apache vs PHP
- 9. Flexibilité dans la portée du projet?
- 10. BindingList et la flexibilité des colonnes
- 11. facebook effet de facilité w/jquery
- 12. Google AJAX API, jQuery et google.load() vs $ (function() {})
- 13. T4 vs CodeDom vs Oslo
- 14. Quelle flexibilité existe-t-il dans une boucle Django for?
- 15. utilisant OleDB vs SqlServerCe
- 16. Couplage lâche contre cachette de l'information et facilité de changement
- 17. Comment tester une facilité d'utilisation d'une bibliothèque C++ dans configure.in?
- 18. Comment concevoir une table/schéma DB avec facilité?
- 19. API XML dans C?
- 20. HttpRuntime.Cache [] vs Application []
- 21. Script.Net vs Nemerle
- 22. Style fonctionnel Conception API C# (retour du paramètre fonction augmenté du résultat du calcul)
- 23. MVC Object Oriented Techniques - Comment minimiser les requêtes et maintenir la flexibilité?
- 24. DB Question de conception: Arbre (une table) vs. Deux tables pour les tweets et les retweets?
- 25. Delphi Prism/VS 2008: Passer du code à la conception avec une seule clé?
- 26. Conception logique versus physique
- 27. Conseil en conception d'application
- 28. Conception décision
- 29. conception compilateur
- 30. Conception appropriée
Ceci est certainement une chose subjective, cependant: Je trouve les API .NET horribles. Je préfère les API fonctionnelles avec des types essentiellement immuables et des fonctions libres (ou statiques) qui fonctionnent sur eux. Moins d'état = couplage réduit, moins de problèmes de thread, code plus facile à lire. Mais c'est une question d'opinion. –