Cet article est un synopsis du livre Clean Code de Robert Martin et ma comprĂ©hension de la façon dont le code propre devrait ĂȘtre. Il n'y a aucune section sur les tests, TDD, quelle architecture devrait ĂȘtre, etc. Ici, tout est Ă peu prĂšs ce que devrait ĂȘtre le Clean Code.

Oui, peut-ĂȘtre que le sujet de Clean Code est dĂ©jĂ galvaudĂ©, mais nĂ©anmoins, tout le monde ne le connaĂźt pas et, de plus, je n'ai pas rencontrĂ© d'analogues du contenu qui est contenu dans mon article.
Général
Il n'y a pas de véritable voie et solution. Il y en a un qui convient le mieux à une tùche spécifique.
Lors de la résolution d'un problÚme, essayez de reproduire absolument tous les cas susceptibles d'affecter cette tùche et implémentez la tùche en tenant compte de tous les cas.
Aussi, lors de la résolution du problÚme, essayez de partir du contraire. Comprenez quel type de résultats vous souhaitez obtenir à la fin et faites sur cette base l'algorithme par lequel la tùche sera effectuée.
Avant d'envoyer une tĂąche Ă libĂ©rer, vĂ©rifiez si elle fonctionne correctement. Y a-t-il des erreurs. Cela s'applique mĂȘme aux commits envoyĂ©s Ă votre succursale. Le scĂ©nario le plus idĂ©al est celui dans lequel personne n'a pu trouver d'erreurs dans la fonctionnalitĂ© que vous avez dĂ©veloppĂ©e.
Réfléchissez toujours à la façon dont vous pouvez rendre votre code plus simple, plus propre et plus lisible.
- Quels cas peut avoir une tĂąche?
- Ai-je tout pris en compte?
- Qu'est-ce qui pourrait mal tourner?
- Que peut-on combiner?
- Existe-t-il des fonctionnalités similaires?
- Qu'est-ce qui est superflu ici?
- Comment rendre cela plus facile?
- Comment le rendre plus lisible?
- Comment le rendre plus clair?
Code propre
Comment écrire du code propre et bon? C'est comme écrire un livre. D'abord, vous faites un brouillon, puis vous le peignez à l'état dans lequel vous seriez heureux de le lire. N'oubliez pas que votre code doit raconter une histoire pour que le lecteur puisse la comprendre.
Une entité est comprise - une interface, une classe, une méthode, une variable, un objet, etc.
- Le code propre est simple, expressif et axé sur une tùche spécifique.
- Le code propre est facile Ă lire, comme la prose. Si ce n'est pas le cas, cela vaut la peine d'ĂȘtre refactorisĂ©.
- Le code propre est facile Ă modifier. Il ne doit pas ĂȘtre liĂ© de maniĂšre rigide Ă un tas d'entitĂ©s. Toute entitĂ© peut ĂȘtre facilement modifiĂ©e.
- Le code propre passe beaucoup mieux par un examen. Si l'examen s'accompagne de nombreux commentaires, il n'est pas propre et doit ĂȘtre refactorisĂ©.
- Le code propre a toujours l'air d'avoir été travaillé pendant trÚs longtemps. Quelle que soit la façon dont vous cherchez à l'améliorer, vous arriverez toujours à la conclusion que ce code est le meilleur. En conséquence, un code propre est pensé dans les moindres détails.
- RÚgle du scoutisme: laissez la place de stationnement plus propre qu'elle ne l'était avant vous. Cela passe facilement à la programmation. Voir le code sale? Rendez-le plus propre pendant que vous résolvez votre problÚme. Vous ne devriez pas vous laisser emporter par cela, et si le code sale est trÚs sale, vous devez allouer une tùche et un temps distincts pour le nettoyer.
- N'ayez pas peur de faire des changements. Si vous voulez les faire, vous avez des raisons Ă cela, ce qui signifie que vous rendrez le code meilleur et plus propre. De plus, les tests montreront s'il y a des erreurs dans votre code (Ă condition qu'elles existent).
- Toute entitĂ© devrait ĂȘtre responsable d'une seule fonction et uniquement de celle-ci. Et elle doit bien le faire. ResponsabilitĂ© unique.
- Si une entitĂ© est immĂ©diatement responsable de deux actions ou plus, sa fonctionnalitĂ© doit ĂȘtre sĂ©parĂ©e.
- Le code doit ĂȘtre lu de haut en bas.
- Dans une architecture bonne et compétente, faire des changements sans coûts et efforts importants.
- Supprimer le code mort. Un code mort est un code qui ne sera appelé sous aucune condition ou un code qui n'est utilisé nulle part.
Noms et divisions
- Utilisez des noms clairs et faciles à prononcer pour toutes les entités. Ils devraient décrire pourquoi cette entité existe, ce qu'elle fait et comment elle est utilisée.
- N'ayez pas peur de perdre du temps Ă choisir le meilleur nom et convivial. Vous gagnerez Ă l'avenir en travaillant ou en lisant ce code.
- Si le nom de l'entitĂ© ne correspond pas Ă sa fonctionnalitĂ© ou si le nom ne comprend pas ce que fait l'entitĂ©, alors il doit ĂȘtre renommĂ© en le nom le plus comprĂ©hensible. Si cela est impossible, alors quelque chose ne va pas avec son fonctionnement et il doit ĂȘtre refactorisĂ©.
- L'entitĂ©, qui porte le nom "Et", "Avec" - viole la responsabilitĂ© unique. La fonctionnalitĂ© d'une telle entitĂ© mĂ©rite d'ĂȘtre partagĂ©e. Mais cette rĂšgle est parfois nĂ©gligĂ©e.
- Les textes incomprĂ©hensibles, les lignes doivent ĂȘtre prises en variables et leur donner des noms clairs.
- Les noms de mĂ©thode doivent contenir un verbe qui dĂ©crit ce que fait cette mĂ©thode et le mot-clĂ© avec lequel cette mĂ©thode fonctionne. Si le nom de la mĂ©thode n'a pas de verbe, alors cette entitĂ© ne doit pas ĂȘtre une mĂ©thode ou il faut lui donner le nom correct.
- Les mĂȘmes noms doivent ĂȘtre Ă©vitĂ©s pour deux raisons diffĂ©rentes.
- Si une entitĂ© a un nom similaire Ă celui d'une autre entitĂ©, alors trĂšs probablement, leur fonctionnalitĂ© est trĂšs similaire et doit-elle ĂȘtre combinĂ©e? Sinon, leurs noms doivent ĂȘtre modifiĂ©s afin qu'ils ne soient pas similaires.
- Si vous renommez mentalement une entité lorsque vous lisez le code afin de mieux comprendre sa fonctionnalité, renommez-la en ce nom mental.
- Choisissez un mot pour un concept. Il sera difficile de comprendre la fonctionnalité lorsque vous aurez récupéré, récupéré et obtenu les noms. Mieux vaut aller partout.
- Un nom long et compréhensible vaut mieux qu'un nom court mais incompréhensible.
Les fonctions
- Les fonctions doivent ĂȘtre courtes et compactes.
- Les fonctions doivent ĂȘtre trĂšs courtes et trĂšs compactes.
- Un maximum approximatif de 20 lignes et 150 caractÚres sur une ligne, si cela ne correspond pas, alors vous devez vous séparer.
- Une fonction ne doit effectuer qu'une seule opération.
- Elle doit bien le faire et elle ne doit rien faire d'autre.
- Si une fonction effectue uniquement les actions qui sont au mĂȘme niveau d'abstraction, alors la fonction effectue une opĂ©ration.
- Pour déterminer si une fonction effectue plusieurs opérations, essayez d'en extraire une autre, ce qui ne sera pas une simple reformulation de l'implémentation.
- Toutes les instructions conditionnelles avec des choix longs via switch-case, if-else doivent ĂȘtre divisĂ©es ou combinĂ©es sans duplication, Ă©ventuellement dans des classes avec implĂ©mentations, et transfĂ©rer le choix de l'implĂ©mentation vers la classe de base, l'usine ou quelqu'un d'autre.
- Si, sinon, pendant, etc. doit contenir un appel Ă une fonction. Il sera plus lisible, plus clair et plus facile.
- Le nombre idéal d'arguments d'entrée pour une fonction = 0. S'il y a plus de trois arguments d'entrée, alors il vaut la peine de réfléchir à la meilleure façon de s'en débarrasser, par exemple, créez une classe pour ces arguments.
- Plus il y a d'arguments en entrée, plus la fonction est difficile à comprendre.
- La fonction Ă laquelle l'argument argument est passĂ©, dont dĂ©pend le fonctionnement de la fonction, indique que la fonction effectue plusieurs opĂ©rations. Ces fonctions doivent ĂȘtre divisĂ©es en deux et appelĂ©es un niveau supĂ©rieur.
- Une fonction qui modifie l'argument d'entrée doit donner une référence à l'objet modifié, et pas seulement le modifier sans retourner.
String transform(String text)
- Si la fonction doit changer l'argument d'entrée, laissez-la changer l'état de son objet propriétaire.
- Si l'argument d'entrée de la fonction ne doit pas changer (et est utilisé plus loin dans le code), vous devez copier la valeur de l'argument et travailler avec la copie à l'intérieur de la fonction.
- Au lieu de retourner null, il est préférable d'utiliser un objet vide -
Collection.empty()
ou un objet null - EmptyObject()
. - Essayez toujours d'utiliser des fonctions non statiques. Si ce n'est pas possible, utilisez statique.
- S'il existe un code qui doit se succéder, passez les résultats de la premiÚre fonction à la seconde afin que personne ne modifie la séquence des appels.
- Utilisez le polymorphisme au lieu de if / else ou switch / case ou when.
- Ăvitez les conditions nĂ©gatives.
Commentaires
- N'utilisez pas de commentaires si vous pouvez utiliser une fonction ou une variable Ă la place.
- Ne commentez pas le mauvais code - réécrivez-le. Cela ne vaut pas la peine d'expliquer ce qui se passe dans un mauvais code, il vaut mieux le rendre explicite et compréhensible.
- Les commentaires peuvent ĂȘtre utilisĂ©s pour transmettre des informations, des avertissements sur les consĂ©quences, mais pas pour expliquer le fonctionnement du code.
- Utilisez TODO et FIXME dans les cas oĂč vous devez noter que le code doit ĂȘtre amĂ©liorĂ©, mais maintenant il n'y a plus de ressources pour cela.
- Utilisez
//region REGIONNAME //endregion REGIONNAME
, et si vous l'utilisez, réfléchissez s'il est possible de diviser la région en entités. - Code de document complexe mais propre.
- Ne laissez pas l'ancien code commenté. Vous pouvez le trouver dans l'historique des validations, si nécessaire.
- Les commentaires doivent ĂȘtre concis et clairs. Les commentaires d'information ne devraient pas contenir beaucoup d'informations. Tout doit ĂȘtre bref et prĂ©cis.
- Suivez le codestyle adopté sur le projet.
- Suivez les rÚgles acceptées dans l'équipe.
- Sous réserve de mise en forme et de style de code, le code sera plus facile à lire et meilleur. Ce n'est pas en vain que le livre est remis à l'éditeur avant de le publier.
- Vous devez disposer d'outils automatiques qui formateront le code pour vous.
- Le fichier source doit ressembler Ă un article de journal. Il y a un en-tĂȘte, une brĂšve description sous forme de paramĂštres et un contenu sous forme de fonctions. Si ce n'est pas le cas, vous devez modifier la mise en forme.
- Les entitĂ©s liĂ©es les unes aux autres doivent ĂȘtre proches, par exemple, dans un seul package, afin de faciliter la navigation dans le code.
- Les variables (champs) de classe doivent ĂȘtre en haut de la classe.
- Les variables de mĂ©thode doivent ĂȘtre plus proches de leur lieu d'utilisation.
- Les fonctions doivent ĂȘtre dans l'ordre de l'appel. Si l'un appelle l'autre, la fonction appelante doit ĂȘtre au-dessus de l'appelĂ©. D'un autre cĂŽtĂ©, les fonctions privĂ©es de niveau infĂ©rieur peuvent se trouver au bas du fichier et ne pas interfĂ©rer avec la comprĂ©hension du code de haut niveau. Mais je prĂ©fĂšre la premiĂšre façon.
Objets et structures de données
- Vous devez travailler avec des abstractions afin que l'implĂ©mentation puisse ĂȘtre facilement modifiĂ©e.
- Vous devez travailler avec des abstractions, car le client utilisant la fonctionnalité ne doit pas connaßtre les détails de l'implémentation, il doit savoir quelle implémentation utiliser dans quel cas.
- Vous devez fournir une API avec laquelle vous devez travailler et masquer les dĂ©tails de mise en Ćuvre, la structure. Il sera donc plus facile de travailler avec de telles entitĂ©s et d'ajouter de nouveaux types de comportements, de fonctionnalitĂ©s et d'implĂ©mentations.
- DTO - Objet de transfert de donnĂ©es. Une classe qui contient uniquement des donnĂ©es et aucune fonctionnalitĂ©. Il est nĂ©cessaire pour transfĂ©rer certaines donnĂ©es. Un objet de cette classe doit ĂȘtre immuable.
Cours
- Les cours doivent ĂȘtre compacts.
- Les classes devraient ĂȘtre encore plus compactes.
- Le nom de la classe doit décrire sa responsabilité. De là , vous pouvez calculer la taille de la classe.
- La fonctionnalité de la classe doit correspondre clairement et correspondre au nom de la classe.
- Divisez la connectivité en petites classes. Il ne doit pas y avoir de cohésion rigide et abondante - cela complique le soutien et le développement du projet.
- N'oubliez pas la responsabilité unique. Une entité doit avoir une et une seule raison de changer.
- Observez l'encapsulation. L'encapsulation affaiblie devrait toujours ĂȘtre le dernier recours.
- Habituellement, nous dĂ©clarons les variables et les fonctions auxiliaires privĂ©es, mais parfois elles doivent ĂȘtre dĂ©clarĂ©es protĂ©gĂ©es et pouvoir y accĂ©der depuis le test.
- Si un groupe de fonctions appartient Ă une certaine fonction, ce groupe de fonctions peut et doit ĂȘtre allouĂ© Ă une classe distincte et utiliser son instance.
Gestion des erreurs
- Utilisez des exceptions au lieu de renvoyer des codes d'erreur.
- La gestion des erreurs est une opération. S'il y a un mot clé
try
dans la fonction, alors aprĂšs les blocs catch/finally
, il ne devrait plus y avoir rien d'autre dans la fonction. - Si vous avez une énumération qui répertorie les erreurs, il est préférable de s'en débarrasser et d'utiliser des exceptions à la place.
- Utilisez des exceptions non vĂ©rifiĂ©es pour indiquer explicitement l'endroit oĂč il y a des problĂšmes. Ces erreurs n'ont pas besoin d'ĂȘtre dĂ©tectĂ©es, mais vous devez Ă©crire du code pour que cette erreur n'existe jamais.
- Transmettez suffisamment d'informations et lancez une exception pour que plus tard vos utilisateurs de code puissent comprendre ce qui s'est réellement passé.
- Au lieu d'instructions conditionnelles avec gestion des erreurs, il est préférable de lever des exceptions et de les gérer.
- Ne passez nulle nulle. Essayez d'éviter cela autant que possible.
- La gestion des erreurs est une tĂąche distincte et ne s'applique pas Ă la logique principale du programme.
FrontiĂšres
- Nous utilisons toujours certaines bibliothÚques qui nous donnent le plus souvent des fonctionnalités trop larges, trop petites ou en conflit avec les fonctionnalités attendues, ce qui rend le code plus désordonné dans son utilisation finale. Vous pouvez éviter cela en appliquant simplement des motifs tels que décorateur, adaptateur, façade ou autres.
- Il existe des situations oĂč vous devez travailler avec des fonctionnalitĂ©s en cours de dĂ©veloppement ou qui n'ont pas encore Ă©tĂ© adaptĂ©es pour ĂȘtre utilisĂ©es dans le code de production. Dans ce cas, vous devez imaginer ce que vous attendez de la bibliothĂšque / de cette fonctionnalitĂ© et Ă©crire votre interface ou crĂ©er une entitĂ© avec laquelle vous travaillerez dans votre projet comme vous le souhaitez. Lorsque la bibliothĂšque est terminĂ©e et devient stable, vous l'adaptez Ă vos structures prĂȘtes Ă l'emploi et utilisez des fonctionnalitĂ©s prĂȘtes Ă l'emploi.
Postface
Cet article fournit uniquement des instructions pour Ă©crire un code propre. Bien sĂ»r, ils peuvent ĂȘtre nĂ©gligĂ©s. Vous avez juste besoin de comprendre que chacune de vos dĂ©cisions devrait avoir des arguments en sa faveur.