বড় টিমের জন্য Kotlin গ্রহণ করা

নতুন কোনও ভাষায় পরিবর্তন করা কঠিন কাজ হতে পারে। সাফল্যের রেসিপি হল ধীরে ধীরে শুরু করা, ছোট ছোট অংশে কাজ করা এবং আপনার টিমকে সাফল্যের জন্য প্রস্তুত করতে ঘন ঘন পরীক্ষা করা। Kotlin-এর মাধ্যমে মাইগ্রেট করা সহজ, কারণ এটি JVM বাইটকোডে কম্পাইল হয় এবং Java-এর সাথে সম্পূর্ণভাবে ইন্টারঅপারেবল।

টিম তৈরি করা

মাইগ্রেশন করার আগে প্রথম ধাপ হল আপনার টিমের জন্য একটি সাধারণ বেসলাইন বোঝা। আপনার টিমের শেখার প্রসেসকে দ্রুততর করতে সহায়ক হতে পারে এমন কয়েকটি পরামর্শ এখানে দেওয়া হল।

ফর্ম স্টাডি গ্রুপ

শেখা ও মনে রাখার জন্য স্টাডি গ্রুপ একটি কার্যকর উপায়। বিভিন্ন গবেষণায় দেখা গেছে গ্রুপে যা শিখেছেন তা আবৃত্তি করলে বিষয়টি আরও ভালভাবে মনে রাখতে সাহায্য করে। গ্রুপের প্রত্যেক সদস্যের জন্য Kotlin বই বা অন্যান্য পঠনপাঠনের সামগ্রী সংগ্রহ করুন এবং গ্রুপকে প্রতি সপ্তাহে দু'টি করে চ্যাপ্টার পড়তে বলুন। প্রতিটি মিটের সময়, গ্রুপকে যা শিখেছে তা তুলনা করতে হবে এবং কোনও প্রশ্ন বা পর্যবেক্ষণ থাকলে তা আলোচনা করতে হবে।

শিক্ষাদানের সংস্কৃতি গড়ে তোলা

যদিও সবাই নিজেকে শিক্ষক হিসেবে বিবেচনা করেন না, তবে সবাই শেখাতে পারেন। টেকনোলজি বা টিম লিড থেকে শুরু করে স্বতন্ত্র কন্ট্রিবিউটর পর্যন্ত, প্রত্যেকেই এমন একটি শেখার পরিবেশকে উৎসাহিত করতে পারেন যা সাফল্য নিশ্চিত করতে সাহায্য করতে পারে। এটি সহজ করার একটি উপায় হল, নির্দিষ্ট সময় অন্তর প্রেজেন্টেশনের আয়োজন করা যেখানে টিমের কোনও একজন সদস্য তার শেখা বা শেয়ার করতে চাওয়া কোনও বিষয় নিয়ে কথা বলবেন। আপনার টিম যতক্ষণ না ভাষাটি নিয়ে স্বচ্ছন্দ বোধ করছে, ততক্ষণ পর্যন্ত প্রতি সপ্তাহে একটি নতুন চ্যাপ্টার প্রেজেন্ট করার জন্য স্বেচ্ছাসেবকদের জিজ্ঞাসা করে আপনি স্টাডি গ্রুপকে কাজে লাগাতে পারেন।

একজন চ্যাম্পিয়ন বেছে নিন

সবশেষে, শেখার প্রচেষ্টার নেতৃত্ব দেওয়ার জন্য একজন চ্যাম্পিয়নকে মনোনীত করুন। আপনি অ্যাডপশন প্রসেস শুরু করলে, এই ব্যক্তি বিষয়ভিত্তিক বিশেষজ্ঞ (SME) হিসেবে কাজ করতে পারেন। Kotlin সম্পর্কিত আপনার সমস্ত প্র্যাক্টিস মিটিংয়ে এই ব্যক্তিকে অন্তর্ভুক্ত করা গুরুত্বপূর্ণ। আদর্শভাবে, এই ব্যক্তি আগে থেকেই Kotlin-এর প্রতি আগ্রহী এবং তার কিছু ব্যবহারিক জ্ঞান আছে।

ধীরে ধীরে ইন্টিগ্রেট করা

ধীরে ধীরে শুরু করা এবং আপনার ইকোসিস্টেমের কোন অংশ প্রথমে সরানো উচিত সেই সম্পর্কে কৌশলগতভাবে চিন্তা করা হল মূল বিষয়। আপনার সংস্থার মধ্যে কোনও ফ্ল্যাগশিপ অ্যাপের পরিবর্তে কোনও একটি অ্যাপে এটি আইসোলেট করা প্রায়শই ভাল। বেছে নেওয়া অ্যাপ মাইগ্রেট করার ক্ষেত্রে, প্রতিটি পরিস্থিতি আলাদা আলাদা হয়, তবে শুরু করার জন্য এখানে কয়েকটি সাধারণ জায়গা দেওয়া হল।

ডেটা মডেল

আপনার ডেটা মডেলে সম্ভবত অনেক স্টেট সংক্রান্ত তথ্য এবং কিছু মেথড থাকে। ডেটা মডেলে toString(), equals() ও hashcode()-এর মতো সাধারণ পদ্ধতিও থাকতে পারে। এইসব পদ্ধতি সাধারণত ট্রানজিট করা যায় এবং আইসোলেশনে সহজেই ইউনিট টেস্ট করা যায়।

যেমন, Java-র নিম্নলিখিত স্নিপেটটি দেখুন:

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 ক্লাসের পরিবর্তে Kotlin-এর একটি লাইন ব্যবহার করতে পারেন, যেমন এখানে দেখানো হয়েছে:

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

এই কোডটি আপনার বর্তমান টেস্ট স্যুটের সাথে ইউনিট টেস্ট করা যেতে পারে। এখানে মূল উদ্দেশ্য হল একবারে একটি মডেল নিয়ে ছোট করে শুরু করা এবং এমন ক্লাস ট্রানজিশন করা যা বেশিরভাগ ক্ষেত্রে স্টেট ও আচরণ নয়। মাঝে মাঝে পরীক্ষা করতে ভুলবেন না।

টেস্ট মাইগ্রেট করা

শুরু করার আরেকটি উপায় হল, আগে থেকে থাকা টেস্টগুলিকে কনভার্ট করা এবং Kotlin-এ নতুন টেস্ট লেখা শুরু করা। এর ফলে, আপনার অ্যাপের সাথে যে কোড শিপ করার পরিকল্পনা করেছেন, সেটি লেখার আগে আপনার টিম ভাষাটি সম্পর্কে স্বচ্ছন্দ বোধ করার জন্য সময় পেতে পারে।

এক্সটেনশন ফাংশনে ইউটিলিটি পদ্ধতি সরানো

যেকোনও স্ট্যাটিক ইউটিলিটি ক্লাস (StringUtils, IntegerUtils, DateUtils, YourCustomTypeUtils এবং আরও অনেক কিছু) Kotlin এক্সটেনশন ফাংশন হিসেবে দেখানো যেতে পারে এবং আপনার আগে থেকে থাকা Java কোডবেস ব্যবহার করতে পারে।

যেমন, ধরে নিন আপনার কাছে কিছু মেথড সহ একটি 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);

...

Kotlin এক্সটেনশন ফাংশন ব্যবহার করে, আপনি একই Utils ইন্টারফেস জাভা কলকারীদের প্রদান করতে পারবেন, একই সাথে আপনার ক্রমবর্ধমান Kotlin কোড বেসের জন্য আরও সংক্ষিপ্ত API অফার করতে পারবেন।

এটি করতে, আপনি IDE-এর দেওয়া অটোমেটিক কনভার্সন ব্যবহার করে এই Utils ক্লাসকে Kotlin-এ কনভার্ট করার মাধ্যমে শুরু করতে পারেন। আউটপুটের উদাহরণ নিচে দেওয়া হল:

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
}

মনে রাখবেন, এখন এই ফাংশনগুলিকে Java বা Kotlin ব্যবহার করে প্রতিটি ভাষার সাথে মানানসই কনভেনশন সহ কল করা যেতে পারে।

Kotlin

// ...

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

// ...

জাভা

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

মাইগ্রেশন সম্পূর্ণ করা

আপনার টিম Kotlin-এ অভ্যস্ত হয়ে গেলে এবং আপনি ছোট ছোট অংশ মাইগ্রেট করে নিলে, আপনি ফ্র্যাগমেন্ট, অ্যাক্টিভিটি, ViewModel অবজেক্ট এবং বিজনেস লজিকের সাথে সম্পর্কিত অন্যান্য ক্লাসের মতো বড় কম্পোনেন্ট মাইগ্রেট করতে পারেন।

বিবেচ্য বিষয়

Java-র যেমন একটি নির্দিষ্ট স্টাইল আছে, Kotlin-এরও নিজস্ব ইডিওম্যাটিক স্টাইল আছে যা এর সংক্ষিপ্ততাতে অবদান রাখে। তবে, আপনি হয়ত প্রথমে দেখবেন যে আপনার টিমের তৈরি করা Kotlin কোডটি সেই Java কোডের মতোই লাগছে যেটি এটি প্রতিস্থাপন করছে। আপনার টিমের Kotlin অভিজ্ঞতা বাড়ার সাথে সাথে এটি পরিবর্তিত হয়। মনে রাখবেন, ধীরে ধীরে পরিবর্তন করাই সাফল্যের মূল চাবিকাঠি।

আপনার Kotlin কোড বেস বৃদ্ধি পাওয়ার সাথে সাথে ধারাবাহিকতা বজায় রাখতে আপনি এগুলি করতে পারেন:

সাধারণ কোডিং স্ট্যান্ডার্ড

আপনার গ্রহণ করার প্রসেসের শুরুতে কোডিং কনভেনশনের একটি স্ট্যান্ডার্ড সেট নির্ধারণ করতে ভুলবেন না। যেখানে প্রয়োজন সেখানে আপনি Android Kotlin স্টাইল গাইড থেকে আলাদা হতে পারেন।

স্ট্যাটিক বিশ্লেষণ টুল

Android lint এবং অন্যান্য স্ট্যাটিক অ্যানালিসিস টুল ব্যবহার করে আপনার টিমের জন্য সেট করা কোডিং স্ট্যান্ডার্ড প্রয়োগ করুন। klint, একটি থার্ড-পার্টি Kotlin লিন্টার, Kotlin-এর জন্য অতিরিক্ত নিয়মও প্রদান করে।

কন্টিনিউয়াস ইন্টিগ্রেশন

সাধারণ কোডিং স্ট্যান্ডার্ড মেনে চলতে ভুলবেন না এবং আপনার Kotlin কোডের জন্য পর্যাপ্ত টেস্ট কভারেজ প্রদান করুন। অটোমেটেড বিল্ড প্রসেসের অংশ হিসেবে এটি করা হলে, এইসব স্ট্যান্ডার্ড মেনে চলা ও ধারাবাহিকতা বজায় রাখা নিশ্চিত করা যায়।

ইন্টারঅপারেবিলিটি

Kotlin বেশিরভাগ ক্ষেত্রে Java-এর সাথে নির্বিঘ্নে ইন্টারঅপারেট করে, তবে নিম্নলিখিত বিষয়গুলি মনে রাখবেন।

নালিবিলিটি

Kotlin-এর দিকে নালিবিলিটি অনুমান করার জন্য, Kotlin কম্পাইল করা কোডে নালিবিলিটি অ্যানোটেশনের উপর নির্ভর করে। অ্যানোটেশন প্রদান করা না হলে, Kotlin ডিফল্ট হিসেবে একটি প্ল্যাটফর্ম টাইপ ব্যবহার করে যা নাল হতে পারে বা নাল হতে পারে না। এটি রানটাইম NullPointerException সংক্রান্ত সমস্যার কারণ হতে পারে, তবে যদি এটি সাবধানে না করা হয়।

নতুন ফিচার ব্যবহার করা

Kotlin অনেক নতুন লাইব্রেরি এবং বয়লারপ্লেট কমানোর জন্য সিনট্যাক্টিক সুগার প্রদান করে, যা ডেভেলপমেন্টের গতি বাড়াতে সাহায্য করে। তবে, Kotlin-এর স্ট্যান্ডার্ড লাইব্রেরি ফাংশন, যেমন কালেকশন ফাংশন, করুটিন ও ল্যাম্বডা ব্যবহার করার সময় সতর্ক ও পদ্ধতিগতভাবে কাজ করুন।

নতুন Kotlin ডেভেলপাররা প্রায়শই এই ফাঁদে পড়েন। নিম্নলিখিত Kotlin কোডটি ধরে নিন:

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 নাল না হলে foo.baz() ও foo.zap() এক্সিকিউট করা, এর ফলে NullPointerException এড়ানো যায়। এই কোডটি প্রত্যাশা অনুযায়ী কাজ করলেও, এটি একটি সাধারণ নাল চেক ও স্মার্ট কাস্টের তুলনায় কম ইনটুইটিভ, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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
}

পরীক্ষা করা

Kotlin-এ ক্লাস ও তার ফাংশন ডিফল্ট হিসেবে এক্সটেনশনের জন্য বন্ধ থাকে। আপনি যে ক্লাস ও ফাংশন সাবক্লাস করতে চান, সেগুলি আপনাকে অবশ্যই স্পষ্টভাবে খুলতে হবে। এই আচরণ হল একটি ভাষা ডিজাইন সংক্রান্ত সিদ্ধান্ত যা ইনহেরিটেন্সের পরিবর্তে কম্পোজিশনকে প্রচার করার জন্য বেছে নেওয়া হয়েছে। কম্পোজিশন সহজ করতে, Kotlin-এ প্রতিনিধিত্বের মাধ্যমে আচরণ প্রয়োগ করার জন্য বিল্ট-ইন সহায়তা আছে।

এই আচরণ মকিটো-এর মতো মকিং ফ্রেমওয়ার্কের জন্য সমস্যা তৈরি করে, যা টেস্টিংয়ের সময় আচরণ ওভাররাইড করার জন্য ইন্টারফেস ইমপ্লিমেন্টেশন বা ইনহেরিটেন্সের উপর নির্ভর করে। ইউনিট টেস্টের জন্য, আপনি Mockito-এর Mock Maker Inline ফিচার ব্যবহার করার সুবিধা চালু করতে পারেন, যা আপনাকে ফাইনাল ক্লাস ও মেথড মক করতে দেয়। বিকল্প হিসেবে, আপনি কম্পাইলেশন প্রসেসের অংশ হিসেবে পরীক্ষা করতে চান এমন যেকোনও Kotlin ক্লাস ও তার মেম্বারদের খুলতে All-Open কম্পাইলার প্লাগ-ইন ব্যবহার করতে পারেন। এই প্লাগ-ইন ব্যবহার করার প্রধান সুবিধা হল এটি ইউনিট ও ইন্সট্রুমেন্টেড, দুটি টেস্টের সাথেই কাজ করে।

আরও তথ্য

Kotlin ব্যবহার করা সম্পর্কে আরও তথ্য পেতে, নিম্নলিখিত লিঙ্কগুলি দেখুন: