Arka Uç Geliştirme için Kotlin'i Kullanma: Hızlı Bir Genel Bakış

Yayınlanan: 2022-03-11

Mayıs 2017'de Google, Android geliştirme için resmi dil olacağını açıkladığı için, Kotlin'i yerel Android geliştiricileriyle tanıştırmak zorunda değilim. O zamandan beri, yeni ve parlak Android uygulamaları geliştirmek için birincil dil seçimi olarak çok fazla ilgi gördü. Java'nın pek çok sorunlu noktasını çözer, bu nedenle yeni uygulamalar çoğunlukla içine yazılır ve eskileri yeniden yazılır.

Uygulamaların ön uç tarafında harika olduğuna şüphe yok ve Kotlin'den ilk bahsettiğinizde çoğu insan onu Android işletim sistemi ile ilişkilendirir. Ancak bu yazımda size bir back-end dili olarak Kotlin'den bahsedeceğim ve Android hobi projem için hızlı, güvenilir ve asenkron bir Kotlin back end oluşturma hikayemi paylaşmak istiyorum. Bu yazının konusu dışında olduğu için projenin konusuna değinmeyeceğim; bunun yerine neden Kotlin'i seçtiğimi ve neden sunucu tarafı uygulamaları veya REST API'leri yazmak için harika bir dil olduğunu düşündüğümü açıklamaya odaklanacağım.

Neden Kotlin?

Yolculuğumun en başına dönelim. Her zaman girişimcilik hırslarım vardı ve bu yolda ilk adımın kendi başıma bir şeyler yaratmak olduğunu düşündüm. Büyük bir şey değil, dünyayı değiştirecek hiçbir şey yok, sadece benim, belki ailem ve arkadaşlarımın kullanabileceği küçük bir şey. Makul bir fikre sahip olduktan sonra hemen ona atladım ve uygulamaya başladım. Herhangi bir projenin başında yaptığınız ilk şey, araçlarınızı seçmektir. Sonuçta, doğru araç seti uzun vadede size çok zaman ve para kazandırabilir. Ben de böyle yaptım.

Ben öncelikle bir Java geliştiricisiyim. Java ve Spring kullanarak birkaç arka uç sistem ve REST API yazdım ve bu ikisinin böyle şeyler yapmak için harika araçlar olduğunu düşünüyorum. Java tek başına kapsamlı bir dildir, ancak Spring ile birleştiğinde uygulayamayacağınız hiçbir şey yoktur.

Ancak çorbada sadece bir minik kıl var. ayrıntı. Spring ve Java'nın en son sürümleri bu konuda çok yardımcı olsa da, yine de çok sayıda ortak kodla uğraşmak zorundasınız. Ve bir zamanlar harika bir adamın bana söylediği gibi - en güvenli, en güvenilir ve hatasız kod, yazılmamış koddur. Örneğin, bu önemsiz Java sınıfını alın:

 public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }

Benim düşünceme göre, bu sadece "Salt okunur iki alanı olan bir sınıf istiyorum" demek için çok fazla kod. En kötü yanı, yapıcının ve yöntemlerin otomatik olarak oluşturulmuş olmasıdır. Yine de, bir çekme isteğini incelerken, her zaman onları gözden geçirirsiniz, çünkü neye ihtiyacınız olup olmadığını asla bilemezsiniz. Elbette, Lombok gibi üçüncü taraf kütüphanelerle bu kısaltılabilir, ancak bunu kutudan çıkarsak iyi olmaz mıydı? Aynı sınıfı Kotlin'de görelim:

 class Person( val name: String, val age: Int )

Kesinlikle daha kısa ve basit. val anahtar sözcüğünü kullandığımız için değişkenler kesindir; yapıcı ve alıcılar derleme zamanında oluşturulur. Değişmez bir kişi nesnesine sahip olmamayı tercih edersek, basitçe val'i var olarak değiştirebiliriz ve işte, değişken bir kişimiz var ve tek yapmamız gereken sadece bir harfi değiştirmek.

Basit bir Java POJO sınıfındaki ikinci favori bölümüm, geçersiz kılınan equals() ve hashCode() . Bunlar çoğu zaman yine otomatik olarak oluşturulur, ancak emin olmak için her zaman bunları gözden geçirmeniz gerekir. İyi haber şu ki, Kotlin bunu da halledebilir. class bir data class olarak değiştirin ve kutudan equals() ve hashCode() elde edin.

 data class Person( val name: String, val age: Int )

Kısacası Java'yı çok sevsem de kısa sürede projem için minimum uygulanabilir bir ürün yaratmak istedim. Ve yazılım geliştirme durumunda, bunu başarmanın en basit yolu daha az kod yazmaktır. Böylece arka uç geliştirme için daha iyi bir dil arayışım devam etti. Bu düşünceyle önce Node.js'ye geçtim. Bazı önemli avantajları vardır—birkaç satır ve Express sunucunuz çalışır durumda, 8080 numaralı bağlantı noktasını dinliyor ve Hello World! ile yanıt veriyor! her alma isteği gönderdiğinizde.

 let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);

Kolay, basit ve hızlı. En popüler programlama dillerinden birinden beklediğiniz gibi. JavaScript ile çalışmaktan zevk alıyorum ve kısa bir an için doğru aracı bulduğumu düşündüm ama sonra JavaScript'in dinamik olarak yazıldığı gerçeği beni rahatsız etti. Beni yanlış anlamayın, dinamik yazmanın ön uçta harika olduğunu düşünüyorum, ancak deneyimlerime göre, statik olarak yazılmış bir arka uca sahip olmak, sunucunuzun çalışma zamanında tür uyumsuzlukları nedeniyle çökme olasılığının daha düşük olduğu konusunda size ekstra güven verir. . Ve burada dürüst olalım, arka ucunuz birkaç yüz bin kullanıcıya hizmet verirken, bunun olmasını gerçekten istemezsiniz. Ancak Node.js, asenkron kod ve hizmetleri kolayca yazabilmek olan, saklamak istediğim harika bir özellik sundu.

Bu gereksinimleri göz önünde bulundurarak, Kotlin Android arka ucumu Kotlin'de de yazmayı seçtim.

Kotlin: Hızlı Bir Genel Bakış

Daha önce hiç duymamış olanlarınız için Kotlin, hem nesne yönelimli hem de işlevsel programlamayı destekleyen açık kaynaklı, statik olarak yazılmış bir programlama dilidir. C#, Java veya Scala ile benzer sözdizimi ve kavramları sağlar ve esas olarak JVM'yi hedefler, ancak JavaScript veya yerel kodu hedefleyen varyantları da vardır. Kotlin/JVM'nin Java bayt kodunu derlemesi açısından Java'ya çok benzer, bu nedenle JVM geçmişine sahip arka uç mühendisleri için Kotlin'i kavraması kolay olacaktır.

Resmi sayfasında belirtildiği gibi, Kotlin'in amacı benzersiz olmak değil, onlarca yıllık dil gelişiminden ilham ve en iyi uygulamaları almaktır. Herhangi bir Java IDE ile veya komut satırından kullanılabilir, ancak ben şahsen IntelliJ ile kullanmayı tercih ediyor ve tavsiye ediyorum. JetBrains ekibi tarafından aktif olarak korunur ve yükseltilir ve ücretli sürümü satın alma konusunda endişelenmeyin; Kotlin ile yeni başladıysanız, IntelliJ'in topluluk sürümü her ihtiyacınızı karşılayacaktır. Kotlin'in belirtmek istediğim en önemli üç yönü şudur: a) özlü (ortak kodu büyük ölçüde azaltır), b) güvenli (birincisi, boş gösterici istisnalarından kaçınmak için yapılmıştır) ve c ) birlikte çalışabilir (JVM, Android veya tarayıcı için mevcut kitaplıklardan yararlanabilirsiniz).

Kotlin Eşyordamları

Herkes, kullanıcılara hızlı hizmet veren hizmetlere sahip olmak ister. Sunucunuzun maksimum kapasitesine ulaşmak için yapabileceğiniz ilk şey, çok iş parçacıklı bir uygulamaya sahip olmaktır. Java bununla oldukça hantal. Java öğrendiğinizde, önce çok iş parçacıklı bir uygulama istiyorsanız, Thread sınıfını genişletmeniz veya Runnable arabirimini uygulamanız gerektiğini öğrenirsiniz. Yeni başlayanlar, farkın ne olduğunu (eğer varsa) hiçbir zaman gerçekten anlamazlar, ancak kafa karışıklığına ek olarak, onlara her zaman run yöntemiyle bir iş parçacığı başlatmaları, asla start yöntemini kullanmamaları söylenir. Ya da bekle, tam tersi miydi? Sonuçta, önemli değil, yine de manuel olarak bir iş parçacığı başlatmamalısınız, çok pahalı, bunun yerine bir iş parçacığı havuzu kullanın. Basit, bunun dışında.

Neyse ki Kotlin'in eşyordam adı verilen daha basit bir çözümü var. Basitçe söylemek gerekirse, eşyordamlar çok akıcı bir şekilde asenkron, bloke edici olmayan kod yazmayı mümkün kılar. Ana fikir, askıya alınabilecek işlevlere sahip olmaktır; başka bir deyişle, hesaplama bir noktada askıya alınabilir ve daha sonra yeniden başlatılabilir. En iyi yanı, engelleyici olmayan kod yazarken programlama modelinin gerçekten değişmemesidir, bu nedenle engelleyici olmayan kod yazmak, temelde engelleme kodu yazmakla aynıdır. İki örnek görelim:

 fun sendRequest(): Int { /* do some heavy work */ return 1; }

Bu örnekte bir engelleme işlevi gösterilmektedir. Bu kod parçacığını yürüten iş parçacığı, işlev dönene kadar başka bir iş yapmayacaktır; bu, bir API veya veritabanı çağrısı durumunda birkaç saniye sürebilir. Başka bir servisi beklerken iş parçacığımızı gerçekten bloke etmek istemiyoruz, bu yüzden bu fonksiyonu bloklamayan bir fonksiyona çevirelim.

 suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }

Bu örnek, yöntemimizi, askıya alınabilen engellemesiz bir işleve nasıl dönüştürebileceğimizi gösterir. Bu, basitlik için, ağır iş 10 saniyelik basit bir delay() işlev çağrısıysa, yürütme iş parçacığının o süre boyunca diğer görevler üzerinde çalışmaya devam edeceği ve 10 saniye geçtikten sonra işlevin yürütülmesine devam edeceği anlamına gelir. Tek bir anahtar kelimeyle elde edilen güzel, engellemeyen kod.

Ktor ile Asenkron Servis

REST API'leri yazmaya gelince, katıştırılmış bir sunucu başlatmak veya isteği ayrıştırmak gibi atılması gereken bazı ekstra adımlar vardır ve elbette kimse bunu manuel olarak yapmak istemez. Java, işleri gerçekten kolaylaştıran Spring Boot'a sahiptir ve neyse ki Kotlin'in Ktor adlı bir çerçevesi vardır. Ktor, asenkron sunucular oluşturmak için bir web çerçevesidir. Web sitesinin belirttiği gibi, Ktor “kullanımı kolay, eğlenceli ve eşzamansız”. Şimdi, eğlence özneldir, bu yüzden bunu kanıtlamak istemiyorum, ancak kullanımı kolay ve eşzamansız olduğunu kanıtlayan bir pasaj görelim.

 fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }

Yukarıdaki örnek, yerleşik bir Tomcat sunucusunda çalışan, 8080 numaralı bağlantı noktasını dinleyen ve "Merhaba dünya!" ile eşzamansız olarak yanıt verecek tam işlevsel bir Kotlin Ktor sunucusunu sunar. istekleri almak için. Bütün bunlar 10 satırdan daha az kodda.

Ktor açıkçası bundan çok daha fazlasını yapabilir. Ktor'un tüm özelliklerini sunmak, kendi makalesini gerektirir, ancak birçok şeyin yanı sıra, oturum açmayı ve kimlik doğrulamayı pasta kadar kolaylaştırır. Ktor'un sunucu tarafında neler yapabileceği ve nasıl yapılandırılacağı hakkında daha fazla bilgiyi buradan okuyun.

Kotlin'in Arka Uçtaki Diğer Faydaları

Belirtmek istediğim ilk fayda, Kotlin'de Java kitaplıklarını kullanabilmeniz ve bana güvenin, Java için hayatınızı kolaylaştırabilecek çok sayıda harika üçüncü taraf kitaplığı var. İşi mükemmel bir şekilde yapan açık kaynaklı, kullanıma hazır bir kitaplık varken neden kendi uygulamanızı yazasınız? Bunları Kotlin ile kullanmak kusursuz çalışıyor.

Kotlin ve Ktor'un bir diğer önemli avantajı, kullanabileceğiniz kapsamlı test kitaplıkları ve çerçeveleridir. Junit çerçevesi, Kotlin ile bir cazibe gibi çalışır ve Ktor, bunun üzerine, uçtan uca testler ve entegrasyon testleri yazmanıza izin veren kendi test kitaplığını ekler. Tüm uygulamanızı çalıştıracak ve tıpkı canlı uygulamanın yaptığı gibi istekleri işleyebilecek özel bir test motoru kullanabilirsiniz.

Çözüm

Daha önce de belirttiğim gibi, ben öncelikle arkamda birkaç sunucu tarafı uygulaması ve REST API'si olan bir Java arka uç geliştiricisiyim. Java'da programlamayı sevmeme rağmen, herhangi bir iş için mükemmel olan ve herhangi bir sorunu çözebilecek en iyi tek bir dil veya çerçeve olmadığını düşünüyorum. Benim yaklaşımım, olabildiğince çok araca aşina olmak ve bir sorun ortaya çıktığında, o sorunu kusursuz bir şekilde çözebilecek en iyi aracı seçmek.

Kotlin sitesinin belirttiği gibi, Kotlin'in amacı benzersiz olmak değil; bunun yerine, onlarca yıllık dil gelişiminden ilham alıyor ve en iyi uygulamaları alıyor ve iş arka plan geliştirme söz konusu olduğunda, Kotlin, Coroutines ve Ktor'un işi yapmak için harika bir üçlü oluşturduğuna inanıyorum. Kotlin ve bir programlama dili olarak kullanışlılığı hakkında daha fazla bilgiyi buradan okuyabilirsiniz.