বড় দলের জন্য কোটলিন গ্রহণ করুন

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

দল গড়ছেন

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

স্টাডি গ্রুপ গঠন করুন

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

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

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

একজন চ্যাম্পিয়ন মনোনীত করুন

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

ধীরে ধীরে সংহত করুন

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

তথ্য মডেল

আপনার ডেটা মডেলে সম্ভবত কয়েকটি পদ্ধতি সহ প্রচুর রাষ্ট্রীয় তথ্য রয়েছে। ডেটা মডেলে সাধারণ পদ্ধতিও থাকতে পারে যেমন 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);

...

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
}

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

কোটলিন

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

জাভা

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

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

একবার আপনার দল কোটলিনের সাথে স্বাচ্ছন্দ্য বোধ করলে এবং আপনি ছোট এলাকা স্থানান্তরিত হয়ে গেলে, আপনি বৃহত্তর উপাদান যেমন টুকরো, কার্যকলাপ, ViewModel অবজেক্ট এবং ব্যবসায়িক যুক্তির সাথে সম্পর্কিত অন্যান্য শ্রেণীগুলির মোকাবিলা করতে যেতে পারেন।

বিবেচনা

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

আপনার কোটলিন কোড বেস বৃদ্ধির সাথে সাথে ধারাবাহিকতা অর্জনের জন্য আপনি কিছু করতে পারেন:

সাধারণ কোডিং মান

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

স্ট্যাটিক বিশ্লেষণ সরঞ্জাম

অ্যান্ড্রয়েড লিন্ট এবং অন্যান্য স্ট্যাটিক অ্যানালাইসিস টুল ব্যবহার করে আপনার দলের জন্য সেট করা কোডিং মান প্রয়োগ করুন। klint , একটি তৃতীয় পক্ষের Kotlin linter, এছাড়াও Kotlin এর জন্য অতিরিক্ত নিয়ম প্রদান করে।

একটানা সমাকলান

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

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

কোটলিন বেশিরভাগ অংশে নির্বিঘ্নে জাভার সাথে ইন্টারঅপারেটিং করে, তবে নিম্নলিখিতটি নোট করুন।

শূন্যতা

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

নতুন বৈশিষ্ট্য গ্রহণ

বয়লারপ্লেট কমাতে কোটলিন প্রচুর নতুন লাইব্রেরি এবং সিনট্যাকটিক চিনি সরবরাহ করে, যা বিকাশের গতি বাড়াতে সাহায্য করে। এটি বলেছে, কোটলিনের স্ট্যান্ডার্ড লাইব্রেরি ফাংশন, যেমন কালেকশন ফাংশন , কোরোটিন এবং ল্যাম্বডাস ব্যবহার করার সময় সতর্কতা অবলম্বন করুন।

এখানে একটি খুব সাধারণ ফাঁদ যা নতুন Kotlin বিকাশকারীরা সম্মুখীন হয়। নিম্নলিখিত কোটলিন কোড অনুমান করুন:

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

এই উদাহরণের উদ্দেশ্য হল foo.baz() এবং foo.zap() চালানো যদি nullableFoo নাল না হয়, এইভাবে একটি 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 অন্তর্নির্মিত সমর্থন রয়েছে।

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

অধিক তথ্য

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