Yeni bir dile geçmek zorlu bir görev olabilir. Başarıya ulaşmak için yavaş başlamanız, parçalar halinde ilerlemeniz ve ekibinizi başarıya hazırlamak için sık sık test yapmanız gerekir. Kotlin, JVM bayt koduna derlendiği ve Java ile tamamen birlikte çalışabildiği için geçişi kolaylaştırır.
Ekibi oluşturma
Taşıma işlemine başlamadan önce ekibiniz için ortak bir temel anlayış oluşturmanız gerekir. Ekibinizin öğrenme sürecini hızlandırmak için yararlanabileceğiniz birkaç ipucunu aşağıda bulabilirsiniz.
Çalışma grupları oluşturma
Çalışma grupları, öğrenmeyi ve bilgileri akılda tutmayı 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 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.
Eğitim kültürü oluşturma
Herkes kendini öğretmen olarak görmese de herkes öğretebilir. Teknoloji veya ekip liderinden bireysel katkıda bulunanlara kadar herkes, başarıyı garantilemeye 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 konu hakkında konuşmakla görevlendirildiği düzenli sunumlar yapmaktır. Ekibiniz dil konusunda rahat hissedene kadar her hafta yeni bir bölüm sunmak için gönüllü isteyerek çalışma grubunuzdan yararlanabilirsiniz.
Şampiyon atama
Son olarak, öğrenme çalışmalarına liderlik edecek bir uzman belirleyin. Bu kullanıcı, uyarlama sürecini başlatırken konu uzmanı (SME) olarak hareket edebilir. Bu kişiyi Kotlin ile ilgili tüm pratik toplantılarınıza dahil etmeniz önemlidir. Bu kişi ideal olarak Kotlin'e tutkuyla bağlı ve bu konuda biraz bilgi sahibi olmalıdır.
Yavaş yavaş entegre edin
Yavaş başlamak ve ekosisteminizin hangi bölümlerini önce taşıyacağınız konusunda stratejik düşünmek önemlidir. Bu işlemi genellikle bir amiral gemisi uygulaması yerine kuruluşunuzdaki tek bir uygulamayla sınırlamak en iyisidir. Seçilen uygulamanın taşınması açısından 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çeriyordur. Veri modelinde toString(), equals() ve hashcode() gibi ortak yöntemler de olabilir. Bu yöntemler genellikle kolayca geçiş yapılabilir ve birim testleri ayrı ayrı yapılabilir.
Ö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ı, burada gösterildiği gibi tek bir Kotlin satırıyla değiştirebilirsiniz:
data class Person(var firstName: String?, var lastName: String?)
Bu kod daha sonra mevcut test paketinize karşı birim testine tabi tutulabilir. Buradaki amaç, her seferinde bir modelle küçük bir başlangıç yapmak ve çoğunlukla durum olan ancak davranış olmayan sınıfları geçişe dahil etmektir. Bu süreçte sık sık test yapmayı unutmayın.
Taşıma testleri
Dikkate alınması gereken bir diğer başlangıç yolu da mevcut testleri dönüştürmek ve Kotlin'de yeni testler yazmaya başlamaktır. Bu sayede ekibiniz, uygulamanızla birlikte göndermeyi planladığınız kodu yazmadan önce dille ilgili rahat bir şekilde çalışabilir.
Yardımcı yöntemleri uzantı işlevlerine taşıma
Tüm statik yardımcı program sınıfları (StringUtils, IntegerUtils, DateUtils, YourCustomTypeUtils vb.) Kotlin uzantı işlevleri olarak gösterilebilir ve mevcut Java kod tabanınız tarafından kullanılabilir.
Örneğin, birkaç yöntemi olan bir StringUtils sınıfınız olduğunu düşünelim:
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 de kullanılabilir. Örneğin:
...
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 kısa 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ış aşağıdakine benzer olabilir:
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ın uygulamanızın geri kalanıyla uyumlu olması için kaynak dosyanın en üstüne aşağıdaki örnekte gösterildiği gibi bir JvmName ek açıklaması ekleyin:
@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şlevlerin artık her dile uygun kurallarla Java veya Kotlin kullanılarak çağrılabileceğini unutmayın.
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şenleri ele almaya başlayabilirsiniz.
Dikkat edilmesi gereken noktalar
Java'nın kendine özgü bir stili olduğu gibi Kotlin'in de özlü olmasına katkıda bulunan deyimsel bir stili vardır. Ancak, ekibinizin ürettiği Kotlin kodunun başlangıçta değiştirdiği Java koduna daha çok benzediğini görebilirsiniz. Bu değer, ekibinizin Kotlin deneyimi arttıkça zaman içinde değişir. Başarının anahtarının kademeli değişim olduğunu unutmayın.
Kotlin kod tabanınız büyüdükçe tutarlılık sağlamak için yapabileceğiniz bazı işlemler:
Genel kodlama standartları
Kullanım sürecinizin başlarında standart bir kodlama kuralları grubu tanımladığınızdan emin olun. Android Kotlin stil kılavuzundan uygun yerlerde ayrılabilirsiniz.
Statik analiz araçları
Android lint ve diğer statik analiz araçlarını kullanarak ekibiniz için belirlenen kodlama standartlarını zorunlu kılın. Üçüncü taraf Kotlin linter'ı olan klint, Kotlin için ek kurallar da sağlar.
Sürekli entegrasyon
Yaygın kodlama standartlarına uyduğunuzdan ve Kotlin kodunuz için yeterli test kapsamı sağladığınızdan emin olun. Bu bölümü otomatik derleme sürecine dahil etmek, tutarlılığı ve bu standartlara uyumu sağlamaya yardımcı olabilir.
Birlikte çalışabilirlik
Kotlin, Java ile sorunsuz bir şekilde birlikte çalışır ancak aşağıdakilere dikkat edin.
Boş değer atanabilirliği
Kotlin, Kotlin tarafında null değer alabilme özelliğini tahmin etmek için derlenmiş koddaki null değer alabilme ek açıklamalarını kullanır. Açıklama eklenmezse Kotlin, null değer atanabilir veya null değer atanamaz tür olarak değerlendirilebilen bir platform türünü varsayılan olarak kullanır. Bu durum, dikkatli davranılmadığı takdirde çalışma zamanı NullPointerException sorunlarına yol açabilir.
Yeni Özellikleri Kullanmaya Başlama
Kotlin, şablon kodunu azaltmak için birçok yeni kitaplık ve söz dizimi kolaylığı sunar. Bu da geliştirme hızını artırmaya yardımcı olur. Ancak koleksiyon işlevleri, coroutines ve lambda'lar gibi Kotlin'in standart kitaplık işlevlerini kullanırken dikkatli ve yöntemli olun.
Yeni Kotlin geliştiricilerinin sıklıkla düştüğü bir tuzak vardır. Aşağıdaki Kotlin kodunu varsayın:
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 örnekteki amaç, nullableFoo boş değilse foo.baz() ve foo.zap()'yi yürütmektir. Böylece NullPointerException önlenir. Bu kod beklendiği gibi çalışsa da aşağıdaki örnekte gösterildiği gibi basit bir null kontrolü ve akıllı yayın ile karşılaştırıldığında okunması daha az kolaydır:
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. Bu davranış, kompozisyonu devralmaya tercih etmek için seçilmiş bir dil tasarım kararıdır. Kotlin, kompozisyonu basitleştirmek için yetki devri aracılığıyla davranış uygulamak üzere 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, son sınıfları ve yöntemleri taklit etmenize olanak tanıyan Mockito'nun Mock Maker Inline özelliğinin kullanımını etkinleştirebilirsiniz. Alternatif olarak, derleme sürecinin bir parçası olarak test etmek istediğiniz herhangi bir Kotlin sınıfını ve üyelerini açmak için All-Open derleyici eklentisini kullanabilirsiniz. Bu eklentiyi kullanmanın temel avantajı, hem birim testleriyle hem de enstrümanlı testlerle çalışmasıdır.
Daha fazla bilgi
Kotlin'i kullanma hakkında daha fazla bilgi için aşağıdaki bağlantıları inceleyin:
- Android'in Kotlin'i öncelikli olarak ele alma yaklaşımı
- Kotlin'i kullanmaya başlamanıza yardımcı olacak kaynaklar
- Kotlin öğrenen Java kullanıcıları için kaynaklar
- Java'dan Kotlin'e öğrenme rotası: Java programcılarının Kotlin'i öğrenmesine ve Kotlin'e özgü kodlar yazmasına yardımcı olan kaynak koleksiyonu.