Bu belge, Google'ın Kotlin programlama dilindeki kaynak kodu için Android kodlama standartlarının eksiksiz tanımı olarak kabul edilir. Bir Kotlin kaynak dosyasının Google Android Stili'nde olduğu ancak ve ancak buradaki kurallara uyduğu takdirde söylenebilir.
Diğer programlama stili kılavuzlarında olduğu gibi, ele alınan konular yalnızca biçimlendirmeyle ilgili estetik sorunları değil, diğer türdeki kuralları veya kodlama standartlarını da kapsar. Ancak bu belgede, öncelikle evrensel olarak uyguladığımız kesin kurallara odaklanılır ve açıkça uygulanamayan (insan veya araç tarafından) tavsiyeler verilmez.
Kaynak dosyalar
Tüm kaynak dosyalar UTF-8 olarak kodlanmalıdır.
Adlandırma
Bir kaynak dosya yalnızca tek bir üst düzey sınıf içeriyorsa dosya adı, büyük/küçük harfe duyarlı adın yanı sıra .kt uzantısını da yansıtmalıdır. Aksi takdirde, bir kaynak dosya birden fazla üst düzey bildirim içeriyorsa dosyanın içeriğini açıklayan bir ad seçin, PascalCase'i uygulayın (dosya adı çoğulsa camelCase kabul edilebilir) ve .kt uzantısını ekleyin.
// MyClass.kt class MyClass { }
// Bar.kt class Bar { } fun Runnable.toBar(): Bar = Bar()
// Map.kt fun <T, O> Set<T>.map(func: (T) -> O): List<O> = emptyList() fun <T, O> List<T>.map(func: (T) -> O): List<O> = emptyList()
// extensions.kt fun MyClass.process() = { /* ... */ } fun MyResult.print() = { /* ... */ }
Özel Karakterler
Boşluk karakterleri
Satır sonlandırıcı dizinin dışında, kaynak dosyanın herhangi bir yerinde görünen tek boşluk karakteri ASCII yatay boşluk karakteridir (0x20). Bu durum şu anlama gelir:
- Dize ve karakter değişmezlerindeki diğer tüm boşluk karakterleri kod dışına alınır.
- Girinti için sekme karakterleri kullanılmaz.
Özel çıkış dizileri
Özel çıkış sırası olan karakterler (\b, \n, \r, \t, \', \", \\ ve \$) için karşılık gelen Unicode (ör. \u000a) çıkışı yerine bu sıra kullanılır.
ASCII olmayan karakterler
Geriye kalan ASCII dışı karakterler için gerçek Unicode karakteri (ör. ∞) veya eşdeğer Unicode çıkışı (ör. \u221e) kullanılır.
Seçim yalnızca kodu okumayı ve anlamayı kolaylaştıran seçeneğe bağlıdır.
Unicode kaçışları, yazdırılabilir karakterler için herhangi bir konumda önerilmez ve dize değişmezleri ile yorumların dışında kesinlikle önerilmez.
| Örnek | Tartışma |
|---|---|
val unitAbbrev = "μs" |
En iyi: Yorum olmasa bile tamamen net. |
val unitAbbrev = "\u03bcs" // μs |
Kötü: Yazdırılabilir bir karakterle kaçış kullanmak için bir neden yoktur. |
val unitAbbrev = "\u03bcs" |
Kötü: Okuyucu, bunun ne olduğunu bilmiyor. |
return "\ufeff" + content |
İyi: Yazdırılamayan karakterler için kaçış karakterleri kullanın ve gerekirse yorum ekleyin. |
Yapı
Bir .kt dosyası sırasıyla şunlardan oluşur:
- Telif hakkı ve/veya lisans başlığı (isteğe bağlı)
- Dosya düzeyinde ek açıklamalar
- Paket ifadesi
- Ekstreleri içe aktarma
- Üst düzey beyanlar
Bu bölümlerin her biri tam olarak bir boş satırla ayrılır.
Telif Hakkı / Lisans
Dosyada telif hakkı veya lisans başlığı varsa çok satırlı bir yorumda en üste yerleştirilmelidir.
/* * Copyright 2017 Google, Inc. * * ... */
KDoc stili veya tek satırlık stil yorum kullanmayın.
/** * Copyright 2017 Google, Inc. * * ... */
// Copyright 2017 Google, Inc. // // ...
Dosya düzeyinde ek açıklamalar
"file" use-site target ile ek açıklamalar, herhangi bir başlık yorumu ile paket bildirimi arasına yerleştirilir.
Paket ifadesi
Paket ifadesi herhangi bir sütun sınırına tabi değildir ve hiçbir zaman satır kaydırması yapılmaz.
Ekstreleri içe aktarma
Sınıflar, işlevler ve özellikler için içe aktarma ifadeleri tek bir listede gruplandırılır ve ASCII'ye göre sıralanır.
Joker karakterli içe aktarmalara (herhangi bir türde) izin verilmez.
Paket ifadesine benzer şekilde, import ifadeleri sütun sınırına tabi değildir ve hiçbir zaman satır kaydırması yapılmaz.
Üst düzey beyanlar
Bir .kt dosyası, üst düzeyde bir veya daha fazla tür, işlev, özellik ya da tür takma adı bildirebilir.
Bir dosyanın içeriği tek bir temaya odaklanmalıdır. Buna örnek olarak tek bir genel tür veya birden fazla alıcı türünde aynı işlemi gerçekleştiren bir dizi uzantı işlevi verilebilir. Alakalı olmayan beyanlar ayrı dosyalara bölünmeli ve tek bir dosyadaki herkese açık beyanlar en aza indirilmelidir.
Bir dosyanın içeriğinin sayısına veya sırasına açık bir kısıtlama uygulanmaz.
Kaynak dosyalar genellikle yukarıdan aşağıya doğru okunur. Bu nedenle, genel olarak sıralama, yukarıdaki bildirimlerin aşağıdakilerin anlaşılmasını sağlayacak şekilde olmalıdır. Farklı dosyalar, içeriklerini farklı şekilde sıralayabilir. Benzer şekilde, bir dosya 100 özellik, başka bir dosya 10 işlev ve bir diğeri de tek bir sınıf içerebilir.
Önemli olan, her dosyanın biraz mantıksal sıra kullanmasıdır. Bu sıra, sorulduğunda dosyanın bakımını yapan kişi tarafından açıklanabilir. Örneğin, yeni işlevler dosyaların sonuna alışkanlık olarak eklenmez. Bu durumda, mantıklı bir sıralama olmayan "eklenme tarihine göre kronolojik" sıralama elde edilir.
Sınıf üyelerini sıralama
Bir sınıftaki üyelerin sırası, üst düzey bildirimlerle aynı kurallara tabidir.
Biçimlendirme
Diş telleri
when dalları ve birden fazla else dalı olmayan ve tek satıra sığan if ifadeleri için küme parantezleri gerekli değildir.
if (string.isEmpty()) return val result = if (string.isEmpty()) DEFAULT_VALUE else string when (value) { 0 -> return // … }
Aksi takdirde, gövde boş olsa veya yalnızca tek bir ifade içerse bile if, for, when dalı, do ve while ifadeleri ve deyimleri için küme parantezleri gereklidir.
if (string.isEmpty()) return // WRONG! if (string.isEmpty()) { return // Okay } if (string.isEmpty()) return // WRONG else doLotsOfProcessingOn(string, otherParametersHere) if (string.isEmpty()) { return // Okay } else { doLotsOfProcessingOn(string, otherParametersHere) }
Boş olmayan bloklar
Küme parantezleri, boş olmayan bloklar ve blok benzeri yapılar için Kernighan ve Ritchie stilini ("Mısır parantezleri") kullanır:
- Açma ayracından önce satır sonu yok.
- Açılış küme parantezinden sonra satır sonu.
- Kapatma ayracından önce satır sonu.
- Kapatma parantezinden sonra satır sonu yalnızca bu parantez bir ifadeyi veya bir işlevin, oluşturucunun ya da adlandırılmış sınıfın gövdesini sonlandırıyorsa.
Örneğin, küme parantezinden sonra
elseveya virgül geliyorsa satır sonu olmaz.
return Runnable { while (condition()) { foo() } }
return object : MyClass() { override fun foo() { if (condition()) { try { something() } catch (e: ProblemException) { recover() } } else if (otherCondition()) { somethingElse() } else { lastThing() } } }
Numara sınıflarıyla ilgili birkaç istisna aşağıda verilmiştir.
Boş bloklar
Boş bir blok veya blok benzeri yapı K&R stilinde olmalıdır.
try { doSomething() } catch (e: Exception) {} // WRONG!
try { doSomething() } catch (e: Exception) { } // Okay
İfadeler
İfade olarak kullanılan bir if/else koşullu ifadesi, yalnızca ifadenin tamamı tek bir satıra sığıyorsa küme parantezlerini atlayabilir.
val value = if (string.isEmpty()) 0 else 1 // Okay
val value = if (string.isEmpty()) // WRONG! 0 else 1
val value = if (string.isEmpty()) { // Okay 0 } else { 1 }
Girinti
Yeni bir blok veya blok benzeri yapı her açıldığında girinti dört boşluk artar. Blok sona erdiğinde girinti, önceki girinti düzeyine döner. Girinti düzeyi, blok genelinde hem kod hem de yorumlar için geçerlidir.
Her satıra bir ifade girin.
Her ifadenin ardından satır sonu gelir. Noktalı virgül kullanılmıyor.
Satır kaydırma
Kodun sütun sınırı 100 karakterdir. Aşağıda belirtilenler hariç, bu sınırı aşan tüm satırlar, aşağıda açıklandığı gibi satır kaydırmalı olmalıdır.
İstisnalar:
- Sütun sınırına uymanın mümkün olmadığı satırlar (örneğin, KDoc'taki uzun bir URL)
packageveimporthesap özetleri- Bir yorumdaki, kabuğa kesilip yapıştırılabilecek komut satırları
Nerede mola verilir?
Satır sarmayla ilgili temel kural şudur: Daha yüksek söz dizimi düzeyinde bölmeyi tercih edin. Ayrıca:
- Bir satır, operatör veya infix işlev adında kesildiğinde kesme, operatör veya infix işlev adından sonra gelir.
- Bir satır aşağıdaki "operatör benzeri" sembollerde bölündüğünde, bölme sembolden önce gelir:
- Nokta ayırıcı (
.,?.). - Üye referansının iki nokta üst üste işareti (
::).
- Nokta ayırıcı (
- Bir yöntem veya oluşturucu adı, onu takip eden açık paranteze (
() bağlı kalır. - Virgül (
,), kendisinden önceki jetona bağlı kalır. - Lambda oku (
->), kendisinden önceki bağımsız değişken listesine bağlı kalır.
İşlevler
Bir işlev imzası tek bir satıra sığmadığında her parametre bildirimini kendi satırına ayırın. Bu biçimde tanımlanan parametreler tek bir girinti (+4) kullanmalıdır. Kapatma parantezi ()) ve dönüş türü, ek girinti olmadan kendi satırlarına yerleştirilir.
fun <T> Iterable<T>.joinToString( separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "" ): String { // ... }
İfade işlevleri
Yalnızca tek bir ifade içeren işlevler ifade işlevi olarak gösterilebilir.
override fun toString(): String { return "Hey" }
override fun toString(): String = "Hey"
Özellikler
Bir özellik başlatıcı tek bir satıra sığmadığında eşittir işaretinden (=) sonra satırı bölün ve girinti kullanın.
private val defaultCharset: Charset? = EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(file)
get ve/veya set işlevi bildiren özellikler, her birini normal girintiyle (+4) kendi satırına yerleştirmelidir. İşlevlerle aynı kuralları kullanarak biçimlendirin.
var directory: File? = null set(value) { // … }
val defaultExtension: String get() = "kt"
Boşluk
Dikey
Tek bir boş satır görünür:
- Bir sınıfın ardışık üyeleri arasında: özellikler, oluşturucular, işlevler, iç içe sınıflar vb.
- İstisna: Aralarında başka kod olmayan iki ardışık özellik arasında boş satır olması isteğe bağlıdır. Bu tür boş satırlar, gerektiğinde özelliklerin mantıksal gruplandırmalarını oluşturmak ve varsa özellikleri destekleyen özellikleriyle ilişkilendirmek için kullanılır.
- İstisna: Enum sabitleri arasındaki boş satırlar aşağıda ele alınmıştır.
- Kodun mantıksal alt bölümler halinde düzenlenmesi için ifadeler arasında gerektiği kadar.
- Bir işlevdeki ilk ifadeden önce, bir sınıfın ilk üyesinden önce veya bir sınıfın son üyesinden sonra isteğe bağlı olarak (ne teşvik edilir ne de engellenir).
- Bu belgenin diğer bölümlerinde (ör. Yapı bölümü) belirtildiği şekilde.
Art arda birden fazla boş satıra izin verilir ancak bu durum önerilmez veya hiçbir zaman gerekli değildir.
Yatay
Dil veya diğer stil kuralları tarafından gerekli kılınan yerlerin dışında ve değişmez değerler, yorumlar ve KDoc haricinde, tek bir ASCII boşluğu yalnızca aşağıdaki yerlerde de görünür:
-
if,forveyacatchgibi ayrılmış bir kelimeyi, aynı satırda kendisini takip eden açık parantezden (() ayırma.// WRONG! for(i in 0..1) { }
// Okay for (i in 0..1) { }
elseveyacatchgibi ayrılmış bir kelimeyi, aynı satırda kendisinden önce gelen bir kapatma küme parantezinden (}) ayırmak.// WRONG! }else { }
// Okay } else { }
-
Açık küme parantezinden (
{) önce.// WRONG! if (list.isEmpty()){ }
// Okay if (list.isEmpty()) { }
-
İkili operatörlerin her iki tarafında.
// WRONG! val two = 1+1
Bu durum, aşağıdaki "operatör benzeri" semboller için de geçerlidir:// Okay val two = 1 + 1
- Lambda ifadesindeki ok (
->).// WRONG! ints.map { value->value.toString() }
// Okay ints.map { value -> value.toString() }
-
Üye referansının iki nokta üst üste işareti (
::).// WRONG! val toString = Any :: toString
// Okay val toString = Any::toString
-
Nokta ayırıcı (
.).// WRONG it . toString()
// Okay it.toString()
-
Aralık operatörü (
..).// WRONG for (i in 1 .. 4) { print(i) }
// Okay for (i in 1..4) { print(i) }
- Lambda ifadesindeki ok (
-
Yalnızca bir temel sınıfı veya arayüzleri belirtmek için sınıf bildiriminde ya da
genel kısıtlamalar için
whereifadesinde kullanılıyorsa iki nokta üst üste (:) işaretinden önce.// WRONG! class Foo: Runnable
// Okay class Foo : Runnable
// WRONG fun <T: Comparable> max(a: T, b: T)
// Okay fun <T : Comparable<T>> max(a: T, b: T)
// WRONG fun <T> max(a: T, b: T) where T: Comparable<T>
// Okay fun <T> max(a: T, b: T) where T : Comparable<T> {}
-
Virgülden (
,) veya iki nokta üst üsteden (:) sonra.// WRONG! val oneAndTwo = listOf(1,2)
// Okay val oneAndTwo = listOf(1, 2)
// WRONG! class Foo :Runnable
// Okay class Foo : Runnable
-
Satır sonu yorumunun başında bulunan çift eğik çizginin (
//) her iki tarafında. Burada birden fazla boşluğa izin verilir ancak boşluk kullanmak zorunlu değildir.// WRONG! var debugging = false//disabled by default
// Okay var debugging = false // disabled by default
Bu kural, satırın başında veya sonunda ek boşluk gerektiren ya da yasaklayan bir kural olarak yorumlanmaz. Yalnızca iç boşlukla ilgilidir.
Belirli yapılar
Enum sınıfları
Sabitleri hakkında işlev ve doküman bulunmayan bir enum, isteğe bağlı olarak tek satır halinde biçimlendirilebilir.
enum class Answer { YES, NO, MAYBE }
Bir enum'daki sabitler ayrı satırlara yerleştirildiğinde, bir gövde tanımladıkları durum hariç aralarında boş satır olması gerekmez.
enum class Answer { YES, NO, MAYBE { override fun toString() = """¯\_(ツ)_/¯""" } }
Numaralandırılmış sınıflar sınıf olduğundan, sınıfları biçimlendirme ile ilgili diğer tüm kurallar geçerlidir.
Ek açıklamalar
Üye veya tür açıklamaları, açıklama eklenen yapıdan hemen önce ayrı satırlara yerleştirilir.
@Retention(SOURCE) @Target(FUNCTION, PROPERTY_SETTER, FIELD) annotation class Global
Bağımsız açıklamalar tek bir satıra yerleştirilebilir.
@JvmField @Volatile var disposable: Disposable? = null
Yalnızca bağımsız bir ek açıklama olduğunda, bu ek açıklama tanımlamayla aynı satıra yerleştirilebilir.
@Volatile var disposable: Disposable? = null @Test fun selectAll() { // … }
@[...] söz dizimi yalnızca açık bir use-site hedefiyle ve tek bir satırda bağımsız değişken içermeyen 2 veya daha fazla açıklama birleştirilirken kullanılabilir.
@field:[JvmStatic Volatile] var disposable: Disposable? = null
Örtülü dönüş/özellik türleri
Bir ifade işlevi gövdesi veya özellik başlatıcı bir skaler değerse ya da dönüş türü gövdeden net bir şekilde çıkarılabiliyorsa atlanabilir.
override fun toString(): String = "Hey" // becomes override fun toString() = "Hey"
private val ICON: Icon = IconLoader.getIcon("/icons/kotlin.png") // becomes private val ICON = IconLoader.getIcon("/icons/kotlin.png")
Kitaplık yazarken, herkese açık API'nin bir parçası olan açık tür bildirimini koruyun.
Adlandırma
Tanımlayıcılar yalnızca ASCII harf ve rakamlarını, ayrıca aşağıda belirtilen az sayıda durumda alt çizgileri kullanır. Bu nedenle, her geçerli tanımlayıcı adı \w+ normal ifadesiyle eşleştirilir.
name_, mName, s_name ve kName örneklerinde görülenler gibi özel önekler veya sonekler, destekleyici özellikler dışında kullanılmaz (bkz. Destekleyici özellikler).
Paket Adları
Paket adları tamamen küçük harflerden oluşur ve ardışık kelimeler yalnızca birbirine eklenir (alt çizgi kullanılmaz).
// Okay package com.example.deepspace // WRONG! package com.example.deepSpace // WRONG! package com.example.deep_space
Tür adları
Sınıf adları PascalCase biçiminde yazılır ve genellikle isim veya isim öbeğidir. Örneğin, Character veya ImmutableList. Arayüz adları, isim veya isim öbeği (ör. List) olabileceği gibi bazen sıfat veya sıfat öbeği (ör. Readable) de olabilir.
Test sınıfları, test ettikleri sınıfın adıyla başlayıp Test ile biten bir ad alır. Örneğin, HashTest veya HashIntegrationTest.
İşlev adları
İşlev adları camelCase (değişken adlandırma) biçiminde yazılır ve genellikle fiil veya fiil öbeği olur. Örneğin, sendMessage veya stop.
Adın mantıksal bileşenlerini ayırmak için test işlevi adlarında alt çizgi kullanılmasına izin verilir.
@Test fun pop_emptyStack() { // … }
@Composable ile açıklama eklenmiş ve Unit döndüren işlevler, tür gibi PascalCase ile yazılır ve isim olarak adlandırılır.
@Composable fun NameTag(name: String) { // … }
İşlev adları boşluk içermemelidir. Bu durum, her platformda desteklenmez (özellikle Android'de tam olarak desteklenmez).
// WRONG! fun `test every possible case`() {} // OK fun testEveryPossibleCase() {}
Sabit adları
Sabit adlarında UPPER_SNAKE_CASE kullanılır: tüm harfler büyük, kelimeler alt çizgiyle ayrılır. Peki sabit tam olarak nedir?
Sabitler, özel get işlevi olmayan val özelliklerdir. İçerikleri tamamen değişmezdir ve işlevlerinin tespit edilebilir yan etkileri yoktur. Bu, const olarak işaretlenmişse değişmez türleri ve değişmez türlerin değişmez koleksiyonlarının yanı sıra skalerleri ve dizeleri de içerir. Bir örneğin gözlemlenebilir durumlarından herhangi biri değişebiliyorsa bu durum sabit değildir. Nesneyi hiçbir zaman değiştirmemeyi amaçlamak yeterli değildir.
const val NUMBER = 5 val NAMES = listOf("Alice", "Bob") val AGES = mapOf("Alice" to 35, "Bob" to 32) val COMMA_JOINED = NAMES.joinToString(", ") val EMPTY_ARRAY = arrayOf<SomeMutableType>()
Bu adlar genellikle isim veya isim öbeğidir.
Sabit değerler yalnızca bir object içinde veya üst düzey bildirim olarak tanımlanabilir. Aksi takdirde sabit şartını karşılayan ancak class içinde tanımlanan değerler sabit olmayan bir ad kullanmalıdır.
Sabitler, skaler değerler olan const
değiştiriciyi kullanmalıdır.
Sabit olmayan adlar
Sabit olmayan adlar camelCase olarak yazılır. Bunlar örnek özellikler, yerel özellikler ve parametre adları için geçerlidir.
val variable = "var" val nonConstScalar = "non-const" val mutableCollection: MutableSet<String> = HashSet() val mutableElements = listOf(mutableInstance) val mutableValues = mapOf("Alice" to mutableInstance, "Bob" to mutableInstance2) val logger = Logger.getLogger(MyClass::class.java.name) val nonEmptyArray = arrayOf("these", "can", "change")
Bu adlar genellikle isim veya isim öbeğidir.
Destekleme özellikleri
Destekleyici özellik gerektiğinde, adı gerçek özelliğin adıyla tam olarak eşleşmeli ancak başına alt çizgi eklenmelidir.
private var _table: Map<String, Int>? = null val table: Map<String, Int> get() { if (_table == null) { _table = HashMap() } return _table ?: throw AssertionError() }
Değişken adlarını yazma
Her tür değişkeni iki stilden birinde adlandırılır:
- Tek bir büyük harf, isteğe bağlı olarak tek bir rakamla birlikte (ör.
E,T,X,T2) - Sınıflar için kullanılan formdaki bir ad ve ardından büyük harf
T(ör.RequestT,FooBarT)
Camel case
Bazen, kısaltmalar veya "IPv6" ya da "iOS" gibi alışılmadık yapılar olduğunda İngilizce bir ifadeyi camel case'e dönüştürmenin birden fazla makul yolu olabilir. Tahmin edilebilirliği artırmak için aşağıdaki şemayı kullanın.
Adın düz yazı biçimiyle başlayın:
- İfadeyi düz ASCII'ye dönüştürün ve kesme işaretlerini kaldırın. Örneğin, "Müller's algorithm" (Müller'in algoritması) "Muellers algorithm" (Müller algoritması) olabilir.
- Bu sonucu kelimelere ayırın. Boşlukları ve kalan noktalama işaretlerini (genellikle kısa çizgiler) kullanarak kelimeleri bölün. Önerilen: Herhangi bir kelime, yaygın kullanımda geleneksel deve kılıfı görünümüne sahipse bunu bileşenlerine ayırın (ör. "AdWords" kelimesi "ad words" olur). "iOS" gibi bir kelimenin gerçekte deve kılıfı görünümünde olmadığını unutmayın. Bu kelime, tüm kurallara aykırıdır. Bu nedenle bu öneri geçerli değildir.
- Şimdi her şeyi (kısaltmalar dahil) küçük harfe çevirin ve aşağıdakilerden birini yapın:
- Pascal case elde etmek için her kelimenin ilk karakterini büyük harf yapın.
- İlk kelime hariç her kelimenin ilk karakterini büyük harf yaparak camel case elde edin.
- Son olarak, tüm kelimeleri tek bir tanımlayıcıda birleştirin.
Orijinal kelimelerin büyük/küçük harf durumu neredeyse tamamen göz ardı edilir.
| Düz yazı biçimi (Prose form) | Doğru | Yanlış |
|---|---|---|
| "XML Http Request" | XmlHttpRequest |
XMLHTTPRequest |
| "yeni müşteri kimliği" | newCustomerId |
newCustomerID |
| "iç kronometre" | innerStopwatch |
innerStopWatch |
| "iOS'te IPv6'yı destekler" | supportsIpv6OnIos |
supportsIPv6OnIOS |
| "YouTube importer" (YouTube içe aktarma aracı) | YouTubeImporter |
YoutubeImporter* |
(* Kabul edilebilir ancak önerilmez.)
Belgeler
Biçimlendirme
KDoc bloklarının temel biçimlendirmesi bu örnekte gösterilmektedir:
/** * Multiple lines of KDoc text are written here, * wrapped normally… */ fun method(arg: String) { // … }
...veya aşağıdaki tek satırlık örnekte:
/** An especially short bit of KDoc. */
Temel form her zaman kabul edilebilir. KDoc bloğunun tamamı (yorum işaretleri dahil) tek bir satıra sığdığında tek satırlık form kullanılabilir. Bu durumun yalnızca @return gibi engelleme etiketleri olmadığında geçerli olduğunu unutmayın.
Paragraf
Paragraflar arasında ve varsa blok etiketleri grubundan önce bir boş satır (yani yalnızca hizalanmış baştaki yıldız işaretini (*) içeren bir satır) görünür.
Etiketleri engelleme
Kullanılan standart "blok etiketleri" @constructor, @receiver, @param, @property, @return, @throws, @see sırasıyla görünür ve hiçbir zaman boş bir açıklamayla birlikte görünmez.
Bir blok etiketi tek bir satıra sığmadığında devam satırları, @ konumundan 4 boşluk girintili olur.
Özet parçası
Her KDoc bloğu kısa bir özet parçasıyla başlar. Bu parça çok önemlidir: Metnin yalnızca bu kısmı, sınıf ve yöntem dizinleri gibi belirli bağlamlarda görünür.
Bu bir parça; tam cümle değil, isim öbeği veya fiil öbeği.
"A `Foo` is a..." veya "This method returns..." ile başlamaz ve "Save the record." gibi tam bir emir cümlesi oluşturması gerekmez. Ancak parça, tam bir cümleymiş gibi büyük harfle başlar ve noktalama işaretleriyle tamamlanır.
Kullanım
KDoc, en azından her public türü ve bu türün her public veya protected üyesi için mevcuttur. Aşağıda belirtilen birkaç istisna vardır.
İstisna: Kendini açıklayan işlevler
KDoc, getFoo gibi "basit ve açık" işlevler ve foo gibi özellikler için isteğe bağlıdır. Bu durumlarda, "foo değerini döndürür" dışında gerçekten söylenecek başka bir şey yoktur.
Bu istisnayı, tipik bir okuyucunun bilmesi gereken ilgili bilgileri atlamayı haklı çıkarmak için kullanmak uygun değildir. Örneğin, getCanonicalName adlı bir işlev veya canonicalName adlı bir özellik için, tipik bir okuyucu "kanonik ad" teriminin ne anlama geldiğini bilmeyebilir. Bu durumda, yalnızca /** Returns the canonical name. */ diyeceği gerekçesiyle dokümanlarını atlamayın.
İstisna: Geçersiz kılmalar
KDoc, üst tür yöntemini geçersiz kılan bir yöntemde her zaman bulunmaz.