lundi 12 mai 2008

Boostons notre C++

Java a sa bibliothèque standard, C# a .NET, et C++ a boost.

Boost, c'est bien, mangez-en! Boost, c'est:

* exhaustif, la plupart des fonctionnalités dont on a toujours besoin y sont
* modulaire, on peut prendre ce qui nous intéresse, et laisser le rèste
* construit sur des concepts robustes, comme l'orienté fonctionnel, le typage fort
* géré par la communauté à travers un process de peer-review, quiconque peut proposer de nouveaux ajouts
* distribué sous une licence extrêmement permissive

Gare cependant à l'indigestion, on peut facilement s'y perdre. Voilà donc la petite liste des librairies de boost que j'utilise tout le temps.

* boost::shared_ptr - Les compteurs de référence sont très utiles, mais gare à les utiliser à bon escient, c'est à dire lorsque std::auto_ptr ou boost::scoped_ptr ne sont plus adaptés.
* boost::bind - Indispensable pour gérer ses closures dans les algorithmes de la bibliothèque standard. Par contre, se fait une spécialité de cracher les erreurs de compile les plus imbitables qui soient.
* boost::noncopyable - Bien pratique pour rendre une classe non copiable. Quand bien même c'est très facile de modifier soit-même sa classe, c'est encore plus simple (et plus lisible pour le suivant) de dériver de boost::noncopyable
* BOOST_FOREACH - Bien qu'étant une macro, c'est une reine de lisibilité. Très pratique lorsque j'ai 5 ou 6 conteneurs imbriqués les uns dans les autres.
* boost::lexical_cast - Transformer les chaines en flotants ou en entier sans avoir à se battre avec les vieilles atoi et atof, c'est bien vu. Encore mieux, étant une fonction template, l'on pourra parfaitement intégrer par exemple lexical_cast à sa classe de vecteurs 3D de types génériques.
* boost::posix_time - Je tremble à chaque fois que je dois gérer des dates dans mon code. posix_time et ses amis boost::gregorian et autres font leur boulot, et je tremble (un peu) moins.
* boost::optional - Un peu comme noncopyable, c'est surtout une bonne manière de commenter le code, en donnant plus de sens qu'un pointeur

Celles-là, je les utilise moins souvent, mais elles n'en sont pas moins utiles au moment où on en a besoin:
* boost::assign - Très pratique pour rapidement remplir des conteneurs, je l'utilise tout le temps dans mes tests unitaires
* boost::unit_test - En parlant de tests unitaires, voilà une belle bibliothèque qui, pour n'en être pas exhaustive, n'en remplit pas moins mes besoins. Bonus pour la quantité minimum de code de mise en place nécessaire grâce à auto_unit_test
* boost::asio - des concepts très intéressants dans cette petite nouvellement arrivée et qui propose un cadre plutôt bien conçu pour gérer ses connections réseaux et évènements asynchrones.

En revanche, je déconseille fortement boost::iostreams::zlib! Utilisez plutôt mon wrapper dans le post précédent :)

Aucun commentaire: