Vous avez peut-être remarqué dans l’article précédent que certaines fonctions prennent comme paramètres d’entrée des objets de type HkxMaybe<T>
(T
pouvant être de n’importe quel type – int
par exemple). Si vous êtes observateurs, la seule différence qu’apporte ce type de paramètres par rapport au type T
auquel il se réfère, c’est qu’il est possible d’ignorer cette variable en utilisant la valeur HKX_NO_VALUE
.
Et c’est précisément à cela que sert cette classe ! Elle permet de gérer les variables qui peuvent avoir ou non une valeur, ceci de manière plus explicite et propre qu’avec des pointeurs null
.
1 Comment ça marche ?
C’est très simple, la classe HkxMaybe a deux attributs :
empty
détermine si l’instance a ou non une valeur,value
est la valeur de l’instance, celle-ci ne pourra être lue qu’à condition queempty
soit faux.
2 Pourquoi je ne crée pas d’instance ?
En réalité, vous créez des instances sans vous en rendre compte par le biais des conversions implicites. Par exemple nous avons utilisé précédemment (paragraphe 3.2) la fonction setTorqueLEDControl(HkxMaybe<hkxTorqueControl> newTorqueControl, HkxMaybe<hkxLEDControl> newLEDControl)
de la casse HkxPosControl :
servo.setTorqueLEDControl(HKX_TORQUE_FREE, HKX_LED_OFF);
Cela fonctionne car HKX_TORQUE_FREE
et HKX_LED_OFF
sont respectivement du type hkxTorqueControl
et hkxLEDControl
, ce qui crée implicitement des objets respectivement du type HkxMaybe<hkxTorqueControl>
et HkxMaybe<hkxLEDControl>
.
Vous pourriez tout aussi bien écrire la forme explicite :
servo.setTorqueLEDControl(HkxMaybe<hkxTorqueControl>(HKX_TORQUE_FREE), HkxMaybe<hkxLEDControl>(HKX_LED_OFF));
La première formulation (implicite) étant beaucoup plus légère et tout aussi compréhensible que la seconde (explicite).
3 Comment fonctionne le paramètre HKX_NO_VALUE
?
Maintenant, si vous ne souhaitez pas modifier le contrôle de la charge (newTorqueControl
), et donc créer un objet vide (empty
) de type hkxTorqueControl
, vous n’avez à priori pas d’autre solution que d’écrire grâce à la conversion implicite :
servo.setTorqueLEDControl(HkxMaybe<hkxTorqueControl>(), HKX_LED_OFF);
Cette forme étant lourde, j’ai créé un constructeur qui, s’il prend en entrée une variable du type hkxMaybeHasNoValue
, alors il crée un objet vide. Vous l’aurez compris HKX_NO_VALUE
est de ce type, ce qui permet d’alléger l’écriture :
servo.setTorqueLEDControl(HKX_NO_VALUE, HKX_LED_OFF);
4 Quand dois-je mettre la valeur ou l’adresse ?
Une première réponse simple : regardez la documentation ! 😉
Plus sérieusement, en reprenant notre exemple précédent (paragraphe 3.2), deux fonctions de la classe HkxPosControl sont utilisées :
servo.setTorqueLEDControl(HKX_TORQUE_FREE, HKX_LED_OFF)
servo.getBehaviour(&voltage, &temperature, &position, &velocity, &PWM, &goalPosition, &trajectoryPosition, &trajectoryVelocity)
La première prend la valeur car il s’agit de paramètres d’entrée, alors que la seconde prend l’adresse d’une variable car il s’agit de paramètres de sortie dont les valeurs seront retournées dans la variable. Ici encore, la conversion implicite s’appuie sur deux constructeurs différents prenant l’un la valeur, l’autre l’adresse.
5 Conclusion
J’espère avoir levé les doutes que vous aviez quand à l’utilisation de la classe HkxMaybe qui n’est pas détaillée dans le manuel de la librairie. Pour aller plus loin, je vous invite à consulter le manuel développer et le code.