Kotlin Style Guide für Android-Entwickler (Teil I)

Dieser Artikel behandelt nicht nur die ästhetischen Probleme der Formatierung, sondern auch andere Arten von Konventionen und Standards, die Android-Entwickler kennen müssen.





Das Hauptaugenmerk liegt vor allem auf den strengen Regeln, die von Google-Entwicklern überall befolgt werden!





Zuerst dachte ich, dass der Artikel klein sein würde, aber aufgrund der großen Anzahl von Codebeispielen ist er genug gewachsen.





Also habe ich beschlossen, es in zwei Teile zu teilen.





Beide Teile enthalten eine Beschreibung der Codestandards in der Programmiersprache Kotlin.





Was beide Teile abdecken:





  • , , , ..









  • - , , , , .









().





!





, .





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)
}
      
      



  • Vor einem Doppelpunkt ( :



    ), um eine Erweiterung einer Basisklasse oder Schnittstelle oder in einem when



    Ausdruck für generische Typen anzugeben :





// 
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>
      
      



  • Nach einem Doppelpunkt ( :



    ) oder Komma ( ,



    )





// 
val items = listOf(1,2)

// OK
val items = listOf(1, 2)

// 
class Worker :Runnable

// OK
class Worker : Runnable
      
      



  • Auf beiden Seiten des doppelten Schrägstrichs:





// 
var debugging = false//  

// OK
val debugging = false //   
      
      



Fazit

Dieser Artikel hat sich als ziemlich lang herausgestellt. Ich hoffe, Sie haben ihn nützlich gelesen.





Im nächsten Artikel: Benennung, spezielle Konstrukte und Dokumentation.





Nützliche Links:





  • Kotlin Style Guide (auf Englisch)





  • K & R-Stil





  • Buch: Clean Code (Bob Martin)





  • Kurz über das Buch von Bob Martin





Warten Sie auf den nächsten Teil!












All Articles