Cet article couvre non seulement les problèmes de formatage esthétique, mais également d'autres types de conventions et de normes que les développeurs Android doivent connaître.
L'objectif principal est, tout d'abord, les règles rigides suivies par les développeurs Google partout!
Au début, je pensais que l'article serait petit, mais en raison du grand nombre d'exemples de code, il a suffisamment grandi.
J'ai donc décidé de le scinder en deux parties.
Les deux parties contiennent une description des normes de code dans le langage de programmation Kotlin.
Ce que couvrent les deux parties:
, , , ..
- , , , , .
-
().
!
, .
UTF-8 .
, , : + .kt
( enum
) , :
// PhotoAdapter.kt
class PhotoAdapter(): RecyclerView.Adapter<PhotoViewHolder>() {
// ...
}
// Utils.kt
class Utils {}
fun Utils.generateNumbers(start: Int, end: Int, step: Int) {
// ...
}
// Map.kt
fun <T, O> Set<T>.map(func: (T) -> O): List<O> = // ...
fun <T, O> List<T>.map(func: (T) -> O): List<O> = // ...
Kotlin .kt :
, ()
,
package
import
(, , )
:
/*
* Copyright 2021 MyCompany, Inc.
*
*
*/
KDoc :
/**
* Copyright 2021 MyCompany, Inc.
*
*/
// Copyright 2021 MyCompany, Inc.
//
@file
, use-site target package
:
/*
* Copyright 2021 MyCompany, Inc.
*
*/
@file:JvmName("Foo")
package com.example.android
package
import
:
package com.example.android.fragments //
import android.view.LayoutInflater //
import android.view.View
import
, .
:
import androidx.room.* //
Kotlin , , typealias
.
. extension , .
, .
, .
: , ,
, .
ASCII (0x20).
, :
Tab
, (\b, \r, \t, \\
) , Unicode (: \u000a
).
, ASCII, Unicode (∞), Unicode (\u221e
).
, :
// :
val symbol0 = "∞"
// : Unicode
val symbol1 = "\u221e" // ∞
// : ,
val symbol2 = "\u221e"
// : Unicode
return "\ufeff" + content //
!
when
if
( if
else
):
if (str.isEmpty()) return
when (option) {
0 -> return
// …
}
if, for, when
do
while
:
if (str.isEmpty())
return // !
if (str.isEmpty()) {
return // OK
}
c
, , , .
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// ...
}
}
K&R:
try {
val response = fetchDogs("https://api.dog.com/dogs")
} catch (e: Exception) {} //
try {
val response = fetchDogs("https://api.dog.com/dogs")
} catch (e: Exception) {
} // OK
if/else
, :
val value = if (str.isEmpty()) 0 else 1 // OK
val value = if (str.isEmpty()) //
0
else
1
val value = if (str.isEmpty()) { // OK
0
} else {
1
}
4 . ( ).
(;
)
100 .
:
, (: URL)
package
import
, shell
:
infix .
, :
(
.
,.?
)
(
::
)
(,)
(
->
) lambda
, ( 4 ):
fun makeSomething(
val param1: String,
val param2: String,
val param3: Int
) {
}
:
override fun toString(): String {
return "Hello, $name"
}
override fun toString() = "Hello, $name"
, - - :
fun waitMe() = runBlocking {
delay(1000)
}
(=
):
val binding: ListItemBinding =
DataBindingUtil.inflate(inflater, R.layout.list_item, parent, false)
get
set
(4 ):
val items: LiveData<List<Item>>
get() = _items
Read-only :
val javaExtension: String get() = "java"
:
: , ,
. ( backing )
()
( ) ASCII :
, :
if
,for
catch
:
//
for(i in 1..6) {
}
// OK
for (i in 1..6) {
}
,
else
catch
:
//
}else {
}
// OK
} else {
}
:
//
if (items.isEmpty()){
}
// OK
if (items.isEmpty()) {
}
:
//
val four = 2+2
// OK
val four = 2 + 2
// (->)
//
items.map { item->item % 2 == 0 }
// OK
items.map { item -> item % 2 == 0 }
: (
::
), (.
) range (..
)
//
val str = Any :: toString
// OK
val str = Any::toString
//
item . toString()
// OK
item.toString()
//
for (i in 1 .. 6) {
println(i)
}
// OK
for (i in 1..6) {
println(i)
}
Avant un deux-points (
:
) pour indiquer une extension d'une classe ou d'une interface de base, et dans unewhen
expression pour les types génériques:
//
class Worker: Runnable
// OK
class Worker : Runnable
//
fun <T> min(a: T, b: T) where T: Comparable<T>
// OK
fun <T> min(a: T, b: T) where T : Comparable<T>
Après un deux-points (
:
) ou une virgule (,
)
//
val items = listOf(1,2)
// OK
val items = listOf(1, 2)
//
class Worker :Runnable
// OK
class Worker : Runnable
Des deux côtés de la double barre oblique:
//
var debugging = false//
// OK
val debugging = false //
Conclusion
Cet article s'est avéré assez long, j'espère que vous l'avez lu utile.
Dans l'article suivant: dénomination, constructions spéciales et documentation.
Liens utiles:
Guide de style Kotlin (en anglais)
-
Livre: Clean Code (Bob Martin)
En bref sur le livre de Bob Martin
Attendez la prochaine partie!