নতুন ভাষা শেখা কঠিন হতে পারে। আপনার টিমকে সাফল্যের পথে এগিয়ে নিয়ে যেতে, ধীরে ধীরে শুরু করুন, ছোট ছোট অংশে মাইগ্রেট করুন এবং ঘন ঘন পরীক্ষা করুন। 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 + '\'' +
'}';
}
}
আপনি জাভা ক্লাসকে 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 এক্সটেনশন ফাংশন ব্যবহার করে, আপনি Java কলকারীদের একই 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 এবং অন্যান্য স্ট্যাটিক বিশ্লেষণ টুল ব্যবহার করে আপনার টিমের জন্য সেট করা কোডিং স্ট্যান্ডার্ড প্রয়োগ করুন। ktlint, একটি থার্ড-পার্টি 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 এই পছন্দটি করে যাতে ইনহেরিটেন্সের চেয়ে কম্পোজিশনকে বেশি গুরুত্ব দেওয়া যায়। কম্পোজিশন সহজ করতে, Kotlin-এ প্রতিনিধিত্বের মাধ্যমে আচরণ প্রয়োগ করার জন্য বিল্ট-ইন সহায়তা আছে।
এই আচরণ মকিটো-এর মতো মকিং ফ্রেমওয়ার্কের জন্য সমস্যা তৈরি করে, যা টেস্টিংয়ের সময় আচরণ ওভাররাইড করার জন্য ইন্টারফেস ইমপ্লিমেন্টেশন বা ইনহেরিটেন্সের উপর নির্ভর করে। ইউনিট টেস্টের জন্য, আপনি Mockito-এর Mock Maker ইনলাইন ফিচার ব্যবহার করার সুবিধা চালু করতে পারেন, যা আপনাকে ফাইনাল ক্লাস ও মেথড মক করতে দেয়। বিকল্প হিসেবে, আপনি কম্পাইলেশন প্রসেসের অংশ হিসেবে পরীক্ষা করতে চান এমন যেকোনও Kotlin ক্লাস ও এর মেম্বারদের খুলতে All-Open কম্পাইলার প্লাগ-ইন ব্যবহার করতে পারেন। এই প্লাগ-ইন ব্যবহার করার প্রধান সুবিধা হল এটি ইউনিট ও ইন্সট্রুমেন্টেড, দুটি টেস্টের সাথেই কাজ করে।
আরও তথ্য
Kotlin ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য, নিম্নলিখিত লিঙ্কগুলি দেখুন:
- Android-এর Kotlin-ফার্স্ট অ্যাপ্রোচ
- Kotlin ব্যবহার শুরু করার জন্য রিসোর্স
- Java ব্যবহারকারীদের Kotlin শেখার জন্য রিসোর্স
- Java থেকে Kotlin শেখার পাথওয়ে, এমন রিসোর্সের সংগ্রহ যা Java প্রোগ্রামারদের ইডিওম্যাটিক Kotlin শিখতে ও লিখতে সাহায্য করে।