Académique Documents
Professionnel Documents
Culture Documents
Conventions de codage
Modifier la page Dernière modification : 15 juin 2021
Les conventions de codage connues et faciles à suivre sont vitales pour tout langage de
programmation. Ici, nous fournissons des directives sur le style de code et l'organisation du code pour
les projets qui utilisent Kotlin.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 1/29
17/06/2021 Coding conventions | Kotlin
3. Activer Le fichier n'est pas formaté conformément à l' inspection des paramètres du projet . Des
inspections supplémentaires qui vérifient d'autres problèmes décrits dans le guide de style (comme
les conventions de dénomination) sont activées par défaut.
Sur JVM : dans les projets où Kotlin est utilisé avec Java, les fichiers source de Kotlin doivent
résider dans la même racine source que les fichiers source Java et suivre la même structure
de répertoire : chaque fichier doit être stocké dans le répertoire correspondant à chaque
instruction de package.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 2/29
17/06/2021 Coding conventions | Kotlin
Le nom du fichier doit décrire ce que fait le code dans le fichier. Par conséquent, vous devez éviter
d'utiliser des mots dénués de sens comme Util dans les noms de fichiers.
En particulier, lors de la définition de fonctions d'extension pour une classe qui sont pertinentes pour
tous les clients de cette classe, placez-les dans le même fichier avec la classe elle-même. Lorsque vous
définissez des fonctions d'extension qui n'ont de sens que pour un client spécifique, placez-les à côté
du code de ce client. Évitez de créer des fichiers uniquement pour contenir toutes les extensions d'une
classe.
Disposition de la classe
Le contenu d'une classe doit aller dans l'ordre suivant :
2. Constructeurs secondaires
3. Déclarations de méthode
4. Objet compagnon
Ne triez pas les déclarations de méthode par ordre alphabétique ou par visibilité, et ne séparez pas les
méthodes normales des méthodes d'extension. Au lieu de cela, rassemblez des éléments connexes, de
sorte que quelqu'un qui lit le cours de haut en bas puisse suivre la logique de ce qui se passe.
Choisissez un ordre (soit des trucs de niveau supérieur en premier, soit vice versa) et respectez-le.
Placez les classes imbriquées à côté du code qui utilise ces classes. Si les classes sont destinées à être
utilisées en externe et ne sont pas référencées à l'intérieur de la classe, placez-les à la fin, après l'objet
compagnon.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 3/29
17/06/2021 Coding conventions | Kotlin
Disposition de surcharge
Mettez toujours les surcharges les unes à côté des autres dans une classe.
Règles de nommage
Les règles de nommage des packages et des classes dans Kotlin sont assez simples :
• Les noms de packages sont toujours en minuscules et n'utilisent pas de traits de soulignement (
org.example.project ). L'utilisation de noms à plusieurs mots est généralement déconseillée,
mais si vous avez besoin d'utiliser plusieurs mots, vous pouvez soit les concaténer ensemble, soit
utiliser la casse camel ( org.example.myProject ).
• Les noms de classes et d'objets commencent par une lettre majuscule et utilisent la casse camel :
Noms de fonction
Les noms de fonctions, propriétés et variables locales commencent par une lettre minuscule et utilisent
la casse camel et aucun trait de soulignement :
Exception : les fonctions d'usine utilisées pour créer des instances de classes peuvent avoir le même
nom que le type de retour abstrait :
class MyTestCase {
@Test fun `ensure everything works`() { /*...*/ }
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 5/29
17/06/2021 Coding conventions | Kotlin
Les noms de propriétés de niveau supérieur ou d'objet qui contiennent des objets avec un
comportement ou des données mutables doivent utiliser des noms de cas de chameau :
Les noms de propriétés contenant des références à des objets singleton peuvent utiliser le même style
de dénomination que les object déclarations :
Pour les constantes d'énumération, il est possible d'utiliser des noms séparés par des traits de
soulignement en majuscules ( crier la casse du serpent ↗ ) ( enum class Color { RED, GREEN } )
ou des noms en majuscule en majuscule, selon l'utilisation.
class C {
private val _elementList = mutableListOf<Element>()
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 6/29
17/06/2021 Coding conventions | Kotlin
Le nom d'une méthode est généralement un verbe ou une phrase verbe dire ce que la méthode fait :
close , readPersons . Le nom doit également suggérer si la méthode mute l'objet ou en renvoie un
nouveau. Par exemple, sort trie une collection en place, tandis que sorted renvoie une copie triée
de la collection.
Les noms doivent indiquer clairement quel est le but de l'entité, il est donc préférable d'éviter d'utiliser
des mots dénués de sens ( Manager , Wrapper ) dans les noms.
Lorsque vous utilisez un acronyme dans le cadre d'un nom de déclaration, mettez-le en majuscule s'il se
compose de deux lettres ( IOStream ) ; mettre en majuscule uniquement la première lettre si elle est
plus longue ( XmlFormatter , HttpInputStream ).
Mise en page
Échancrure
Utilisez quatre espaces pour l'indentation. N'utilisez pas d'onglets.
Pour les accolades, placez l'accolade ouvrante à la fin de la ligne où commence la construction et
l'accolade fermante sur une ligne distincte alignée horizontalement avec la construction ouvrante.
if (elements != null) {
for (element in elements) {
// ...
}
}
Dans Kotlin, les points-virgules sont facultatifs et les sauts de ligne sont donc importants. La
conception du langage suppose des accolades de style Java et vous pouvez rencontrer un
comportement surprenant si vous essayez d'utiliser un style de formatage différent.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 7/29
17/06/2021 Coding conventions | Kotlin
Espace horizontal
• Mettez des espaces autour des opérateurs binaires ( a + b ). Exception : ne placez pas d'espaces
autour de l'opérateur "plage jusqu'à" ( 0..i ).
• Placez des espaces entre les mots-clés du flux de contrôle ( if , when , for , et while ) et la
parenthèse ouvrante correspondante.
• Ne placez pas d'espace avant une parenthèse ouvrante dans une déclaration de constructeur
primaire, une déclaration de méthode ou un appel de méthode.
fun bar() {
foo(1)
}
• Ne placez pas d'espaces autour des chevrons utilisés pour spécifier les paramètres de type :
class Map<K, V> { ... }
• Ne mettez pas d'espace avant d' ? utiliser pour marquer un type nullable : String?
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 8/29
17/06/2021 Coding conventions | Kotlin
En règle générale, évitez les alignements horizontaux de quelque nature que ce soit. Renommer un
identifiant en un nom de longueur différente ne devrait pas affecter le formatage de la déclaration ou
de l'un des usages.
Côlon
Mettez un espace avant : dans les cas suivants :
Ne mettez pas d'espace avant : lorsqu'il sépare une déclaration et son type.
En-têtes de classe
Les classes avec quelques paramètres de constructeur primaire peuvent être écrites sur une seule ligne :
Les classes avec des en-têtes plus longs doivent être formatées de sorte que chaque paramètre de
constructeur principal se trouve sur une ligne distincte avec une indentation. De plus, la parenthèse
fermante doit être sur une nouvelle ligne. Si vous utilisez l'héritage, l'appel du constructeur de la
superclasse ou la liste des interfaces implémentées doit se trouver sur la même ligne que la
parenthèse :
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name) { /*...*/ }
Pour plusieurs interfaces, l'appel du constructeur de superclasse doit être situé en premier, puis chaque
interface doit être située sur une ligne différente :
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name),
KotlinMaker { /*...*/ }
Pour les classes avec une longue liste de supertypes, placez un saut de ligne après les deux points et
alignez tous les noms de supertypes horizontalement :
class MyFavouriteVeryLongClassHolder :
MyLongHolder<MyFavouriteVeryLongClass>(),
SomeOtherInterface,
AndAnotherOne {
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 10/29
17/06/2021 Coding conventions | Kotlin
Pour séparer clairement l'en-tête de classe et le corps lorsque l'en-tête de classe est long, placez une
ligne vide après l'en-tête de classe (comme dans l'exemple ci-dessus), ou placez l'accolade ouvrante sur
une ligne distincte :
class MyFavouriteVeryLongClassHolder :
MyLongHolder<MyFavouriteVeryLongClass>(),
SomeOtherInterface,
AndAnotherOne
{
fun foo() { /*...*/ }
}
Utilisez un retrait régulier (quatre espaces) pour les paramètres du constructeur. Cela garantit que les
propriétés déclarées dans le constructeur principal ont la même indentation que les propriétés
déclarées dans le corps d'une classe.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 11/29
17/06/2021 Coding conventions | Kotlin
operator
data
@Named("Foo")
private val foo: Foo
À moins que vous ne travailliez sur une bibliothèque, omettez les modificateurs redondants (par
exemple, public ).
Annotations
Placez les annotations sur des lignes distinctes avant la déclaration à laquelle elles sont attachées, et
avec la même indentation :
@Target(AnnotationTarget.PROPERTY)
annotation class JsonExclude
Les annotations sans arguments peuvent être placées sur la même ligne :
@JsonExclude @JvmField
var x: String
Une seule annotation sans arguments peut être placée sur la même ligne que la déclaration
correspondante :
Annotations de fichiers
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 12/29
17/06/2021 Coding conventions | Kotlin
Les annotations de fichier sont placées après le commentaire de fichier (le cas échéant), avant l'
package instruction, et sont séparées package par une ligne vide (pour souligner le fait qu'elles
ciblent le fichier et non le package).
package foo.bar
Les fonctions
Si la signature de la fonction ne tient pas sur une seule ligne, utilisez la syntaxe suivante :
fun longMethodName(
argument: ArgumentType = defaultValue,
argument2: AnotherArgumentType,
): ReturnType {
// body
}
Utilisez un retrait régulier (quatre espaces) pour les paramètres de fonction. Cela permet d'assurer la
cohérence avec les paramètres du constructeur.
Préférez utiliser un corps d'expression pour les fonctions dont le corps consiste en une seule
expression.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 13/29
17/06/2021 Coding conventions | Kotlin
Corps d'expression
Si la fonction a un corps d'expression dont la première ligne ne tient pas sur la même ligne que la
déclaration, placez le = signe sur la première ligne et indentez le corps de l'expression de quatre
espaces.
Propriétés
Pour des propriétés en lecture seule très simples, envisagez une mise en forme sur une ligne :
Pour les propriétés plus complexes, placez toujours get et les set mots - clés sur des lignes
séparées :
Pour les propriétés avec un initialiseur, si l'initialiseur est long, ajoutez un saut de ligne après le = signe
et indentez l'initialiseur de quatre espaces :
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 14/29
17/06/2021 Coding conventions | Kotlin
Si la condition d'une instruction if ou when est multiligne, utilisez toujours des accolades autour du
corps de l'instruction. Indenter chaque ligne suivante de la condition de quatre espaces par rapport au
début de l'instruction. Placez les parenthèses fermantes de la condition avec l'accolade ouvrante sur
une ligne distincte :
if (!component.isSyncing &&
!hasAnyKotlinRuntimeInScope(module)
) {
return createKotlinNotConfiguredPanel(module)
}
Mettez les else , catch , finally mots - clés, ainsi que le while mot - clé d'une do-while
boucle, sur la même ligne que l'accolade précédente:
if (condition) {
// body
} else {
// else part
}
try {
// body
} finally {
// cleanup
}
Dans une when instruction, si une branche comporte plus d'une seule ligne, envisagez de la séparer
des blocs de cas adjacents par une ligne vide :
Mettez des branches courtes sur la même ligne que la condition, sans accolades.
when (foo) {
true -> bar() // good
false -> { baz() } // bad
}
Appels de méthode
Dans les longues listes d'arguments, placez un saut de ligne après la parenthèse ouvrante. Indenter les
arguments de quatre espaces. Regroupez plusieurs arguments étroitement liés sur la même ligne.
drawSquare(
x = 10, y = 10,
width = 100, height = 100,
fill = true
)
a a c o o e
?.firstChild!!
.siblings(forward = true)
.dropWhile { it is PsiComment || it is PsiWhiteSpace }
Le premier appel de la chaîne devrait généralement être précédé d'un saut de ligne, mais vous pouvez
l'omettre si le code a plus de sens de cette façon.
Lambda
Dans les expressions lambda, des espaces doivent être utilisés autour des accolades, ainsi qu'autour de
la flèche qui sépare les paramètres du corps. Si un appel prend un seul lambda, passez-le en dehors des
parenthèses dans la mesure du possible.
list.filter { it > 10 }
Si vous attribuez une étiquette à un lambda, ne mettez pas d'espace entre l'étiquette et l'accolade
ouvrante :
fun foo() {
ints.forEach lit@{
// ...
}
}
Lors de la déclaration des noms de paramètres dans un lambda multiligne, placez les noms sur la
première ligne, suivis de la flèche et de la nouvelle ligne :
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 17/29
17/06/2021 Coding conventions | Kotlin
Si la liste des paramètres est trop longue pour tenir sur une ligne, placez la flèche sur une ligne
distincte :
foo {
context: Context,
environment: Env
->
context.configureEnv(environment)
}
Virgules de fin
Une virgule de fin est un symbole de virgule après le dernier élément d'une série d'éléments :
class Person(
val firstName: String,
val lastName: String,
val age: Int, // trailing comma
)
• Cela rend les différences de contrôle de version plus propres, car tout l'accent est mis sur la valeur
modifiée.
• Cela facilite l'ajout et la réorganisation des éléments - il n'est pas nécessaire d'ajouter ou de
supprimer la virgule si vous manipulez des éléments.
• Il simplifie la génération de code, par exemple, pour les initialiseurs d'objets. Le dernier élément
peut également avoir une virgule.
Les virgules de fin sont entièrement facultatives - votre code fonctionnera toujours sans elles. Le guide
de style Kotlin encourage l'utilisation de virgules de fin sur le site de déclaration et le laisse à votre
discrétion pour le site d'appel.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 18/29
17/06/2021 Coding conventions | Kotlin
Pour activer les virgules de fin dans le formateur IntelliJ IDEA, accédez à Paramètres | Éditeur | Style
de code | Kotlin , ouvrez l' onglet Autre et sélectionnez l' option Utiliser la virgule de fin .
Énumérations
Arguments de valeur
Propriétés et paramètres de classe
Paramètres de valeur de fonction
Paramètres avec type optionnel (y compris les setters)
Suffixe d'indexation
Paramètres en lambdas
lors de l'entrée
Littéraux de collection (dans les annotations)
Tapez les arguments
Paramètres de type
Déclarations déstructurantes
/**
* This is a documentation comment
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 19/29
17/06/2021 Coding conventions | Kotlin
* on multiple lines.
*/
Les commentaires courts peuvent être placés sur une seule ligne :
En règle générale, évitez d'utiliser @param et les @return balises. Au lieu de cela, incorporez la
description des paramètres et des valeurs de retour directement dans le commentaire de la
documentation, et ajoutez des liens vers les paramètres partout où ils sont mentionnés. Utilisation
@param et @return uniquement lorsqu'une longue description est nécessaire , ce qui ne rentre pas
dans le flux du texte principal.
/**
* Returns the absolute value of the given number.
* @param number The number to return the absolute value for.
* @return The absolute value.
*/
fun abs(number: Int) { /*...*/ }
// Do this instead:
/**
* Returns the absolute value of the given [number].
*/
fun abs(number: Int) { /*...*/ }
En général, si une certaine construction syntaxique dans Kotlin est facultative et mise en évidence par
l'EDI comme redondante, vous devez l'omettre dans votre code. Ne laissez pas d'éléments syntaxiques
inutiles dans le code juste "pour plus de clarté".
Points-virgules
Omettez les points-virgules dans la mesure du possible.
Modèles de chaîne
N'utilisez pas d'accolades lors de l'insertion d'une variable simple dans un modèle de chaîne. Utilisez
des accolades uniquement pour les expressions plus longues.
Préférez utiliser des données immuables à mutables. Toujours déclarer les variables locales et les
propriétés que val plutôt que var si elles ne sont pas modifiés après l' initialisation.
Utilisez toujours des interfaces de collection immuables ( Collection , List , Set , Map ) pour
déclarer des collections qui ne sont pas mutées. Lorsque vous utilisez des fonctions d'usine pour créer
des instances de collection, utilisez toujours des fonctions qui renvoient des types de collection
immuables lorsque cela est possible :
// Bad: use of mutable collection type for value which will not be mutate
fun validateValue(actualValue: String, allowedValues: HashSet<String>) {
// Bad
fun foo() = foo("a")
fun foo(a: String) { /*...*/ }
// Good
fun foo(a: String = "a") { /*...*/ }
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 22/29
17/06/2021 Coding conventions | Kotlin
Type d'alias
Si vous avez un type fonctionnel ou un type avec des paramètres de type qui est utilisé plusieurs fois
dans une base de code, préférez lui définir un alias de type :
Si vous utilisez un alias de type privé ou interne pour éviter les collisions de noms, préférez celui
import … as … mentionné dans Packages and Imports .
Paramètres lambda
Dans les lambdas courts et non imbriqués, il est recommandé d'utiliser la it convention au lieu de
déclarer le paramètre explicitement. Dans les lambdas imbriqués avec paramètres, déclarez toujours les
paramètres explicitement.
Arguments nommés
Utilisez la syntaxe d'argument nommé lorsqu'une méthode prend plusieurs paramètres du même type
primitif, ou pour des paramètres de Boolean type, à moins que la signification de tous les paramètres
ne soit absolument claire du contexte.
Expressions conditionnelles
Préférez utiliser la forme d'expression de try , if , et when .
return when(x) {
0 -> "zero"
else -> "nonzero"
}
if (x)
return foo()
else
return bar()
when(x) {
0 -> return "zero"
else -> return "nonzero"
}
si contre quand
Préférez utiliser if pour les conditions binaires au lieu de when . Par exemple, utilisez cette syntaxe
avec if :
when (x) {
null -> // ...
else -> // ...
}
Boucles
Préférez utiliser des fonctions d'ordre supérieur ( filter , map etc.) aux boucles. Exception :
forEach (préférez utiliser une for boucle normale à la place, sauf si le récepteur de forEach est
nullable ou forEach est utilisé dans le cadre d'une chaîne d'appel plus longue).
Lorsque vous choisissez entre une expression complexe utilisant plusieurs fonctions d'ordre supérieur
et une boucle, comprenez le coût des opérations effectuées dans chaque cas et gardez à l'esprit les
considérations de performances.
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 25/29
17/06/2021 Coding conventions | Kotlin
Cordes
Préférez les modèles de chaînes à la concaténation de chaînes.
Prefer multiline strings to embedding \n escape sequences into regular string literals.
To maintain indentation in multiline strings, use trimIndent when the resulting string does not
require any internal indentation, or trimMargin when internal indentation is required:
println("""
Not
trimmed
text
"""
)
println("""
Trimmed
text
""".trimIndent()
)
println()
println(a)
Functions vs properties
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 26/29
17/06/2021 Coding conventions | Kotlin
In some cases functions with no arguments might be interchangeable with read-only properties.
Although the semantics are similar, there are some stylistic conventions on when to prefer one to
another.
• returns the same result over invocations if the object state hasn't changed
Extension functions
Utilisez généreusement les fonctions d'extension. Chaque fois que vous avez une fonction qui
fonctionne principalement sur un objet, envisagez d'en faire une fonction d'extension acceptant cet
objet comme récepteur. Pour minimiser la pollution de l'API, restreignez la visibilité des fonctions
d'extension autant que cela a du sens. Si nécessaire, utilisez des fonctions d'extension locales, des
fonctions d'extension de membre ou des fonctions d'extension de niveau supérieur avec une visibilité
privée.
Fonctions infixes
Déclarez une fonction comme infix uniquement lorsqu'elle fonctionne sur deux objets qui jouent un
rôle similaire. Bons exemples : and , to , zip . Mauvais exemple : add .
Ne déclarez pas une méthode comme infix si elle mute l'objet récepteur.
Fonctions d'usine
Si vous déclarez une fonction d'usine pour une classe, évitez de lui donner le même nom que la classe
elle-même. Préférez utiliser un nom distinct pour indiquer clairement pourquoi le comportement de la
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 27/29
17/06/2021 Coding conventions | Kotlin
fonction d'usine est spécial. Seulement s'il n'y a pas vraiment de sémantique spéciale, vous pouvez
utiliser le même nom que la classe.
Si vous avez un objet avec plusieurs constructeurs surchargés qui n'appellent pas différents
constructeurs de superclasse et ne peuvent pas être réduits à un seul constructeur avec des valeurs
d'argument par défaut, préférez remplacer les constructeurs surchargés par des fonctions d'usine.
Types de plate-forme
Une fonction/méthode publique renvoyant une expression d'un type de plate-forme doit déclarer
explicitement son type Kotlin :
Toute propriété (au niveau du package ou au niveau de la classe) initialisée avec une expression d'un
type de plate-forme doit déclarer explicitement son type Kotlin :
class Person {
val name: String = MyJavaApi.getProperty("name")
}
Une valeur locale initialisée avec une expression d'un type de plate-forme peut avoir ou non une
déclaration de type :
fun main() {
val name = MyJavaApi.getProperty("name")
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 28/29
17/06/2021 Coding conventions | Kotlin
println(name)
}
• Spécifiez toujours explicitement la visibilité des membres (pour éviter d'exposer accidentellement
des déclarations en tant qu'API publique)
• Spécifiez toujours explicitement les types de retour de fonction et les types de propriété (pour éviter
de modifier accidentellement le type de retour lorsque l'implémentation change)
• Fournir des commentaires KDoc pour tous les membres publics, à l'exception des remplacements
qui ne nécessitent aucune nouvelle documentation (pour prendre en charge la génération de
documentation pour la bibliothèque)
https://kotlinlang.org/docs/coding-conventions.html#conditional-statements 29/29