Yeni bir dile geçiş yapmak zor olabilir. Ekibinizin başarılı olması için yavaş başlayın, küçük parçalar halinde taşıma yapın ve sık sık test edin. Kotlin, JVM bayt koduna derlenir ve Java ile tamamen birlikte çalışabilir. Bu da geçişi kolaylaştırır.
Ekip oluşturma
Geçiş işleminden önceki ilk adım, ekibiniz için ortak bir temel anlayış oluşturmaktır. Ekibinizin öğrenme sürecini hızlandırmak için yararlı bulabileceğiniz birkaç ipucunu aşağıda bulabilirsiniz.
Çalışma grupları oluşturma
Çalışma grupları, öğrenmeyi ve bilgilerin akılda kalmasını kolaylaştıran etkili bir yöntemdir. Çalışmalar, öğrendiklerinizi grup ortamında tekrar etmenin materyali pekiştirmeye yardımcı olduğunu gösteriyor. Grubun her üyesi için bir Kotlin kitabı veya başka bir çalışma materyali edinin ve gruptan her hafta birkaç bölümü incelemesini isteyin. Her toplantıda grup, öğrendiklerini karşılaştırmalı ve soruları ya da gözlemleri tartışmalıdır.
Öğretme kültürünü oluşturma
Herkes kendini öğretmen olarak görmese de herkes bir şeyler öğretebilir. Teknoloji veya ekip liderinden bireysel katkıda bulunanlara kadar herkes, başarıya ulaşmaya yardımcı olabilecek bir öğrenme ortamını teşvik edebilir. Bunu kolaylaştırmanın bir yolu, ekipteki bir kişinin öğrendiği veya paylaşmak istediği bir şey hakkında konuşmak üzere görevlendirildiği periyodik sunumlar düzenlemektir. Ekibiniz dilde rahat hissedecek noktaya gelene kadar her hafta yeni bir bölüm sunacak gönüllüler isteyerek çalışma grubunuzdan yararlanabilirsiniz.
Bir şampiyon belirleyin
Son olarak, öğrenme çalışmalarına liderlik edecek bir uzman belirleyin. Bu kişi, benimseme sürecini başlatırken konu uzmanı (SME) olarak görev yapabilir. Bu kişiyi Kotlin ile ilgili tüm alıştırma toplantılarınıza dahil etmeniz önemlidir. Bu kişinin Kotlin'e ilgi duyması ve biraz bilgi sahibi olması idealdir.
Yavaş yavaş entegre edin
Yavaş bir başlangıç yapmak ve ekosisteminizin hangi bölümlerini önce taşıyacağınız konusunda stratejik düşünmek çok önemlidir. Bu işlemi genellikle bir amiral gemisi uygulaması yerine kuruluşunuzdaki tek bir uygulamayla sınırlamak en iyisidir. Seçilen uygulamayı taşıma konusunda her durum farklıdır ancak başlamak için birkaç yaygın yer aşağıda verilmiştir.
Veri modeli
Veri modeliniz muhtemelen birkaç yöntemle birlikte çok sayıda durum bilgisi içerir. Veri modelinde toString, equals ve hashCode gibi yaygın yöntemler de bulunabilir. Genellikle bu yöntemleri taşıyabilir ve bunları ayrı ayrı birim testine tabi tutabilirsiniz.
Örneğin, aşağıdaki Java snippet'ini ele alalım:
public class Person {
private String firstName;
private String lastName;
// ...
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(firstName, person.firstName) &&
Objects.equals(lastName, person.lastName);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName);
}
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}
Java sınıfını, aşağıdaki örnekte gösterildiği gibi tek bir satır Kotlin koduyla değiştirebilirsiniz:
data class Person(var firstName: String?, var lastName: String?)
Ardından bu kodu mevcut test paketinize karşı birim testi yapabilirsiniz. Her seferinde tek bir modelle başlayın ve daha çok durum içeren sınıfları taşıyın. Süreç boyunca sık sık test yapın.
Testleri taşıma
Başka bir başlangıç noktası da testlerinizdir: Mevcut testleri dönüştürün ve Kotlin'de yeni testler yazın. Bu sayede, uygulamanızla birlikte gönderilecek kodu yazmadan önce ekibiniz dil konusunda rahatlayabilir.
Yardımcı yöntemleri uzantı işlevlerine taşıma
StringUtils, IntegerUtils, DateUtils veya YourCustomTypeUtils gibi statik yardımcı sınıfları Kotlin uzantı işlevleri olarak temsil edebilir ve mevcut Java kod tabanınızdan kullanabilirsiniz.
Örneğin, birkaç yöntemi olan bir StringUtils sınıfınız olduğunu varsayalım:
package com.java.project;
public class StringUtils {
public static String foo(String receiver) {
return receiver...; // Transform the receiver in some way
}
public static String bar(String receiver) {
return receiver...; // Transform the receiver in some way
}
}
Bu yöntemler daha sonra uygulamanızın başka yerlerinde kullanılabilir. Aşağıdaki örnekte bu durum gösterilmektedir:
...
String myString = ...
String fooString = StringUtils.foo(myString);
...
Kotlin uzantı işlevlerini kullanarak Java arayanlara aynı Utils arayüzünü sağlayabilir, aynı zamanda büyüyen Kotlin kod tabanınız için daha özlü bir API sunabilirsiniz.
Bunu yapmak için IDE tarafından sağlanan otomatik dönüştürme özelliğini kullanarak bu Utils sınıfını Kotlin'e dönüştürmeyle başlayabilirsiniz. Örnek çıkış şuna benzer şekilde görünebilir:
package com.java.project
object StringUtils {
fun foo(receiver: String): String {
return receiver...; // Transform the receiver in some way
}
fun bar(receiver: String): String {
return receiver...; // Transform the receiver in some way
}
}
Ardından sınıf veya nesne tanımını kaldırın, her işlev adının önüne bu işlevin uygulanması gereken türü ekleyin ve aşağıdaki örnekte gösterildiği gibi işlevin içindeki türe referans vermek için bunu kullanın:
package com.java.project
fun String.foo(): String {
return this...; // Transform the receiver in some way
}
fun String.bar(): String {
return this...; // Transform the receiver in some way
}
Son olarak, derlenen adı uygulamanızın geri kalanıyla uyumlu hale getirmek için kaynak dosyanın üst kısmına bir JvmName ek açıklaması ekleyin. Aşağıdaki örnekte bu işlem gösterilmektedir:
@file:JvmName("StringUtils")
package com.java.project
...
Son sürüm aşağıdaki gibi görünmelidir:
@file:JvmName("StringUtils")
package com.java.project
fun String.foo(): String {
return this...; // Transform `this` string in some way
}
fun String.bar(): String {
return this...; // Transform `this` string in some way
}
Bu işlevler artık her dile uygun kurallarla Java veya Kotlin kullanılarak çağrılabilir.
Kotlin
// ... val myString: String = "hello" val fooString = myString.foo() // ...
Java
... String myString = ... String fooString = StringUtils.foo(myString); ...
Taşıma işlemini tamamlama
Ekibiniz Kotlin'e alıştıktan ve daha küçük alanları taşıdıktan sonra,
parçalar, etkinlikler, ViewModel nesneler ve iş mantığıyla ilgili diğer sınıflar gibi daha büyük bileşenlere geçebilirsiniz.
Dikkat edilmesi gereken noktalar
Java'nın kendine özgü bir tarzı olduğu gibi Kotlin'in de özlü yapısına katkıda bulunan kendine özgü bir tarzı vardır. Ancak ilk başlarda ekibinizin yazdığı Kotlin kodunun, yerini aldığı Java koduna daha çok benzediğini görebilirsiniz. Ekibiniz Kotlin deneyimi kazandıkça bu durum değişir. Kademeli değişim, başarının anahtarıdır.
Kotlin kod tabanınız büyüdükçe tutarlı kalmasını sağlamak için yapabileceğiniz birkaç şey:
Ortak kodlama standartları
Kullanmaya başlama sürecinin başlarında standart bir kodlama kuralları seti tanımladığınızdan emin olun. Mantıklı olduğu durumlarda Android Kotlin stil kılavuzundan farklı bir yol izleyebilirsiniz.
Statik analiz araçları
Android lint ve diğer statik analiz araçlarını kullanarak ekibiniz için belirlenen kodlama standartlarını uygulayın. Üçüncü taraf Kotlin linter'ı olan ktlint, Kotlin için ek kurallar da sağlar.
Sürekli entegrasyon
Yaygın kodlama standartlarına uymaya ve Kotlin kodunuz için yeterli test kapsamı sağlamaya dikkat edin. Bu işlemi otomatik bir derleme sürecinin parçası haline getirmek, tutarlılığı ve bu standartlara uyulmasını sağlamaya yardımcı olabilir.
Birlikte çalışabilirlik
Kotlin, Java ile çoğunlukla sorunsuz bir şekilde birlikte çalışır ancak aşağıdaki noktaları göz önünde bulundurmanız gerekir.
Boş değer atanabilirliği
Kotlin, Kotlin tarafında null değer alabilme özelliğini anlamak için derlenmiş koddaki null değer alabilme ek açıklamalarını kullanır. Ek açıklamalar sağlanmazsa Kotlin, varsayılan olarak null değer alabilen veya null değer alamayan bir platform türüne ayarlanır. Platform türlerini dikkatli bir şekilde işlemezseniz çalışma zamanında NullPointerException sorunları yaşayabilirsiniz.
Yeni özellikleri kullanma
Kotlin, çok sayıda yeni kitaplık ve standart kodları azaltmak için söz dizimi kolaylıkları sunar. Bu da geliştirme hızını artırmaya yardımcı olur. Bununla birlikte, Kotlin'in standart kitaplık işlevlerini (ör. koleksiyon işlevleri, eş yordamlar ve lambda'lar) kullanırken dikkatli ve metodik olun.
Kotlin'e yeni başlayan geliştiricilerin sıkça düştüğü bir hata aşağıda açıklanmıştır. Aşağıdaki Kotlin kodunu inceleyin:
val nullableFoo: Foo? = Foo() // This lambda executes only if nullableFoo is not null // and `foo` is of the non-nullable Foo type nullableFoo?.let { foo -> foo.baz() foo.zap() }
Bu örnekte amaç, nullableFoo null değilse foo.baz ve foo.zap işlemlerini yürütmek ve böylece NullPointerException hatasını önlemektir. Bu kod beklendiği gibi çalışsa da aşağıdaki örnekte gösterildiği gibi, boş değer kontrolü ve akıllı yayın kadar sezgisel değildir:
val nullableFoo: Foo? = null if (nullableFoo != null) { nullableFoo.baz() // Using !! or ?. isn't required; the Kotlin compiler infers non-nullability nullableFoo.zap() // from guard condition; smart casts nullableFoo to Foo inside this block }
Test
Kotlin'de sınıflar ve işlevleri varsayılan olarak genişletmeye kapalıdır. Alt sınıf oluşturmak istediğiniz sınıfları ve işlevleri açıkça açmanız gerekir. Kotlin, kompozisyonu kalıtıma tercih etmek için bu seçimi yapar. Kotlin, kompozisyonu basitleştirmek için delegasyon aracılığıyla davranış uygulamaya yönelik yerleşik destek sunar.
Bu davranış, test sırasında davranışları geçersiz kılmak için arayüz uygulamasına veya devralmaya dayanan Mockito gibi sahte çerçeveler için sorun teşkil eder. Birim testleri için Mockito'nun Mock Maker Inline özelliğinin kullanımını etkinleştirebilirsiniz. Bu özellik, son sınıfları ve yöntemleri taklit etmenize olanak tanır. Alternatif olarak, derleme sürecinin bir parçası olarak test etmek istediğiniz Kotlin sınıflarını ve üyelerini açmak için All-Open derleyici eklentisini kullanabilirsiniz. Bu eklentiyi kullanmanın temel avantajı, hem birim testleriyle hem de enstrümantasyon testleriyle çalışmasıdır.
Daha fazla bilgi
Kotlin'i kullanma hakkında daha fazla bilgi için aşağıdaki bağlantılara bakın:
- Android'in Kotlin öncelikli yaklaşımı
- Kotlin'i kullanmaya başlamayla ilgili kaynaklar
- Kotlin öğrenen Java kullanıcıları için kaynaklar
- Java'dan Kotlin'e öğrenme rotası: Java programcılarının deyimsel Kotlin öğrenmesine ve yazmasına yardımcı olan bir kaynak koleksiyonudur.