Android’de DSL Ustalaşma Klavuzu | Kotlin | 2020

Bu blogda, Android projenize Kotlin Domain-Specific Language (Etki Alanına Özel Dil) (DSL) yazmayı öğreneceğiz. Bu blog çok uzun sürecek, biraz zaman ayırın ve DSL ile birlikte yazalım. Aşağıdaki konuyu ele alacağız,

Bu blogda, Android projenize Kotlin Domain-Specific Language (Etki Alanına Özel Dil) (DSL) yazmayı öğreneceğiz.

Bu blog çok uzun sürecek, biraz zaman ayırın ve DSL ile birlikte yazalım. Aşağıdaki konuyu ele alacağız,

  • Düz İngilizce’de DSL nedir?
  • DSL kullanıyor musunuz?
  • Neden DSL kullanıyoruz?
  • Kendi DSL’mizi nasıl yazabiliriz
  • Temel Örnek açıklamalar.

Öyleyse başlayalım.

DSL Nedir?

Vikipedi tanımı şöyle diyor:Bir 

alanı – 

özel dil (DSL) bir bilgisayardır 

dil bir şekilde özelleşmiş 

belirli uygulama 

etki . Bu, tüm alanlarda yaygın olarak uygulanabilir olan genel amaçlı bir 

dilin (GPL) 

aksinedir .

Ciddi misin?

Genel insan terimlerinde DSL, belirli programlama dili tarafından sağlanan gücü artırmak için size belirli bir dilin esnek bir aracını sunar.

DSL kullanıyor musunuz?

Bir android geliştiricisiyseniz ve projenizde kotlin kullanıyorsanız, projenizde bilerek ya da bilmeden DSL kullanmak olabilir mi? Bir örnek düşünebilir misin?

Sana yardım edeyim, gibi bir kod yazdın mı,

yourlist.forEach { 
    //your code is here
}

Yukarıdaki örnek, Kotlin’deki listenizdeki Her for’u kullanmaktır. Bir forEach KOTLIN DSL bir örnek olduğu

Neden DSL kullanıyoruz?

Uygulamanın karmaşıklığını basitleştirmek ve iyileştirmek ve kodu daha okunaklı hale getirmek için DSL kullanmalıyız.

Kendi DSL’mizi nasıl yazabiliriz?

Kendi DSL’mizi yazmaya başlamadan önce alıcı ile lambda hakkında bilgi edinmemiz gerekir.
Çok Alıcılarının ile Lambda sayesinde blogda geçiyor tavsiye ama bana da bir alıcı ile bir lambda kısa bir özetini vereyim

BuildString işlevimiz olduğunu varsayalım.

fun buildString(action: (StringBuilder).() -> Unit): String {
    val stringBuilder = StringBuilder()
    action(stringBuilder)
    return stringBuilder.toString()
}

Burada, parametre olarak işlem yapan (bu bir işlevdir) bir işlevi buildString var . burada action işlevi StringBuilder’ı parametre olarak alır ve buildString işlevi döndürme türü olarak String’e sahiptir.

Şimdi yazdığımız buildString’i kullanmak için ,

buildString {
    append("<")
    append("MindOrks")
    append(">")
}

Eklenti işlevlerinin gücünü buildString işlevinde kullanırken, StringBuilder ile ilgili özelliği iletmek için Kotlin’in özelliğini burada kullanıyoruz.

Ayrıca, kullanarak özel DSL de oluşturabiliriz.

telkin etmek

Kotlin’de infix, İngilizce yazdıklarımıza benzer şekilde özel DSL oluşturmamıza yardımcı olur. Örneğin,

İngilizce, biz “1 demek artı 2″ olsun toplamını veya almak için farkı biz “1 demek eksi 2″. Benzer şeyler, ara çağrıları kullanarak Kotin’de de başarılabilir.

Kullandığımız sayılara eklemek için bir ek oluşturmak için,

infix fun Int.plus(number: Int) = this + number

Burada, Int’in bir artı işlevini yarattık; burada bir sayı alır ve bu + sayının toplamını döndürür İşte bu fonksiyonun uygulandığı sayıdır.

Yani, kullandığımız bu infix fonksiyonunu kullanmak için

val output = 1 plus 2

ve yukarıdaki kodda, çıktı üretmek için artıyı yarattığımız infix işlevini kullanırız. Bunu Logcat’ta yazdırdığımızda , toplam olarak 3 yazacaktır .

Bunun sebebi , geleneksel bir yöntem olarak kullandığımız ” + ” yerine artı metin kullanmak için bir ek uzantısı işlevi oluşturmamızdır .

Benzer şekilde, eksi işlevini eksi yapmak istiyorsak,

infix fun Int.minus(number: Int) = this - number

ve kullanmak için

val output = 1 minus 2

Infix, kodu okunabilir ve herhangi bir insanın okuması için çok sıralı hale getirir. Yani programlama hakkında hiçbir fikri olmayan biri, bunun iki sayının toplanması veya çıkarılması olduğunu söyleyebilir.

Çağırmak

Çağrıda, işleç, herhangi bir nesnenin işlev olarak çağrılmasına izin verir. Burada, en adında bir sınıf oluşturmak izin Öğrenci ,

class Student {
    operator fun invoke(student: Student.() -> Unit) = student
    fun addName(name: String) {
        //implementation
    }
    fun addMarks(marks: Int) {
        //implementation
    }
}

Sınıfta, Öğrenci türünde bir parametre alan ve öğrencinin kendisini döndüren bir fonksiyon çağırma işlevi yarattık . Böylece, burada Öğrenci sınıfının tüm yöntemlerini öğrencinin nesnesinde kullanabiliriz.

Şimdi, Sınıfı kullanmak için genellikle Kotlin’de yaptığımız gibi nesneyi yaratacağız.

val student = Student()

ve şimdi gördüğünüz gibi, addName adında ve onu DSL olarak kullanacağımız addMarks adında başka bir işleve sahibiz . Ancak burada iki farklı şekilde kullanabiliriz. Her ikisi de şöyle

  1. Tür – 1 (Geleneksel Yol)
student.addName("MindOrks")
student.addMarks(100)

Yukarıdaki kod, Android’de yaptığımız eski geleneksel yöntem gibidir. 2. DSL yolu

student {
    addName("MindOrks")
    addMarks(100)
}

Burada onu Kotlin DSL kullanıyoruz. Farkındaysanız, lambda gibi,

Student.() -> Unit

Ve eğer farkederseniz, orada bir () var. Lamda’nın bir alıcısı olduğunu ve onu kullanmak için sınıfın bir yapısını yaratmamız gerektiğini belirtir. DSL oluşturmak için invoke işlevini bu şekilde kullanabilirsiniz. 

Yukarıdaki yöntemlerle, kazandığınız DSL’lerinizi Kotlin’de oluşturabilirsiniz.

Şimdi, Android’deki DSL kullanım örneklerini ve örneklerini tartışalım.

  1. Veri Sınıfları

Bu bölümde, bir Veri Sınıfı DSL’ini nasıl oluşturabileceğimizi tartışalım. Bir veri sınıfımız olduğunu düşünün Öğrenci

data class Student(
    var name: String? = null,
    var age: Int? = null,
    var marks: Int? = null
)

Bu, yazdığımız veri sınıfını kullanırsak,

val student =  Student(
      "MindOrks",
      20,
      30
  )

Şimdi yukarıdaki kodu DSL olarak dönüştürmek için,

Şimdi aşağıdaki gibi yeni bir lambda yaratacağız.

fun student(student: Student.() -> Unit): Student = Student().apply(student)

İşte yukarıdaki kodda,

parametre öğrencisinin alıcısı ve kullandığımız DSL olarak kullanmamız,

val student = student {
    name = "MindOrks"
    age = 20
    marks = 30
}

Bu şekilde bir veri sınıfını DSL olarak gizleyebiliriz.

2. UI Öğeleri

Bunun için textView’ı UI Elemanı olarak ele alalım. Bunun içinde aşağıdaki gibi kullanıyoruz

textView.text = "MindOrks"
textView.setOnClickListener {  
    
} 
textView.setTextColor(Color.BLACK)

Ancak DSL kullanarak kullanmak için

textView.apply {
    text = "MindOrks"
    setOnClickListener {

    }
    textColor(Color.BLACK)
}

Herhangi bir UI Öğesinde DSL oluşturmak için başvuru kullanıyoruz

3. JSON

Android’de kullandığımız bir JSON oluşturmak için,

val jsonObject = JSONObject()
jsonObject.put("name","MindOrks")
jsonObject.put("age",20)

JSON nesneleri oluşturmanın geleneksel yoludur.

Şimdi, JSON’u oluşturmak için nasıl DSL oluşturabileceğimize bakalım. İlk önce bir sınıf oluşturacağız ve onu JSONObject () ile genişleteceğiz,

class Json() : JSONObject() {

}

ve şimdi bu, biz alıcı ile lambda ile bir inşaatçı olacağız

constructor(json: Json.() -> Unit) : this() {
    this.init()
}

Bu, JSON nesnelerine değer eklemek üzere bir genel oluşturmak için infix’i kullanır.

Gibi görünüyor

infix fun <T> String.to(value: T) {
    put(this, value)
}

buraya, string tuşuyla değerleri koyacak ve değer ” to” ile kullanılan tipte olacaktır .

Şimdi, tam bir sınıf dosyası gibi görünüyor

class Json() : JSONObject() {

    constructor(json: Json.() -> Unit) : this() {
        this.json()
    }

    infix fun <T> String.to(value: T) {
        put(this, value)
    }
}

Bunu Faaliyet dosyasında kullanmak için, az önce oluşturduğumuz DSL’yi kullanarak JSON’u yaratırız,

val json = Json {
    "name" to "MindOrks"
    "age" to 20
}

İşte,

  • to JSON nesnesine değerler koymak için yarattığımız infix
  • JSON, oluşturduğumuz ve JSON Object oluşturmak için anahtar ve değer alan bir sınıftır.

Bunu Logcat’ta yazdırdığımızda, aşağıdakileri çıktı olarak alırız:

{"name":"MindOrks","age":20}

Kotlin kodunuzda DSL’leri bu şekilde oluşturabilirsiniz.

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

GIPHY App Key not set. Please check settings

Yükleniyor…

0

Ne düşünüyorsun?

Akıllı telefon mikroskobu

BMW çin seddi tesisi için onay aldı.