
Code propre Rust
Description
Introduction au livre
Creuser en profondeur dans Rust pour en révéler le véritable cœur.
Rust Clean Code présente les bonnes pratiques de code et les modèles de conception propres à Rust pour vous aider à tirer pleinement parti de la conception unique de ce langage. Il aborde des sujets tels que la métaprogrammation, l'implémentation de bibliothèques personnalisées et la création d'interfaces fluides, le tout avec des explications claires et des exemples de code réutilisables.
Dans ce cours, vous comprendrez le fonctionnement interne de Rust et apprendrez à écrire du code Rust efficace, facile à maintenir et à faire évoluer en permanence.
Rust Clean Code présente les bonnes pratiques de code et les modèles de conception propres à Rust pour vous aider à tirer pleinement parti de la conception unique de ce langage. Il aborde des sujets tels que la métaprogrammation, l'implémentation de bibliothèques personnalisées et la création d'interfaces fluides, le tout avec des explications claires et des exemples de code réutilisables.
Dans ce cours, vous comprendrez le fonctionnement interne de Rust et apprendrez à écrire du code Rust efficace, facile à maintenir et à faire évoluer en permanence.
- Vous pouvez consulter un aperçu du contenu du livre.
Aperçu
indice
Préface du traducteur x
Avis du lecteur bêta xi
Début xiii
Remerciements xiv
À propos de ce livre xv
À propos de la couverture xix
PARTIE I COMPOSANTS
CHAPITRE 1 Modèle de rouille 3
1.1 Ce que ce livre aborde 5
1.2 Qu'est-ce qu'un modèle de conception ? 6
1.3 Pourquoi ce livre est différent 9
1.4 Outils requis : 10
1.5 Résumé 11
CHAPITRE 2 : Les éléments constitutifs de base de la rouille 13
2.1 Générique 14
2.1.1 Système de types Turing-complet 14
2.1.2 Pourquoi les génériques ? 15
2.1.3 Principes de base des génériques 15
2.1.4 Aperçu des options de Rust 19
2.1.5 Structure du marqueur et type de fantôme 19
2.1.6 Limites des caractéristiques des paramètres génériques 23
2.2 Caractéristique 23
2.2.1 Pourquoi les traits ne sont pas de la programmation orientée objet 24
2.2.2 Contenu du trait 25
2.2.3 Comprendre les traits en examinant le code orienté objet 26
2.2.4 Combinaison de gènes génériques et de traits 30
2.2.5 Dérivation automatique des caractéristiques 35
2.2.6 Objet de trait 37
2.3 Résumé 40
CHAPITRE 3 Flux de code 43
3.1 Aperçu de la correspondance de motifs 44
3.1.1 Principes de base de la reconnaissance de formes 44
3.1.2 Traitement concis avec l'opérateur ? 50
3.2 Rouille fonctionnelle 53
3.2.1 Principes fondamentaux de la programmation fonctionnelle en Rust 54
3.2.2 Capture des variables de fermeture 56
3.2.3 Examen des itérateurs 57
3.2.4 Obtention d'un itérateur avec iter(), into_iter() et iter_mut() 62
3.2.5 Fonctions d'itération 71
3.3 Résumé 76
PARTIE II Modèles de base
CHAPITRE 4 Motifs de base 79
4.1 L'acquisition des ressources est initialisée à 80
4.1.1 RAII en C et C++ 81
4.1.2 Visite guidée du RAII 85 de Rust
4.1.3 Résumé du RAII 87 de Rust
4.2 Passage des arguments par valeur et par référence 89
4.2.1 Passage par valeur 89
4.2.2 Passage par référence 91
4.2.3 Quand faire quoi ? : Passage par valeur et passage par référence 93
4.3 Constructeur 94
4.4 Visibilité et accessibilité des membres de l'objet 97
4.5 Gestion des erreurs 99
4.6 Statut global 102
4.6.1 lazy-static.rs 105 / 4.6.2 once_cell 106
4.6.3 static_init 107 / 4.6.4 std::cell::OnceCell 108
4.7 Résumé 109
CHAPITRE 5 Modèles de conception : Au-delà des bases 111
5.1 Métaprogrammation avec les macros 112
5.1.1 Macros déclaratives de base 113
5.1.2 Quand dois-je utiliser des macros ? 115
5.1.3 Écriture d'un mini-DSL à l'aide de macros 121
5.1.4 Utilisation des macros pour DRY 122
5.2 Arguments de fonction optionnels 126
5.2.1 Examen des arguments optionnels en Python 126
5.2.2 Examen des arguments optionnels en C++ 127
5.2.3 Rust n'a pas d'arguments optionnels 127
5.2.4 Se moquer des arguments optionnels avec des traits 128
5.3 Modèle de construction 131
5.3.1 Implémentation du modèle Builder 132
5.3.2 Renforcer les bâtisseurs avec des traits 134
5.3.3 Développement de générateurs avec des macros 135
5.4 Modèle d'interface fluide 139
5.4.1 Fluent Builder 139
5.4.2 Test Fluent Builder 142
5.5 Modèle d'observateur 143
5.5.1 Pourquoi ne pas utiliser de fonctions de rappel ? 143
5.5.2 Implémentation d'un observateur 144
5.6 Modèle de commande 147
5.6.1 Définition des modèles de commandes 148
5.6.2 Implémentation du modèle de commande 149
5.7 Modèle Newtype 152
5.8 Résumé 155
CHAPITRE 6 Conception des bibliothèques 157
6.1 Bonne conception de bibliothèque 158
6.2 Bien faire une chose 159
6.3 Éviter l'abstraction excessive 160
6.4 S'en tenir aux types de base 160
6.5 Utilisation des outils 161
6.6 Les bons artistes copient, les grands artistes volent (extrait de la bibliothèque standard) 162
6.7 Documentez tout et fournissez des exemples 162
6.8 Ne modifiez pas le code de vos utilisateurs 163
6.9 Pensez à l'état 163
6.10 Considérations esthétiques 164
6.11 Facilité d'utilisation des bibliothèques Rust 165
6.11.1 Retour sur les listes chaînées 165
6.11.2 Amélioration de la conception des API avec Rustdoc 167
6.11.3 Amélioration des listes chaînées par des tests supplémentaires 174
6.11.4 Création d'une bibliothèque facile à déboguer pour les autres 176
6.12 Résumé 179
PARTIE III MODÈLES AVANCÉS
CHAPITRE 7 : Utilisation des traits, des génériques et des structures pour des tâches spécialisées 183
7.1 Constantes génériques 184
7.2 Implémentation des caractéristiques pour les types de caisses externes 186
7.2.1 Structures enveloppantes 187 / 7.2.2 Déballage des structures enveloppées à l'aide de Deref 187
7.3 Caractéristique étendue 189
7.4 Caractéristique de couverture 191
Caractéristique du marqueur 7.5 194
7.6 Étiquetage de structure 196
7.7 Objets de référence 199
7.8 Résumé 205
CHAPITRE 8 : Machines à états, coroutines, macros et préludes 207
8.1 Machine à états de traits 208
8.2 Coroutines 212
8.3 Macros procédurales 218
8.4 Prélude 222
8.5 Résumé 226
PARTIE IV Éviter les problèmes
CHAPITRE 9 : IMMUTABILITÉ 229
9.1 Les avantages de l'immuabilité 230
9.2 Pourquoi l'immuabilité n'est pas une panacée 232
9.3 Comment appréhender les données immuables 233
9.4 Comprendre l'immuabilité de Rust 234
9.5 Examen du concept fondamental d'immuabilité 236
9.6 Utiliser les traits pour rendre (presque) tout immuable 239
9.7 Utilisation de la vache pour l'immuabilité 240
9.8 Caisse pour les structures de données immuables 244
9.8.1 Utilisation de l'IM 244 / 9.8.2 Utilisation du RPDS 245
9.9 Résumé 247
CHAPITRE 10 : ANTIMODÈLES 249
10.1 Qu'est-ce qu'un anti-modèle ? 250
10.2 Utilisation non sécurisée 251
10.2.1 Que fait l'élément dangereux ? 253
10.2.2 Où puis-je utiliser unsafe ? 254
10.2.3 Quand dois-je utiliser unsafe ? 256
10.2.4 L'insécurité est-elle dangereuse ? 257
10.3 Utilisation de unwrap() 257
10.4 Utilisation de Vec 258
10.5 Trop d'exemplaires 262
10.6 Utilisation de Deref pour émuler le polymorphisme 263
10.7 Données mondiales et singletons 268
10.8 Trop de pointeurs intelligents 269
10.9 La voie à suivre 270
10.10 Résumé 271
ANNEXE A Installation de Rust 273
A.1 Installation des outils nécessaires pour ce livre 273
A.1.1 Installation d'outils pour macOS avec Homebrew 273
A.1.2 Installation d'outils pour les systèmes Linux 274
A.1.3 Installation des outils pour Windows 274
A.2 Gestion de rustc et autres composants de Rust avec rustup 275
A.2.1 Installation de rustc et autres composants 275
A.2.2 Changement de la chaîne d'outils par défaut avec rustup 275
A.2.3 Mise à jour des composants Rust 275
Recherche 277
Avis du lecteur bêta xi
Début xiii
Remerciements xiv
À propos de ce livre xv
À propos de la couverture xix
PARTIE I COMPOSANTS
CHAPITRE 1 Modèle de rouille 3
1.1 Ce que ce livre aborde 5
1.2 Qu'est-ce qu'un modèle de conception ? 6
1.3 Pourquoi ce livre est différent 9
1.4 Outils requis : 10
1.5 Résumé 11
CHAPITRE 2 : Les éléments constitutifs de base de la rouille 13
2.1 Générique 14
2.1.1 Système de types Turing-complet 14
2.1.2 Pourquoi les génériques ? 15
2.1.3 Principes de base des génériques 15
2.1.4 Aperçu des options de Rust 19
2.1.5 Structure du marqueur et type de fantôme 19
2.1.6 Limites des caractéristiques des paramètres génériques 23
2.2 Caractéristique 23
2.2.1 Pourquoi les traits ne sont pas de la programmation orientée objet 24
2.2.2 Contenu du trait 25
2.2.3 Comprendre les traits en examinant le code orienté objet 26
2.2.4 Combinaison de gènes génériques et de traits 30
2.2.5 Dérivation automatique des caractéristiques 35
2.2.6 Objet de trait 37
2.3 Résumé 40
CHAPITRE 3 Flux de code 43
3.1 Aperçu de la correspondance de motifs 44
3.1.1 Principes de base de la reconnaissance de formes 44
3.1.2 Traitement concis avec l'opérateur ? 50
3.2 Rouille fonctionnelle 53
3.2.1 Principes fondamentaux de la programmation fonctionnelle en Rust 54
3.2.2 Capture des variables de fermeture 56
3.2.3 Examen des itérateurs 57
3.2.4 Obtention d'un itérateur avec iter(), into_iter() et iter_mut() 62
3.2.5 Fonctions d'itération 71
3.3 Résumé 76
PARTIE II Modèles de base
CHAPITRE 4 Motifs de base 79
4.1 L'acquisition des ressources est initialisée à 80
4.1.1 RAII en C et C++ 81
4.1.2 Visite guidée du RAII 85 de Rust
4.1.3 Résumé du RAII 87 de Rust
4.2 Passage des arguments par valeur et par référence 89
4.2.1 Passage par valeur 89
4.2.2 Passage par référence 91
4.2.3 Quand faire quoi ? : Passage par valeur et passage par référence 93
4.3 Constructeur 94
4.4 Visibilité et accessibilité des membres de l'objet 97
4.5 Gestion des erreurs 99
4.6 Statut global 102
4.6.1 lazy-static.rs 105 / 4.6.2 once_cell 106
4.6.3 static_init 107 / 4.6.4 std::cell::OnceCell 108
4.7 Résumé 109
CHAPITRE 5 Modèles de conception : Au-delà des bases 111
5.1 Métaprogrammation avec les macros 112
5.1.1 Macros déclaratives de base 113
5.1.2 Quand dois-je utiliser des macros ? 115
5.1.3 Écriture d'un mini-DSL à l'aide de macros 121
5.1.4 Utilisation des macros pour DRY 122
5.2 Arguments de fonction optionnels 126
5.2.1 Examen des arguments optionnels en Python 126
5.2.2 Examen des arguments optionnels en C++ 127
5.2.3 Rust n'a pas d'arguments optionnels 127
5.2.4 Se moquer des arguments optionnels avec des traits 128
5.3 Modèle de construction 131
5.3.1 Implémentation du modèle Builder 132
5.3.2 Renforcer les bâtisseurs avec des traits 134
5.3.3 Développement de générateurs avec des macros 135
5.4 Modèle d'interface fluide 139
5.4.1 Fluent Builder 139
5.4.2 Test Fluent Builder 142
5.5 Modèle d'observateur 143
5.5.1 Pourquoi ne pas utiliser de fonctions de rappel ? 143
5.5.2 Implémentation d'un observateur 144
5.6 Modèle de commande 147
5.6.1 Définition des modèles de commandes 148
5.6.2 Implémentation du modèle de commande 149
5.7 Modèle Newtype 152
5.8 Résumé 155
CHAPITRE 6 Conception des bibliothèques 157
6.1 Bonne conception de bibliothèque 158
6.2 Bien faire une chose 159
6.3 Éviter l'abstraction excessive 160
6.4 S'en tenir aux types de base 160
6.5 Utilisation des outils 161
6.6 Les bons artistes copient, les grands artistes volent (extrait de la bibliothèque standard) 162
6.7 Documentez tout et fournissez des exemples 162
6.8 Ne modifiez pas le code de vos utilisateurs 163
6.9 Pensez à l'état 163
6.10 Considérations esthétiques 164
6.11 Facilité d'utilisation des bibliothèques Rust 165
6.11.1 Retour sur les listes chaînées 165
6.11.2 Amélioration de la conception des API avec Rustdoc 167
6.11.3 Amélioration des listes chaînées par des tests supplémentaires 174
6.11.4 Création d'une bibliothèque facile à déboguer pour les autres 176
6.12 Résumé 179
PARTIE III MODÈLES AVANCÉS
CHAPITRE 7 : Utilisation des traits, des génériques et des structures pour des tâches spécialisées 183
7.1 Constantes génériques 184
7.2 Implémentation des caractéristiques pour les types de caisses externes 186
7.2.1 Structures enveloppantes 187 / 7.2.2 Déballage des structures enveloppées à l'aide de Deref 187
7.3 Caractéristique étendue 189
7.4 Caractéristique de couverture 191
Caractéristique du marqueur 7.5 194
7.6 Étiquetage de structure 196
7.7 Objets de référence 199
7.8 Résumé 205
CHAPITRE 8 : Machines à états, coroutines, macros et préludes 207
8.1 Machine à états de traits 208
8.2 Coroutines 212
8.3 Macros procédurales 218
8.4 Prélude 222
8.5 Résumé 226
PARTIE IV Éviter les problèmes
CHAPITRE 9 : IMMUTABILITÉ 229
9.1 Les avantages de l'immuabilité 230
9.2 Pourquoi l'immuabilité n'est pas une panacée 232
9.3 Comment appréhender les données immuables 233
9.4 Comprendre l'immuabilité de Rust 234
9.5 Examen du concept fondamental d'immuabilité 236
9.6 Utiliser les traits pour rendre (presque) tout immuable 239
9.7 Utilisation de la vache pour l'immuabilité 240
9.8 Caisse pour les structures de données immuables 244
9.8.1 Utilisation de l'IM 244 / 9.8.2 Utilisation du RPDS 245
9.9 Résumé 247
CHAPITRE 10 : ANTIMODÈLES 249
10.1 Qu'est-ce qu'un anti-modèle ? 250
10.2 Utilisation non sécurisée 251
10.2.1 Que fait l'élément dangereux ? 253
10.2.2 Où puis-je utiliser unsafe ? 254
10.2.3 Quand dois-je utiliser unsafe ? 256
10.2.4 L'insécurité est-elle dangereuse ? 257
10.3 Utilisation de unwrap() 257
10.4 Utilisation de Vec 258
10.5 Trop d'exemplaires 262
10.6 Utilisation de Deref pour émuler le polymorphisme 263
10.7 Données mondiales et singletons 268
10.8 Trop de pointeurs intelligents 269
10.9 La voie à suivre 270
10.10 Résumé 271
ANNEXE A Installation de Rust 273
A.1 Installation des outils nécessaires pour ce livre 273
A.1.1 Installation d'outils pour macOS avec Homebrew 273
A.1.2 Installation d'outils pour les systèmes Linux 274
A.1.3 Installation des outils pour Windows 274
A.2 Gestion de rustc et autres composants de Rust avec rustup 275
A.2.1 Installation de rustc et autres composants 275
A.2.2 Changement de la chaîne d'outils par défaut avec rustup 275
A.2.3 Mise à jour des composants Rust 275
Recherche 277
Image détaillée

Dans le livre
Contrairement à l'ouvrage Design Patterns du GoF, ce livre n'est pas une liste de modèles de conception, mais plutôt une discussion et une exploration de modèles spécifiques, d'exemples et d'implémentations.
Il y a deux raisons pour lesquelles nous ne listons pas les modèles :
Les modèles ne sont pas de simples gabarits ou du code standard, et copier-coller des modèles ne vous permet de réaliser que 10 % (ou moins) du code complet.
Ce livre s'adresse aux lecteurs qui ont soif de connaissances et de développement personnel.
--- p.9
Les caractéristiques uniques du langage Rust exigent une réflexion plus approfondie lors de la conception d'API et de l'écriture de code de haute qualité.
Il vous faut notamment réfléchir davantage à la manière de gérer la mémoire et la durée de vie des objets, de transmettre des valeurs entre les contextes, d'éviter les conditions de concurrence et de veiller à ce que votre API soit conviviale.
Rust regorge également de nouvelles opportunités pour créer et découvrir de nouveaux modèles, et il continuera sans aucun doute à évoluer même après la publication de ce livre.
Pour aller sur Mars, nous devons construire une fusée capable d'atteindre la planète rouge, et nous devons également résoudre d'innombrables problèmes qui surgiront au cours de ce voyage de sept mois.
--- p.10
Bien que nous ayons mentionné dans l'introduction de ce chapitre que les newtypes constituent un modèle spécifique à Rust, à proprement parler, rien ne restreint l'application de ce même concept à d'autres langages de programmation.
À ma connaissance, le terme « spécifique à Rust » signifie simplement que le modèle a vu le jour au sein de la communauté Rust.
--- p.152
Lorsqu'on lui a demandé comment il avait créé la statue de David, Michel-Ange a répondu : « J'ai simplement sculpté tout ce qui ne ressemblait pas à David. »
Il en va de même pour la conception des bibliothèques.
Nous devons éliminer les abstractions inutiles jusqu'à ce qu'il ne reste que la solution la plus simple et la plus élégante au problème que nous essayons de résoudre.
--- p.160
En fin de compte, la définition d'un anti-modèle se résume à une question d'opinion et de préférence.
Cependant, dans certains cas, une pratique peut être objectivement mauvaise, par exemple si elle est dangereuse, inefficace ou difficile à maintenir.
Ces cas résultent souvent d'une combinaison de facteurs, notamment une conception médiocre, la volonté de maintenir la rétrocompatibilité et des changements constants dans la conception des logiciels acceptables.
Il y a deux raisons pour lesquelles nous ne listons pas les modèles :
Les modèles ne sont pas de simples gabarits ou du code standard, et copier-coller des modèles ne vous permet de réaliser que 10 % (ou moins) du code complet.
Ce livre s'adresse aux lecteurs qui ont soif de connaissances et de développement personnel.
--- p.9
Les caractéristiques uniques du langage Rust exigent une réflexion plus approfondie lors de la conception d'API et de l'écriture de code de haute qualité.
Il vous faut notamment réfléchir davantage à la manière de gérer la mémoire et la durée de vie des objets, de transmettre des valeurs entre les contextes, d'éviter les conditions de concurrence et de veiller à ce que votre API soit conviviale.
Rust regorge également de nouvelles opportunités pour créer et découvrir de nouveaux modèles, et il continuera sans aucun doute à évoluer même après la publication de ce livre.
Pour aller sur Mars, nous devons construire une fusée capable d'atteindre la planète rouge, et nous devons également résoudre d'innombrables problèmes qui surgiront au cours de ce voyage de sept mois.
--- p.10
Bien que nous ayons mentionné dans l'introduction de ce chapitre que les newtypes constituent un modèle spécifique à Rust, à proprement parler, rien ne restreint l'application de ce même concept à d'autres langages de programmation.
À ma connaissance, le terme « spécifique à Rust » signifie simplement que le modèle a vu le jour au sein de la communauté Rust.
--- p.152
Lorsqu'on lui a demandé comment il avait créé la statue de David, Michel-Ange a répondu : « J'ai simplement sculpté tout ce qui ne ressemblait pas à David. »
Il en va de même pour la conception des bibliothèques.
Nous devons éliminer les abstractions inutiles jusqu'à ce qu'il ne reste que la solution la plus simple et la plus élégante au problème que nous essayons de résoudre.
--- p.160
En fin de compte, la définition d'un anti-modèle se résume à une question d'opinion et de préférence.
Cependant, dans certains cas, une pratique peut être objectivement mauvaise, par exemple si elle est dangereuse, inefficace ou difficile à maintenir.
Ces cas résultent souvent d'une combinaison de facteurs, notamment une conception médiocre, la volonté de maintenir la rétrocompatibilité et des changements constants dans la conception des logiciels acceptables.
--- p.250
Avis de l'éditeur
Une plongée en profondeur dans Rust.
S'intéresser au cœur pratique de Rust, et non à sa théorie.
Pour exploiter pleinement la puissance de Rust, dont l'accès est complexe, il est essentiel d'aller au-delà de la simple maîtrise de la grammaire et de comprendre et d'utiliser les modèles de conception et les expressions idiomatiques uniques du langage.
Si vous avez commencé à utiliser Rust dans des projets concrets, vous entrez dans une toute nouvelle dimension d'exploration.
Comment appliquer les patrons de conception standards dans les applications Rust ? Où et pourquoi utiliser IntoIterator ? Pourquoi les développeurs Rust apprécient-ils le type PhantomData ? Ce livre répond à ces questions et à bien d’autres.
Rust Clean Code présente les bonnes pratiques de code et les modèles de conception propres à Rust pour vous aider à tirer pleinement parti de la conception unique de ce langage. Il aborde des sujets tels que la métaprogrammation, l'implémentation de bibliothèques personnalisées et la création d'interfaces fluides, le tout avec des explications claires et des exemples de code réutilisables.
Dans ce cours, vous comprendrez le fonctionnement interne de Rust et apprendrez à écrire du code Rust efficace, facile à maintenir et à faire évoluer en permanence.
■ Créer une API agréable à utiliser
■ Comment appliquer des modèles de conception classiques tels que le modèle constructeur
■ Modèles de programmation fonctionnelle
■ Anti-motifs de rouille
S'intéresser au cœur pratique de Rust, et non à sa théorie.
Pour exploiter pleinement la puissance de Rust, dont l'accès est complexe, il est essentiel d'aller au-delà de la simple maîtrise de la grammaire et de comprendre et d'utiliser les modèles de conception et les expressions idiomatiques uniques du langage.
Si vous avez commencé à utiliser Rust dans des projets concrets, vous entrez dans une toute nouvelle dimension d'exploration.
Comment appliquer les patrons de conception standards dans les applications Rust ? Où et pourquoi utiliser IntoIterator ? Pourquoi les développeurs Rust apprécient-ils le type PhantomData ? Ce livre répond à ces questions et à bien d’autres.
Rust Clean Code présente les bonnes pratiques de code et les modèles de conception propres à Rust pour vous aider à tirer pleinement parti de la conception unique de ce langage. Il aborde des sujets tels que la métaprogrammation, l'implémentation de bibliothèques personnalisées et la création d'interfaces fluides, le tout avec des explications claires et des exemples de code réutilisables.
Dans ce cours, vous comprendrez le fonctionnement interne de Rust et apprendrez à écrire du code Rust efficace, facile à maintenir et à faire évoluer en permanence.
■ Créer une API agréable à utiliser
■ Comment appliquer des modèles de conception classiques tels que le modèle constructeur
■ Modèles de programmation fonctionnelle
■ Anti-motifs de rouille
SPÉCIFICATIONS DES PRODUITS
- Date d'émission : 4 septembre 2025
- Nombre de pages, poids, dimensions : 300 pages | 188 × 245 × 15 mm
- ISBN13 : 9791194587323
Vous aimerez peut-être aussi
카테고리
Langue coréenne
Langue coréenne