
Il y a une tonne d'informations sur Internet sur les revues de code:
- comment un examen du code de quelqu'un d'autre affecte la culture de l'entreprise
- ContrÎles de sécurité réglementaires
- manuels abrégés
- longues listes de recommandations
- revue de code d'un point de vue interpersonnel
- pourquoi ai-je besoin d'une révision du code
- méthodes éprouvées
- en savoir plus sur les méthodes éprouvées
- statistiques: dans quelle mesure la révision du code aide à détecter les bogues
- exemples d'erreurs commises lors de la révision du code
Oui, bien sûr, il existe des
livres sur ce sujet. En un mot, cet article dĂ©crit comment la rĂ©vision du code est organisĂ©e par Palantir. Dans les organisations dont la culture n'accepte pas un tel examen par les pairs, il peut ĂȘtre utile de lire d'abord le brillant essai de Karl E. Wiegers, The Code Revision
with a Human Face, puis d'essayer de suivre ce guide.
Ce texte est extrait des
recommandations d'amélioration de la
qualité basées sur le travail avec
Baseline , notre outil de contrÎle qualité du code Java. Il couvre les sujets suivants:
- Pourquoi, quoi et quand essayons-nous de réaliser la révision du code
- Préparation du code pour révision
- Exécution de la revue de code
- Exemples de révision de code
Traduit en Alconost
XKCD Comic 'Code Quality', copié sous licence CC BY-NC 2.5La motivation
Nous sommes engagés dans la révision du code (RC) pour améliorer la qualité du code et voulons ainsi
influencer positivement la culture d'équipe et d'entreprise. Par exemple:
- Les auteurs du code sont motivĂ©s car ils savent que leur Ă©quipe de relecteurs tiendra compte de leur demande de changement: l'auteur essaie de nettoyer la rugositĂ©, de suivre le plan d'action et d'amĂ©liorer globalement l'ensemble du commit. Lorsque des collĂšgues reconnaissent votre professionnalisme dans l'Ă©criture de code - pour de nombreux programmeurs, c'est l'occasion d'ĂȘtre fiers d'eux-mĂȘmes.
- Le partage des connaissances aide l'équipe de développement de plusieurs maniÚres:
- Dans le cadre du RK, il est clairement indiqué quelle partie de la fonctionnalité a été ajoutée / modifiée / supprimée afin qu'à l'avenir, les membres de l'équipe puissent compter sur le travail déjà effectué.
- L'auteur du code peut utiliser une technique ou un algorithme sur lequel les examinateurs eux-mĂȘmes apprendront quelque chose. Dans l'ensemble, une rĂ©vision du code aide Ă
élever la barre de la qualité dans toute l'organisation .
- Les examinateurs peuvent connaĂźtre les techniques de programmation ou la base de code elle-mĂȘme qui permettront d'amĂ©liorer ou de consolider les modifications apportĂ©es; par exemple, quelqu'un peut en mĂȘme temps dĂ©velopper ou modifier exactement la mĂȘme opportunitĂ©.
- Un contact et une communication positifs renforcent les liens sociaux entre les membres de l'équipe.
- En raison de la cohĂ©rence de la base de code, le code lui-mĂȘme est beaucoup plus facile Ă lire et Ă comprendre. Il est plus facile de prĂ©venir les bogues et de promouvoir la collaboration entre les programmeurs installĂ©s et nomades.
- Il est difficile pour l'auteur du code de juger de la lisibilité de sa propre création, et pour le réviseur, c'est juste facile, car il ne voit pas dans quel contexte se situe ce code. Le code lisible par l'homme est plus facile à réutiliser, il contient moins de bogues et est plus durable.
- Les erreurs alĂ©atoires (par exemple les fautes de frappe), ainsi que les erreurs structurelles (par exemple le code non exĂ©cutable, les erreurs de logique ou d'algorithmes, les problĂšmes de performances et d'architecture) sont souvent beaucoup plus faciles Ă dĂ©tecter par un critique pointilleux qui regarde le code de cĂŽtĂ©. Selon la recherche, mĂȘme une revue de code courte et non officielle affecte de maniĂšre significative la qualitĂ© du code et l'occurrence de bogues .
- Les exigences de conformitĂ© et les cadres rĂ©glementaires nĂ©cessitent souvent des examens obligatoires. Un examen du code est un excellent moyen d'Ă©viter les problĂšmes de sĂ©curitĂ© courants. Si les exigences de sĂ©curitĂ© dans cet environnement ou par rapport Ă cette opportunitĂ© sont augmentĂ©es, alors l'examen sera recommandĂ© (ou mĂȘme demandĂ©) par des satrapes des autoritĂ©s rĂ©glementaires (un bon exemple est le guide OWASP ).
Que chercher
Il n'y a pas de rĂ©ponse claire Ă cette question et chaque Ă©quipe de dĂ©veloppement doit se mettre d'accord sur sa propre approche. Certaines Ă©quipes prĂ©fĂšrent vĂ©rifier les Ă©ventuelles modifications apportĂ©es Ă la branche principale de dĂ©veloppement, tandis que d'autres prennent en compte le «seuil de trivialité», au-delĂ duquel la vĂ©rification est obligatoire. Dans ce cas, vous devez trouver un Ă©quilibre entre l'utilisation efficace du temps du programmeur (Ă la fois l'auteur et le rĂ©viseur de code) et le maintien de la qualitĂ© du code. Dans certains contextes stricts, il est parfois nĂ©cessaire de tout vĂ©rifier, mĂȘme les modifications les plus triviales, dans le code.
Les rĂšgles de rĂ©vision du code sont les mĂȘmes pour tout le monde: mĂȘme si vous ĂȘtes le dĂ©veloppeur le plus expĂ©rimentĂ© de l'Ă©quipe, cela ne signifie pas que votre code ne nĂ©cessite pas de rĂ©vision. MĂȘme si (parfois cela arrive) le code est parfait, la revue ouvre des opportunitĂ©s de mentorat et de coopĂ©ration, et, au moins, aide Ă regarder la base de code sous diffĂ©rents points de vue.
Quand vérifier
Un examen du code devrait avoir lieu aprÚs la réussite des vérifications automatiques (tests, conception, autres étapes de l'intégration continue), mais avant la fusion du nouveau code avec la branche principale du référentiel. Habituellement, nous n'avons pas recours à une vérification formelle de l'ensemble des modifications apportées au code depuis la derniÚre version.
Pour les modifications complexes qui doivent ĂȘtre ajoutĂ©es Ă la branche principale du code en tant qu'unitĂ© unique, mais si Ă©tendues qu'elles ne peuvent pas rĂ©ellement ĂȘtre couvertes en une seule vĂ©rification, essayez une rĂ©vision en plusieurs phases. Nous crĂ©ons la branche principale / grande fonctionnalitĂ© et un certain nombre de branches secondaires (par exemple, fonctionnalitĂ© / grande fonctionnalitĂ©-api, fonctionnalitĂ© / grande fonctionnalitĂ©-test, etc.), chacune d'entre elles encapsulant un sous-ensemble de la fonctionnalitĂ© commune, et chacune de ces branches vĂ©rifiĂ© par rapport Ă la branche principale de fonctionnalitĂ© / grande fonctionnalitĂ©. Une fois que toutes les branches secondaires ont Ă©tĂ© fusionnĂ©es en fonction / grande fonctionnalitĂ©, crĂ©ez une revue de code pour injecter cette derniĂšre dans la branche principale.
Préparation du code pour révision
L'auteur du code est tenu de fournir le code de la revue sous une forme digestible, afin de ne pas prendre de temps supplémentaire aux relecteurs et de ne pas les démotiver:
- PortĂ©e et taille . Les changements doivent porter sur un champ d'application Ă©troit, bien dĂ©fini et autosuffisant, entiĂšrement couvert par l'examen. Par exemple, les modifications peuvent ĂȘtre liĂ©es Ă l'implĂ©mentation de certaines fonctionnalitĂ©s ou corrections de bogues. De brefs changements sont prĂ©fĂ©rables aux longs. Si la revue contient du matĂ©riel qui inclut des modifications dans plus de ~ 5 fichiers, ou nĂ©cessite plus de 1 Ă 2 jours pour l'enregistrement, ou si la revue elle-mĂȘme peut prendre plus de 20 minutes, essayez de diviser le matĂ©riel en plusieurs fragments autonomes et de les vĂ©rifier sĂ©parĂ©ment. Par exemple, un dĂ©veloppeur peut soumettre une modification qui dĂ©finit l'API d'une nouvelle fonctionnalitĂ© en termes d'interfaces et de documentation, puis ajouter une deuxiĂšme modification qui dĂ©crit les implĂ©mentations de ces interfaces.
- Vous devez envoyer uniquement du matériel complet, testé indépendamment (utilisez diff) et testé indépendamment . Pour gagner du temps sur le réviseur, testez les modifications soumises (c'est-à -dire exécutez la suite de tests) et assurez-vous que le code passe tous les assemblages, ainsi que tous les tests et toutes les étapes du contrÎle qualité, à la fois localement et sur des serveurs d'intégration continue, puis sélectionnez uniquement examinateurs .
- La refactorisation des changements ne devrait pas affecter le comportement et vice versa; les changements qui affectent le comportement ne doivent pas impliquer une refactorisation ou un reformatage du code. Il y a plusieurs bonnes raisons Ă cela:
- Les modifications liées au refactoring affectent généralement de nombreuses lignes de code dans de nombreux fichiers - par conséquent, ce code
ne sera
pas vĂ©rifiĂ© avec autant de soin . Des changements de comportement imprĂ©vus peuvent s'infiltrer dans la base de code, et personne ne le remarquera mĂȘme.
- Les changements majeurs associés au refactoring violent les mécanismes de mouvement, de sélection et autres "magie" associés au contrÎle de source. Il est trÚs difficile d'annuler un tel changement de comportement qui a été effectué aprÚs l'achÚvement de la refactorisation qui couvrait l'ensemble du référentiel.
- Le temps de travail coûteux qu'une personne consacre à la révision du code devrait aller vérifier la logique du programme, et non les différends concernant le style, la syntaxe ou la mise en forme du code. Nous préférons résoudre ces problÚmes à l'aide d'outils automatisés, en particulier,
Checkstyle ,
TSLint ,
Baseline ,
Prettier , etc.
Valider les messages
Voici un exemple de message de validation compétent, conçu conformément à la norme largement utilisée:
( 80 ) , , . 72 . , â . , ( ); , rebase, . - : « », « » « ». -, , , git merge git revert. . .
Essayez de décrire les modifications apportées lors de la validation, et comment exactement ces modifications sont effectuées:
> . . . > . jcsv- IntelliJ
Rechercher des réviseurs
GĂ©nĂ©ralement, l'auteur d'une validation recherche un ou deux rĂ©viseurs qui connaissent la base de code. Souvent, Ă ce titre, le chef de projet ou l'ingĂ©nieur principal. Il est conseillĂ© au propriĂ©taire du projet de s'abonner Ă son propre projet afin de recevoir des notifications de nouvelles rĂ©visions de code. Avec la participation de trois rĂ©viseurs ou plus, une rĂ©vision du code s'avĂšre souvent improductive ou contre-productive, car diffĂ©rents rĂ©viseurs peuvent proposer des changements mutuellement contradictoires. Cela peut indiquer un dĂ©saccord fondamental sur la mise en Ćuvre correcte, et de tels problĂšmes ne devraient pas ĂȘtre rĂ©solus lors de la rĂ©vision du code, mais lors d'une rĂ©union prolongĂ©e Ă laquelle toutes les parties intĂ©ressĂ©es participent en personne ou en mode vidĂ©oconfĂ©rence.
Exécution de la revue de code
Un examen de code est un point de synchronisation entre diffĂ©rents membres de l'Ă©quipe, il peut donc potentiellement arrĂȘter le travail. Par consĂ©quent, la rĂ©vision du code doit ĂȘtre opĂ©rationnelle (prendre environ plusieurs heures, pas plusieurs jours), et les membres de l'Ă©quipe et les dirigeants doivent ĂȘtre conscients du temps qu'il faudra pour vĂ©rifier et prioriser le temps qui lui est allouĂ© en consĂ©quence. S'il vous semble que vous n'avez pas le temps de terminer la rĂ©vision Ă temps, informez-en immĂ©diatement l'auteur du commit afin qu'il puisse vous trouver un remplaçant.
La rĂ©vision doit ĂȘtre assez approfondie pour que le rĂ©viseur puisse expliquer le changement Ă un autre dĂ©veloppeur avec suffisamment de dĂ©tails. Nous veillerons donc Ă ce que les dĂ©tails de la base de code soient connus d'au moins deux, et non d'un seul.
En tant que rĂ©viseur, vous devez respecter les normes de qualitĂ© du code et le maintenir Ă un niveau Ă©levĂ©. Une rĂ©vision de code est plus un art qu'une science. Cela ne peut ĂȘtre appris qu'en pratique. Un rĂ©viseur expĂ©rimentĂ© doit d'abord essayer de laisser ses collĂšgues moins expĂ©rimentĂ©s changer et les laisser ĂȘtre les premiers Ă rĂ©viser. Si l'auteur a suivi les rĂšgles ci-dessus (en particulier celles liĂ©es Ă l'auto-test et Ă l'exĂ©cution prĂ©liminaire du code), alors c'est ce que le rĂ©viseur doit faire attention lors de la rĂ©vision:
But
- Le code atteint-il l'objectif fixé par l'auteur? Tout changement doit avoir une raison spécifique (nouvelle fonctionnalité, refactoring, correction de bug, etc.). Le code proposé nous conduit-il vraiment à cet objectif?
- Posez des questions. Les fonctions et les classes doivent ĂȘtre justifiĂ©es. Si leur affectation au rĂ©viseur n'est pas claire, cela signifie peut-ĂȘtre que le code devrait ĂȘtre réécrit ou soutenu par des commentaires ou des tests.
Implémentation
- RĂ©flĂ©chissez Ă la façon dont vous rĂ©soudriez ce problĂšme. Sinon, pourquoi? Votre code gĂšre-t-il davantage de cas (limites)? Peut-ĂȘtre que c'est plus court / plus facile / plus propre / plus rapide / plus sĂ»r, et fonctionnellement pas pire? Peut-ĂȘtre avez-vous remarquĂ© une rĂ©gularitĂ© profonde qui n'est pas couverte par le code existant?
- Voyez-vous la possibilitĂ© de crĂ©er des abstractions utiles? Si le code est partiellement dupliquĂ©, cela signifie souvent qu'un Ă©lĂ©ment plus abstrait ou gĂ©nĂ©ral de la fonction peut en ĂȘtre extrait, qui peut ensuite ĂȘtre rĂ©utilisĂ© dans d'autres contextes.
- Pensez comme un adversaire, cependant, restez gentil. Essayez de «rattraper» les auteurs qui ont coupé des coins ou qui manquent des cas spécifiques en lançant des configurations / données d'entrée problématiques qui cassent leur code.
- Pensez aux bibliothĂšques ou au code de travail prĂȘt Ă l'emploi. Si quelqu'un rĂ©implĂ©mente la fonctionnalitĂ© existante - ce n'est pas seulement parce qu'il ne connaĂźt pas l'existence d'une solution toute faite. Parfois, du code ou des fonctionnalitĂ©s sont intentionnellement rĂ©inventĂ©s - par exemple, pour Ă©viter les dĂ©pendances. Dans ce cas, cela doit ĂȘtre clairement commentĂ© dans le code. Cette fonctionnalitĂ© est-elle dĂ©jĂ fournie dans une bibliothĂšque existante?
- Le changement correspond-il aux modĂšles standard? Dans les bases de code existantes, des rĂ©gularitĂ©s sont souvent tracĂ©es liĂ©es aux conventions de dĂ©nomination, Ă la dĂ©composition de la logique du programme, aux dĂ©finitions des types de donnĂ©es, etc. Il est gĂ©nĂ©ralement souhaitable que toutes les modifications soient mises en Ćuvre conformĂ©ment aux modĂšles existants.
- Des dĂ©pendances qui surviennent lors de la compilation ou lors de l'exĂ©cution (en particulier entre les sous-projets) sont-elles ajoutĂ©es lors d'une modification? Nous recherchons la faible cohĂ©rence du code de nos produits, c'est-Ă -dire que nous essayons de permettre un minimum de dĂ©pendances. Les modifications liĂ©es aux dĂ©pendances et au systĂšme de gĂ©nĂ©ration doivent ĂȘtre vĂ©rifiĂ©es particuliĂšrement attentivement.
Lisibilité et style
- Pensez à la façon dont vous lisez ce code. Pouvez-vous saisir ses concepts assez rapidement? Est-il raisonnablement présenté, est-il facile de garder une trace des noms des variables et des méthodes? Puis-je tracer du code sur plusieurs fichiers ou fonctions? Avez-vous déjà été dérangé par un nom incohérent quelque part?
- Le code est-il conforme aux directives de programmation et de style bien connues? Le code sort-il de l'ensemble du projet par style, conventions de dénomination d'API, etc.? Comme mentionné ci-dessus, nous essayons de résoudre les différends stylistiques à l'aide d'outils automatiques.
- Le code a-t-il des listes de tùches (TODO)? Les listes de tùches s'accumulent simplement dans le code et finissent par se transformer en ballast. Attribuez à l'auteur de soumettre un ticket à GitHub Issues ou JIRA et associez un numéro de tùche à TODO. Il ne devrait pas y avoir de code commenté dans la modification proposée.
Support d'utilisation
- Lisez les tests. S'il n'y a pas de tests dans le code, mais qu'ils devraient ĂȘtre lĂ , demandez Ă l'auteur d'en Ă©crire quelques-uns. Les fonctionnalitĂ©s vraiment non testĂ©es sont rares, et les implĂ©mentations de fonctionnalitĂ©s non testĂ©es - malheureusement, souvent. VĂ©rifiez les tests eux-mĂȘmes: couvrent-ils des cas intĂ©ressants? Est-il pratique de les lire? La couverture globale du test diminue-t-elle aprĂšs ce test? RĂ©flĂ©chissez Ă la façon dont ce code pourrait Ă©chouer. Les normes de conception de test et le code de base sont souvent diffĂ©rents, mais les normes de test sont Ă©galement importantes.
- L'examen de ce fragment présente-t-il un risque de rupture du code de test, du code d'effraction ou des tests d'intégration? Souvent, un tel examen n'est pas effectué avant la validation / fusion, mais si de tels cas sont négligés, tout le monde en souffrira. Faites attention aux choses suivantes: suppression des utilitaires ou modes de test, modification de la configuration, modifications de la disposition / structure de l'artefact.
- Ce changement viole-t-il la compatibilitĂ© descendante? Dans l'affirmative, est-il possible d'apporter cette modification Ă la version Ă ce stade, ou doit-elle ĂȘtre reportĂ©e Ă une version ultĂ©rieure? Les violations peuvent inclure des modifications de la base de donnĂ©es ou de son schĂ©ma, des modifications des API publiques, des modifications du flux de tĂąches au niveau de l'utilisateur, etc.
- Ce code nĂ©cessite-t-il des tests d'intĂ©gration? Parfois, le code ne peut pas ĂȘtre correctement vĂ©rifiĂ© en utilisant uniquement des tests unitaires, surtout s'il interagit avec des systĂšmes ou une configuration externes.
- Laissez des commentaires sur la documentation de ce code, des commentaires et des messages de validation. De nombreux commentaires obstruent le code et signifient que les messages de validation déroutent ceux qui doivent ensuite travailler avec le code. Ce n'est pas toujours le cas, mais des commentaires de qualité et des messages de validation au fil du temps vous seront certainement utiles. (N'oubliez pas que vous avez vu un commentaire ou un message de validation magnifique ou tout simplement horrible.)
- La documentation externe a-t-elle Ă©tĂ© mise Ă jour? Si le LISEZMOI, le CHANGELOG ou toute autre documentation est conservĂ© pour votre projet, est-il mis Ă jour pour reflĂ©ter les modifications apportĂ©es? Une documentation obsolĂšte peut ĂȘtre plus nocive que nulle, et il sera plus coĂ»teux de corriger des erreurs Ă l'avenir que d'apporter des modifications maintenant.
N'oubliez pas de louer le code concis / lisible / efficace / beau. Au contraire, rejeter ou rejeter un code proposé pour révision n'est pas impoli. Si le changement est excessif ou insignifiant - rejetez-le en expliquant la raison. Si le changement vous semble inacceptable en raison d'une ou plusieurs erreurs fatales - rejetez-le, encore une fois, avec raison. Parfois, le meilleur résultat d'une révision de code est de dire «faisons-le complÚtement différemment» ou «ne le faisons pas du tout».
RespectĂ© par les pairs. Bien que la position de l'adversaire soit saine, vous ne vous ĂȘtes pas rendu compte de cette opportunitĂ© et vous ne pouvez pas tout dĂ©cider pour lui. Si vous ne pouvez pas obtenir une opinion Ă©valuĂ©e par les pairs sur le code, organisez une consultation en temps rĂ©el et Ă©coutez l'opinion d'une troisiĂšme personne.
La sécurité
Assurez-vous que tous les points de terminaison API sont correctement autorisés et authentifiés conformément aux rÚgles adoptées dans le reste de la base de code. Recherchez d'autres failles courantes, par exemple: configuration faible, entrées d'utilisateurs malveillants, entrées de journal manquantes, etc. En cas de doute, montrez le code évalué par les pairs à un professionnel de la sécurité.
Commentaires: concis, poli, incitatif
L'examen doit ĂȘtre concis, soutenu dans un style neutre. Critiquez le code, pas l'auteur. Si quelque chose n'est pas clair - demandez des Ă©claircissements et ne prĂ©sumez pas que le tout rĂ©side dans l'ignorance de l'auteur. Ăvitez les pronoms possessifs, en particulier dans les jugements de valeur: «
mon code fonctionnait avant
vos changements», «il y a un bug dans
votre méthode», etc. Ne coupez pas l'épaule: «ça
ne marchera
pas du tout », «le résultat est
toujours incorrect».
Essayez de faire la distinction entre les recommandations (par exemple, «Recommandation: extraire la méthode, cela rendra le code plus clair»), les modifications nécessaires (par exemple, «Ajouter un
remplacement »), et les opinions qui nécessitent une clarification ou une discussion (par exemple, «ce comportement est-il vrai? ? Si oui, veuillez ajouter un commentaire expliquant la logique. ») Essayez de mettre des liens ou des pointeurs vers une description détaillée du problÚme.
Lorsque vous avez terminé la révision du code, indiquez dans quelle mesure la réaction à vos commentaires que vous attendez de l'auteur est détaillée, souhaitez-vous répéter la révision une fois les modifications apportées, par exemple: «Vous pouvez télécharger le code en toute sécurité dans la branche principale aprÚs ces corrections mineures» ou «Veuillez noter mes commentaires et faites-moi savoir quand je pourrai revoir le code. »
Examiner la réponse
La rĂ©vision du code, en particulier, vise Ă amĂ©liorer la demande de modifications proposĂ©e par l'auteur; par consĂ©quent, ne prenez pas l'hostilitĂ© des recommandations de l'examinateur, prenez-les au sĂ©rieux, mĂȘme si vous n'ĂȘtes pas d'accord avec elles. RĂ©pondez Ă tout commentaire, mĂȘme Ă l'habituel «ACK» (approuvĂ©) ou «terminé» (terminĂ©). Expliquez pourquoi vous avez pris telle ou telle dĂ©cision, pourquoi vous avez certaines fonctions dans votre code, etc. Si vous ne parvenez pas Ă un avis commun avec le rĂ©viseur, organisez une consultation en temps rĂ©el et Ă©coutez l'avis d'un tiers spĂ©cialiste.
Les corrections doivent ĂȘtre corrigĂ©es dans la mĂȘme branche, mais dans un commit sĂ©parĂ©. Si vous respectez les validations au stade de la rĂ©vision, il sera plus difficile pour le rĂ©viseur de suivre les modifications.
La politique de fusion de code est différente pour différentes équipes. Dans certaines entreprises, la fusion de code n'est approuvée que par le propriétaire du projet; dans d'autres, un participant peut le faire aprÚs que son code a été examiné et approuvé.
Examen du code tĂȘte-Ă -tĂȘte
En rĂšgle gĂ©nĂ©rale, les outils de type diff asynchrones, tels que Reviewable, Gerrit ou GitHub, sont parfaits pour les rĂ©visions de code. Si nous parlons d'un examen complexe ou d'un examen, dont les participants diffĂšrent considĂ©rablement en termes d'expĂ©rience ou de professionnalisme, il peut ĂȘtre plus efficace d'effectuer un examen personnellement - soit assis ensemble devant un moniteur ou un projecteur, ou Ă distance, via des outils de vidĂ©oconfĂ©rence ou de partage d'Ă©cran.
Des exemples
Dans les exemples suivants, les commentaires des réviseurs dans les listes sont saisis à l'aide de
Dénomination incohérente
class MyClass { private int countTotalPageVisits;
Signatures de méthode incohérentes
interface MyInterface { public Optional<String> extractString(String s);
Utilisation de la bibliothĂšque
//R: MapJoiner Guava String joinAndConcatenate(Map<String, String> map, String keyValueSeparator, String keySeparator);
Préférences personnelles
int dayCount;
Bugs
//R: numIterations+1 â ? // â numIterations? for (int i = 0; i <= numIterations; ++i) { ... }
Considérations architecturales
otherService.call();
à propos du traducteurL'article a été traduit par Alconost.
Alconost
localise des jeux , des
applications et des sites dans 70 langues. Traducteurs en langue maternelle, tests linguistiques, plateforme cloud avec API, localisation continue, chefs de projet 24/7, tout format de ressources de chaĂźne.
Nous réalisons également
des vidéos de publicité et de formation - pour les sites qui vendent, présentent des images, de la publicité, des formations, des teasers, des explicateurs, des bandes-annonces pour Google Play et l'App Store.
Plus de détails