ProgramlamaKotlin Geliştirici, Backend Geliştirici

Kotlin'de sayı aralıkları (Range ve Progression) mekanizması nasıl çalışır, nasıl kendi aralıklarımızı oluştururuz ve bunları hangi görevler için kullanırız?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Aralıklar (Range) ve ilerlemeler (Progression) — Kotlin'de belirli bir adım ile değer dizilerini temsil etmek için kullanılan yerleşik bir mekanizmadır. Genellikle döngülerde, koşullarda, koleksiyonları iterasyonda ve veri doğrulamada kullanılırlar. Range, Kotlin'in sözdizimini Java'ya göre daha özlü ve anlamlı hale getiren yöntemlerden biri olarak ortaya çıktı.

Konunun Tarihi

Java'da benzer görevler, çok kelimeli ve hatalara açık olan indeksli for ve while döngüleriyle çözülüyordu. Kotlin'de aralık oluşturmak için (örneğin, 1..10) ve adımları belirlemek için kompakt operatörler eklendi.

Sorun

  • Değer aralıklarını kolayca iletme gerekliliği (örneğin, 1'den 100'e kadar tüm sayısal değerler).
  • İterasyon ve doğrulama sırasında kullanım kolaylığı.
  • Kullanıcı tanımlı türler için aralıkların yeniden tanımlanabilmesi.

Çözüm

Kotlin, standart sayısal aralıklar (IntRange, LongRange, CharRange, UIntRange vb.) ve kendi ilerlemelerinizi oluşturmak için arayüzler sağlar:

Kod örneği:

for (i in 1..5) print("$i ") // 1 2 3 4 5 for (i in 5 downTo 1 step 2) print("$i ") // 5 3 1 // Değer kontrolü val x = 42 if (x in 1..100) println("Aralıkta!")

Özel aralıklar

Kendi türleriniz için rangeTo ve Progression operatörlerini uygulayarak bir aralık tanımlayabilirsiniz:

data class Version(val major: Int, val minor: Int) : Comparable<Version> { override fun compareTo(other: Version) = compareValuesBy(this, other, Version::major, Version::minor) } operator fun Version.rangeTo(other: Version) = VersionRange(this, other) class VersionRange( override val start: Version, override val endInclusive: Version ) : ClosedRange<Version> for (v in Version(1, 0)..Version(1, 2)) println(v)

Anahtar özellikler:

  • Aralık oluşturmak için kompakt sözdizimi (start..end, downTo, step).
  • Yerleşik üyelik kontrolleri (in, !in).
  • Kullanıcı tanımlı türler için aralık ve ilerlemeler tanımlama imkanı.

Sanki sorular.

1..5 ifadesi aslında ne döndürür?

IntRange sınıfının bir örneğini oluşturur, bu da ClosedRange<Int> arayüzünü uygulamaktadır. Bu bir koleksiyon değildir, sınırları ve adımı tanımlayan bir nesnedir. Lazy-uygulama.

Range'in adım (step) değeri neden her zaman 1? Adımı nasıl değiştirebiliriz?

Varsayılan olarak aralığın adımı 1 (ya da downTo'da -1) olacaktır. Farklı bir adım için step ve downTo yöntemleri kullanılır. Örneğin:

for (i in 2..10 step 2) println(i)

Comparable'ı uygulamayan türlerle aralıkları kullanabilir miyiz?

Hayır, kullanıcı tanımlı aralığın düzgün çalışması için türün Comparable arayüzünü uygulaması gerekmektedir, aksi takdirde rangeTo operatörü mümkün olmayacaktır.

Tipik hatalar ve anti-paterni

  • step yöntemini kullanmadan Range'in adımını değiştirmeye çalışmak.
  • Comparable'a sahip olmayan türlerle aralığı kullanmak.
  • Yanlış yön (örneğin, 5..1 hiçbir şey üretmeyecek).

Gerçek yaşam örneği

Olumsuz durum

Geliştirici, for (i in 5..1) döngüsünü downTo olmadan kullanıyor ve 5, 4, 3, 2, 1 çıkmasını bekliyor, ancak döngü bir kez bile çalışmayacak.

Artılar:

  • Sözdiziminin basitliği.

Eksiler:

  • Negatif aralığın belirsiz davranışı.
  • Yeni başlayanlar için kafa karıştırıcı olabilir.

Olumlu durum

Gerekli aralıkla raporları döngü ile ilerletmek için downTo ve step ile ilerlemeyi kullanmak, kodu kompakt ve kendini belgeler hale getirir.

Artılar:

  • Özlü bir stil.
  • Sınırları aşma hataları olasılığı düşüktür.

Eksiler:

  • Adım ve yönlerle ilgili özellikleri bilmek gerekir.