Notre domaine de connaissance implique des personnes marchant sur une plaque d'enregistrement de pression avec leurs pieds nus. Nous faisons la reconnaissance d'image qui se traduit par des objets de la classe «Pied», si un pied humain est reconnu dans les données du capteur.
Plusieurs calculs doivent être effectués sur les données du pied.
Maintenant, quelle API serait la meilleure:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
Ou:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
Maintenant, il y a beaucoup de pour et de contre que je peux trouver, mais je ne peux pas vraiment décider lesquels sont les plus importants. Remarque, il s'agit d'une application utilisateur final, et non d'une bibliothèque de logiciels que nous vendons.
Aucun conseil?
Certains avantages de la première approche pourraient être:
- KISS - tout est très concret. L'API, mais aussi l'implémentation.
- valeurs de retour fortement typées.
- l'héritage de cette classe est infaillible. Rien ne peut être annulé, seulement ajouté.
- L'API est très fermée, rien ne rentre, rien ne peut être outrepassé, donc moins peut mal tourner.
Certains con:
- Le nombre de getters augmentera, à mesure que chaque nouveau calcul que nous inventons sera ajouté à la liste
- L'API est plus susceptible de changer, et si des changements de rupture sont introduits, nous avons besoin d'une nouvelle version d'API, un Foot2.
- en cas de réutilisation de la classe dans d'autres projets, nous pourrions ne pas avoir besoin de tous les calculs
Quelques avantages pour la deuxième approche:
- plus flexible
- l'api est moins susceptible de changer, (en supposant que nous avons obtenu l'abstraction correcte, sinon, changer coûtera plus cher)
Certains con:
- vaguement tapé. Besoins lancés à chaque appel.
- le paramètre de chaîne - j'ai de mauvais sentiments à ce sujet (ramification sur les valeurs de chaîne ...)
- Il n'y a pas de cas d'utilisation actuel / exigence qui rend obligatoire la flexibilité supplémentaire, mais il pourrait y en avoir à l'avenir.
- l'API impose des restrictions: chaque calcul doit dériver d'une classe de base. Obtenir un calcul sera forcé par cette méthode 1, et le passage de paramètres supplémentaires sera impossible, à moins que nous ne concevions un moyen encore plus dynamique et super flexible de passer des paramètres qui augmente encore plus la complexité.
getCalculation()
.
enum
et activer ses valeurs. Pourtant, je pense que la deuxième option est mauvaise, car elle s'écarte de KISS.