کاتلین را برای تیم های بزرگ بپذیرید

مهاجرت به هر زبان جدیدی می‌تواند یک کار دلهره‌آور باشد. دستورالعمل موفقیت این است که آهسته شروع کنید، به صورت تکه تکه پیش بروید و مرتباً آزمایش کنید تا تیم خود را برای موفقیت هماهنگ کنید. کاتلین مهاجرت را آسان می‌کند، زیرا به بایت‌کد JVM کامپایل می‌شود و کاملاً با جاوا سازگار است.

ساختن تیم

اولین قدم قبل از مهاجرت، ایجاد یک درک پایه مشترک برای تیم شماست. در اینجا چند نکته وجود دارد که ممکن است برای تسریع یادگیری تیمتان مفید باشد.

تشکیل گروه‌های مطالعاتی

گروه‌های مطالعه روشی مؤثر برای تسهیل یادگیری و حفظ مطالب هستند. مطالعات نشان می‌دهد که مرور مطالب آموخته شده در یک محیط گروهی به تقویت مطالب کمک می‌کند. برای هر یک از اعضای گروه یک کتاب کاتلین یا مطالب مطالعاتی دیگر تهیه کنید و از گروه بخواهید که هر هفته چند فصل را مرور کنند. در طول هر جلسه، گروه باید آموخته‌های خود را مقایسه کند و در مورد هرگونه سوال یا مشاهده‌ای بحث کند.

فرهنگ تدریس را بسازید

اگرچه همه خود را معلم نمی‌دانند، اما همه می‌توانند تدریس کنند. از یک سرپرست فناوری یا تیم گرفته تا یک مشارکت‌کننده‌ی فردی، همه می‌توانند محیط یادگیری را تشویق کنند که می‌تواند به تضمین موفقیت کمک کند. یکی از راه‌های تسهیل این امر، برگزاری ارائه‌های دوره‌ای است که در آن یک نفر از اعضای تیم تعیین می‌شود تا در مورد چیزی که آموخته‌اند یا می‌خواهند به اشتراک بگذارند صحبت کند. می‌توانید با درخواست از داوطلبان برای ارائه یک فصل جدید در هر هفته، از گروه مطالعه خود بهره ببرید تا زمانی که به نقطه‌ای برسید که تیم شما با زبان احساس راحتی کند.

یک قهرمان تعیین کنید

در نهایت، یک نفر را به عنوان مسئول رهبری یک تلاش آموزشی تعیین کنید. این شخص می‌تواند به عنوان یک متخصص موضوعی (SME) در شروع فرآیند پذیرش شما عمل کند. مهم است که این شخص را در تمام جلسات تمرینی مربوط به کاتلین شرکت دهید. در حالت ایده‌آل، این شخص از قبل به کاتلین علاقه‌مند است و دانش عملی در این زمینه دارد.

به آرامی ادغام کنید

شروع آرام و تفکر استراتژیک در مورد اینکه کدام بخش‌های اکوسیستم شما ابتدا باید منتقل شوند، کلیدی است. اغلب بهتر است این کار را به یک برنامه واحد در سازمان خود محدود کنید تا یک برنامه شاخص. از نظر مهاجرت برنامه انتخاب شده، هر موقعیت متفاوت است، اما در اینجا چند نقطه مشترک برای شروع آورده شده است.

مدل داده

مدل داده شما احتمالاً شامل اطلاعات وضعیت زیادی به همراه چند متد است. مدل داده همچنین ممکن است متدهای رایجی مانند toString() ، equals() و hashcode() داشته باشد. این متدها معمولاً می‌توانند به راحتی و به صورت جداگانه منتقل و تست واحد شوند.

برای مثال، قطعه کد جاوای زیر را فرض کنید:

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 + '\'' +
               '}';
   }
}

می‌توانید کلاس جاوا را با یک خط کد کاتلین جایگزین کنید، همانطور که در اینجا نشان داده شده است:

data class Person(var firstName: String?, var lastName: String?)

سپس می‌توان این کد را در برابر مجموعه تست فعلی شما، تست واحد کرد. ایده این است که با یک مدل در هر زمان و کلاس‌های انتقالی که عمدتاً حالت هستند و نه رفتار، شروع کنید. حتماً در طول مسیر، مرتباً تست کنید.

مهاجرت تست‌ها

یک مسیر شروع دیگر که می‌توانید در نظر بگیرید، تبدیل تست‌های موجود و شروع به نوشتن تست‌های جدید در کاتلین است. این می‌تواند به تیم شما زمان بدهد تا قبل از نوشتن کدی که قصد دارید با برنامه خود ارائه دهید، با زبان کاتلین احساس راحتی کنند.

انتقال متدهای کاربردی به توابع افزونه

هر کلاس کاربردی استاتیک ( StringUtils ، IntegerUtils ، DateUtils ، YourCustomTypeUtils و غیره) می‌تواند به عنوان توابع افزونه کاتلین نمایش داده شود و توسط کدبیس جاوای موجود شما مورد استفاده قرار گیرد.

برای مثال، فرض کنید یک کلاس StringUtils با چند متد دارید:

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
   }

}

این متدها ممکن است در جاهای دیگر برنامه شما استفاده شوند، همانطور که در مثال زیر نشان داده شده است:

...

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

...

با استفاده از توابع افزونه کاتلین، می‌توانید همان رابط کاربری Utils را برای فراخوانی‌کنندگان جاوا فراهم کنید و در عین حال یک API مختصرتر برای پایگاه کد کاتلین در حال رشد خود ارائه دهید.

برای انجام این کار، می‌توانید با تبدیل این کلاس Utils به Kotlin با استفاده از تبدیل خودکار ارائه شده توسط IDE شروع کنید. خروجی مثال ممکن است مشابه زیر باشد:

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
   }

}

در مرحله بعد، تعریف کلاس یا شیء را حذف کنید، پیش از نام هر تابع، نوعی را که این تابع باید روی آن اعمال شود، قرار دهید و از این برای ارجاع به نوع درون تابع استفاده کنید، همانطور که در مثال زیر نشان داده شده است:

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
}

در نهایت، یک حاشیه‌نویسی JvmName به بالای فایل منبع اضافه کنید تا نام کامپایل‌شده با بقیه‌ی برنامه‌تان سازگار باشد، همانطور که در مثال زیر نشان داده شده است:

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

نسخه نهایی باید مشابه تصویر زیر باشد:

@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
}

توجه داشته باشید که اکنون می‌توان این توابع را با استفاده از جاوا یا کاتلین با قراردادهایی که با هر زبان مطابقت دارند، فراخوانی کرد.

کاتلین

// ...

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

// ...

جاوا

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

تکمیل مهاجرت

وقتی تیم شما با کاتلین راحت شد و بخش‌های کوچک‌تر را منتقل کردید، می‌توانید به سراغ کامپوننت‌های بزرگ‌تر مانند فرگمنت‌ها، اکتیویتی‌ها، اشیاء ViewModel و سایر کلاس‌هایی که مربوط به منطق کسب‌وکار هستند، بروید.

ملاحظات

همانطور که جاوا سبک خاصی دارد، کاتلین هم سبک خاص خود را دارد که به مختصر بودن آن کمک می‌کند. با این حال، ممکن است در ابتدا متوجه شوید که کد کاتلینی که تیم شما تولید می‌کند بیشتر شبیه کد جاوایی است که جایگزین آن می‌شود. این موضوع با گذشت زمان و افزایش تجربه کاتلین تیم شما تغییر می‌کند. به یاد داشته باشید، تغییر تدریجی کلید موفقیت است.

در اینجا چند نکته وجود دارد که می‌توانید برای دستیابی به ثبات در حین رشد پایگاه کد کاتلین خود انجام دهید:

استانداردهای رایج کدنویسی

حتماً در مراحل اولیه‌ی فرآیند پذیرش، مجموعه‌ای استاندارد از قراردادهای کدنویسی را تعریف کنید. در صورت لزوم، می‌توانید از راهنمای سبک کاتلین اندروید فاصله بگیرید.

ابزارهای تحلیل استاتیک

با استفاده از Android lint و سایر ابزارهای تحلیل استاتیک، استانداردهای کدنویسی تعیین‌شده برای تیم خود را اجرا کنید. klint ، یک linter کاتلین شخص ثالث، همچنین قوانین اضافی برای کاتلین ارائه می‌دهد.

ادغام مداوم

مطمئن شوید که با استانداردهای رایج کدنویسی مطابقت دارید و پوشش تست کافی برای کد کاتلین خود فراهم می‌کنید. قرار دادن این بخش از فرآیند ساخت خودکار می‌تواند به تضمین ثبات و پایبندی به این استانداردها کمک کند.

قابلیت همکاری

کاتلین در بیشتر موارد به طور یکپارچه با جاوا تعامل دارد، اما به نکات زیر توجه کنید.

قابلیت ابطال

کاتلین برای استنباط nullability در سمت کاتلین، به حاشیه‌نویسی‌های nullability در کد کامپایل‌شده متکی است. اگر حاشیه‌نویسی‌ها ارائه نشوند، کاتلین به‌طور پیش‌فرض از یک نوع پلتفرم استفاده می‌کند که می‌تواند به‌عنوان نوع nullable یا non-nullable در نظر گرفته شود. با این حال، اگر با دقت مورد توجه قرار نگیرد، می‌تواند منجر به مشکلات NullPointerException در زمان اجرا شود.

ویژگی‌های جدید را اتخاذ کنید

کاتلین کتابخانه‌های جدید و سینتکس‌های زیادی را برای کاهش کدهای تکراری ارائه می‌دهد که به افزایش سرعت توسعه کمک می‌کند. با این حال، هنگام استفاده از توابع کتابخانه‌ای استاندارد کاتلین، مانند توابع مجموعه ، کوروتین‌ها و لامبداها ، محتاط و روشمند باشید.

این یک تله بسیار رایج است که توسعه‌دهندگان تازه‌کار کاتلین با آن مواجه می‌شوند. کد کاتلین زیر را فرض کنید:

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()
}

هدف در این مثال این است که اگر nullableFoo برابر با null نباشد، foo.baz() و foo.zap() اجرا شوند و از این طریق از NullPointerException جلوگیری شود. اگرچه این کد همانطور که انتظار می‌رود کار می‌کند، اما خواندن آن نسبت به یک بررسی ساده‌ی null و تبدیل هوشمند ، همانطور که در مثال زیر نشان داده شده است، دشوارتر است:

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
}

آزمایش

کلاس‌ها و توابع آنها به طور پیش‌فرض در کاتلین برای توسعه بسته هستند. شما باید کلاس‌ها و توابعی را که می‌خواهید زیرکلاس کنید، صریحاً باز کنید. این رفتار یک تصمیم طراحی زبان است که برای ارتقای ترکیب به ارث‌بری انتخاب شده است. کاتلین پشتیبانی داخلی برای پیاده‌سازی رفتار از طریق واگذاری اختیار (delegation) دارد تا به ساده‌سازی ترکیب کمک کند.

این رفتار برای چارچوب‌های شبیه‌سازی (mockito) مانند Mockito که برای لغو رفتارها در طول آزمایش به پیاده‌سازی رابط یا وراثت متکی هستند، مشکل ایجاد می‌کند. برای تست‌های واحد، می‌توانید استفاده از ویژگی Mock Maker Inline در Mockito را فعال کنید که به شما امکان می‌دهد کلاس‌ها و متدهای نهایی را شبیه‌سازی کنید. از طرف دیگر، می‌توانید از افزونه کامپایلر All-Open برای باز کردن هر کلاس Kotlin و اعضای آن که می‌خواهید به عنوان بخشی از فرآیند کامپایل آزمایش کنید، استفاده کنید. مزیت اصلی استفاده از این افزونه این است که با هر دو تست واحد و ابزار دقیق کار می‌کند.

اطلاعات بیشتر

برای اطلاعات بیشتر در مورد استفاده از کاتلین، به لینک‌های زیر مراجعه کنید: