Büyük ekipler için Kotlin'i kullanın

Yeni bir dile geçmek göz korkutucu bir iş olabilir. Başarının formülü, yavaş yavaş başlamak, parçalar halinde hareket etmek ve ekibinizi başarıya ulaştırmak için sık sık test yapmaktır. Kotlin, JVM bayt koduna derlendiği ve Java ile tamamen birlikte çalışabildiği için taşımayı kolaylaştırır.

Ekip oluşturma

Taşıma 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 faydalanabileceğiniz birkaç ipucunu burada bulabilirsiniz.

Form çalışma grupları

Çalışma grupları, öğrenmeyi ve elde tutmayı kolaylaştırmanın etkili bir yoludur. Araştırmalar, öğrendiklerinizi bir grup ortamında anlatmanın materyalin pekiştirilmesine yardımcı olduğunu gösteriyor. Grubun her üyesi için bir Kotlin kitabı veya başka çalışma materyalleri alın ve gruptan her hafta birkaç bölümden geçmelerini isteyin. Her toplantıda grup öğrendiklerini karşılaştırmalı ve varsa soruları veya gözlemleri tartışmalıdır.

Eğitim kültürü oluşturun

Herkes kendini öğretmen olarak görmese de herkes öğretebilir. Bir teknoloji veya ekip liderinden bireysel bir katılımcıya kadar, herkes başarıya ulaşmasına yardımcı olabilecek bir öğrenme ortamını teşvik edebilir. Bunu kolaylaştırmanın bir yolu da düzenli sunumlarda ekipten bir kişinin öğrendiği veya paylaşmak istediği bir şey hakkında konuşmaktır. Çalışma grubunuzdan faydalanarak ekibinizi bu dili rahat hissettiği bir noktaya ulaşana kadar gönüllülerden her hafta yeni bir bölüm sunmalarını isteyerek kullanabilirsiniz.

Şampiyonu belirleyin

Son olarak, öğrenme çalışmalarını yönetecek bir şampiyon belirleyin. Benimseme sürecini başlattığınızda bu kişi bir konu uzmanı (SME) olarak görev alabilir. Bu kişiyi Kotlin ile ilgili tüm pratik toplantılarınıza dahil etmek önemlidir. İdeal olarak, bu kişi zaten Kotlin konusunda tutkuludur ve işle ilgili biraz bilgi sahibidir.

Yavaş yavaş entegre edin

Yavaş yavaş başlamak ve ekosistemin hangi kısımlarının önce taşınacağı konusunda stratejik bir şekilde düşünmek çok önemlidir. Genellikle bunu ana uygulama yerine kuruluşunuzdaki tek bir uygulama için ayırmak en iyi seçenektir. Seçilen uygulamayı taşıma konusunda her durum birbirinden farklıdır. Ancak burada, işe koyulup başlamanız gereken birkaç yaygın noktayı aşağıda bulabilirsiniz.

Veri modeli

Veri modeliniz muhtemelen birkaç yöntemin yanı sıra çok sayıda durum bilgisi içerir. Veri modelinde toString(), equals() ve hashcode() gibi yaygın yöntemler de olabilir. Bu yöntemlerin geçişi genellikle yapılabilir ve birim tek tek kolayca test edilebilir.

Örneğin, aşağıdaki Java snippet'ini varsayalı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 + '\'' +
               '}';
   }
}

Burada gösterildiği gibi, Java sınıfını 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 göre birim testine tabi tutulabilir. Buradaki amaç, aynı anda tek bir modelle küçük adımlarla başlamak ve davranış değil, çoğunlukla durum olan geçiş sınıflarıdır. Yol boyunca sık sık test etmeyi unutmayın.

Testleri taşı

Göz önünde bulundurulması gereken bir başka başlangıç yolu da mevcut testleri dönüştürmek ve Kotlin'de yeni testler yazmaya başlamaktır. Bu sayede, uygulamanızla birlikte göndermeyi planladığınız kodu yazmadan önce ekibinize rahatça konuşabilmeleri için zaman tanıyabilirsiniz.

Yardımcı program yöntemlerini uzantı işlevlerine taşıma

Statik yardımcı program sınıfları (StringUtils, IntegerUtils, DateUtils, YourCustomTypeUtils vb.) Kotlin uzantı işlevleri olarak temsil edilebilir 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üşünün:

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
   }

}

Daha sonra bu yöntemler, aşağıdaki örnekte gösterildiği gibi uygulamanızın başka bir bölümünde kullanılabilir:

...

String myString = ...
String fooString = StringUtils.foo(myString);

...

Kotlin uzantı işlevlerini kullanarak Java çağrılarına aynı Utils arayüzünü sağlarken aynı zamanda büyüyen Kotlin kod tabanınız için daha kısa ve öz bir API sunabilirsiniz.

Bunu yapmak için, IDE tarafından sağlanan otomatik dönüştürmeyi kullanıp bu Utils sınıfını Kotlin'e dönüştürerek başlayabilirsiniz. Örnek çıkış aşağıdaki gibi 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 bunu, aşağıdaki örnekte gösterildiği gibi işlevin içindeki türe referans vermek için 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ı aşağıdaki örnekte gösterildiği gibi uygulamanızın geri kalanıyla uyumlu hale getirmek için kaynak dosyanın üst kısmına bir JvmName ek açıklaması ekleyin:

@file:JvmName("StringUtils")
package com.java.project
...

Nihai sürüm aşağıdakine benzer olacaktır:

@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 dille eşleşen kurallarla Java veya Kotlin kullanılarak çağrılabileceğini unutmayın.

Kotlin

...
val myString: String = ...
val fooString = myString.foo()
...

Java

...
String myString = ...
String fooString = StringUtils.foo(myString);
...

Taşıma işlemini tamamlama

Ekibiniz Kotlin'i kullanmaya alıştıktan ve daha küçük alanları taşıdıktan sonra parçalar, etkinlikler, ViewModel nesneleri ve iş mantığıyla ilgili diğer sınıflar gibi daha büyük bileşenleri ele almaya geçebilirsiniz.

Dikkat edilmesi gereken noktalar

Java’nın kendine özgü bir tarzı olduğu gibi, Kotlin de kısa ve öz bir deyimsel tarzı vardır. Ancak başlangıçta ekibinizin oluşturduğu Kotlin kodunun, yerini alacak olan Java koduna daha çok benzediğini fark edebilirsiniz. Ekibinizin Kotlin deneyimi büyüdükçe bu durum da zamanla değişir. Unutmayın, kademeli değişim başarının anahtarıdır.

Kotlin kod tabanınız büyürken tutarlılık sağlamak için yapabileceğiniz birkaç şey:

Ortak kodlama standartları

Benimseme sürecinizin başlarında standart bir kodlama kuralları kümesi tanımladığınızdan emin olun. Android Kotlin stil kılavuzundan anlamlı olanları inceleyebilirsiniz.

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 bir Kotlin linter aracı olan klint, Kotlin için ek kurallar da sağlar.

Sürekli entegrasyon

Ortak kodlama standartlarına uyduğunuzdan ve Kotlin kodunuz için yeterli test kapsamı sağladığınızdan emin olun. Bunun otomatik bir derleme işleminin parçası olması, tutarlılığın ve bu standartlara bağlılığın sağlanmasına yardımcı olabilir.

Birlikte çalışabilirlik

Kotlin, çoğunlukla Java ile sorunsuz bir şekilde birlikte çalışır, ancak aşağıdakilere dikkat edin.

Boş değer atanabilirliği

Kotlin, Kotlin tarafında null olabilirliği tahmin etmek için derlenmiş kodda null değer ek açıklamalarını kullanır. Ek açıklamalar sağlanmazsa Kotlin varsayılan olarak bir platform türünü kullanır. Bu da null veya null yapılamayan tür olarak değerlendirilebilir. Ancak, dikkatli bir şekilde ele alınmadığı takdirde bu durum çalışma zamanı NullPointerException sorunlarına yol açabilir.

Yeni Özelliklerden Yararlanın

Kotlin, geliştirme hızını artırmak için birçok yeni kitaplık ve sözdizimsel şeker sağlayarak ortak platformu azaltmaya yardımcı oluyor. Bununla birlikte, Kotlin'in toplama işlevleri, eş yordamlar ve lambda'lar gibi standart kitaplık işlevlerini kullanırken dikkatli ve metodolojik olun.

Yeni Kotlin geliştiricilerinin en sık karşılaştığı tuzakları burada bulabilirsiniz. Aşağıdaki Kotlin kodunu ele alalım:

val nullableFoo: 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 null değilse foo.baz() ve foo.zap() politikalarını çalıştırmak ve bu sayede NullPointerException kullanmaktan kaçınmaktır. Bu kod beklendiği gibi çalışsa da, aşağıdaki örnekte gösterildiği gibi kullanımı basit bir null kontrol ve smart cast'e göre daha az sezgiseldir:

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 uzatmaya kapalıdır. Alt sınıflandırmak istediğiniz sınıf ve işlevleri açıkça açmanız gerekir. Bu davranış, devralmaya kıyasla kompozisyonu teşvik etmek için seçilen bir dil tasarımı kararıdır. Kotlin, kompozisyonu basitleştirmeye yardımcı olması amacıyla, yetki aracılığıyla davranışı uygulamak için yerleşik desteğe sahiptir.

Bu davranış, test sırasında davranışları geçersiz kılmak için arayüz uygulaması veya devralma kullanan Mockito gibi aldatma çerçeveler için bir sorun oluşturur. Birim testlerinde, Mockito'nun son sınıflarla ve yöntemlerle ilgili alıştırma yapmanıza olanak tanıyan Örnek Oluşturucu özelliğinin kullanımını etkinleştirebilirsiniz. Alternatif olarak, derleme işleminin bir parçası olarak test etmek istediğiniz Kotlin sınıfını ve üyelerini açmak için All-Open derleyici eklentisini kullanabilirsiniz. Bu eklentiyi kullanmanın birincil avantajı, hem birim hem de araçlı testlerle çalışmasıdır.

Daha fazla bilgi

Kotlin kullanımıyla ilgili daha fazla bilgi için aşağıdaki bağlantılara göz atın: