প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প 5.1: এক্সটেনশন

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

ভূমিকা

এই কোডল্যাবে আপনাকে পেয়ার, সংগ্রহ এবং এক্সটেনশন ফাংশন সহ কোটলিনের বিভিন্ন দরকারী বৈশিষ্ট্যের সাথে পরিচিত করা হয়েছে।

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

আপনি ইতিমধ্যে কি জানা উচিত

  • কোটলিন ফাংশন, ক্লাস এবং পদ্ধতির সিনট্যাক্স
  • ইন্টেলিজে আইডিইএ-তে কোটলিনের আরইপিএল (রিড-ইভাল-প্রিন্ট লুপ) এর সাথে কীভাবে কাজ করবেন
  • কিভাবে IntelliJ IDEA এ একটি নতুন ক্লাস তৈরি করবেন এবং একটি প্রোগ্রাম চালাবেন

আপনি কি শিখবেন

  • জোড়া এবং ট্রিপল নিয়ে কিভাবে কাজ করবেন
  • সংগ্রহ সম্পর্কে আরো
  • সংজ্ঞায়িত এবং ধ্রুবক ব্যবহার
  • এক্সটেনশন ফাংশন লেখা

আপনি কি করবেন

  • REPL এ জোড়া, ট্রিপল এবং হ্যাশ ম্যাপ সম্পর্কে জানুন
  • ধ্রুবক সংগঠিত করার বিভিন্ন উপায় শিখুন
  • একটি এক্সটেনশন ফাংশন এবং একটি এক্সটেনশন বৈশিষ্ট্য লিখুন

এই টাস্কে, আপনি জোড়া এবং ট্রিপল এবং তাদের ধ্বংস করার বিষয়ে শিখবেন। পেয়ার এবং ট্রিপল হল 2 বা 3টি জেনেরিক আইটেমের জন্য প্রিমেড ডেটা ক্লাস। এটি, উদাহরণস্বরূপ, একটি ফাংশন একাধিক মান প্রদানের জন্য দরকারী হতে পারে।

ধরুন আপনার কাছে মাছের একটি List আছে, এবং একটি ফাংশন isFreshWater() মাছটি স্বাদুপানির বা লোনা জলের মাছ কিনা তা পরীক্ষা করার জন্য। List.partition() দুটি তালিকা প্রদান করে, একটি আইটেম সহ যেখানে শর্ত true , এবং অন্যটি আইটেমগুলির জন্য যেখানে শর্ত false

val twoLists = fish.partition { isFreshWater(it) }
println("freshwater: ${twoLists.first}")
println("saltwater: ${twoLists.second}")

ধাপ 1: কিছু জোড়া এবং ট্রিপল তৈরি করুন

  1. REPL খুলুন ( টুলস > কোটলিন > কোটলিন REPL )।
  2. একটি জোড়া তৈরি করুন, এটি কিসের জন্য ব্যবহৃত হয় তার সাথে সরঞ্জামের একটি অংশ যুক্ত করে, তারপর মানগুলি মুদ্রণ করুন। আপনি দুটি মানকে সংযুক্ত করে একটি অভিব্যক্তি তৈরি করে একটি জোড়া তৈরি করতে পারেন, যেমন দুটি স্ট্রিং, to সাথে কীওয়ার্ড, তারপর প্রতিটি মান উল্লেখ করতে .first বা .second ব্যবহার করে।
val equipment = "fish net" to "catching fish"
println("${equipment.first} used for ${equipment.second}")
⇒ fish net used for catching fish
  1. একটি ট্রিপল তৈরি করুন এবং toString() দিয়ে এটি মুদ্রণ করুন, তারপর toList() দিয়ে একটি তালিকায় রূপান্তর করুন। আপনি 3টি মান সহ Triple() ব্যবহার করে একটি ট্রিপল তৈরি করুন। প্রতিটি মান উল্লেখ করতে .first , .second এবং .third ব্যবহার করুন৷
val numbers = Triple(6, 9, 42)
println(numbers.toString())
println(numbers.toList())
⇒ (6, 9, 42)
[6, 9, 42]

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

  1. একটি জোড়া তৈরি করুন যেখানে জোড়ার প্রথম অংশটি নিজেই একটি জোড়া।
val equipment2 = ("fish net" to "catching fish") to "equipment"
println("${equipment2.first} is ${equipment2.second}\n")
println("${equipment2.first.second}")
⇒ (fish net, catching fish) is equipment
⇒ catching fish

ধাপ 2: কিছু জোড়া এবং ট্রিপল ধ্বংস করুন

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

  1. একটি জোড়া ধ্বংস করুন এবং মান মুদ্রণ করুন।
val equipment = "fish net" to "catching fish"
val (tool, use) = equipment
println("$tool is used for $use")
⇒ fish net is used for catching fish
  1. একটি ট্রিপল ধ্বংস করুন এবং মান মুদ্রণ করুন।
val numbers = Triple(6, 9, 42)
val (n1, n2, n3) = numbers
println("$n1 $n2 $n3")
⇒ 6 9 42

মনে রাখবেন যে জোড়া এবং ট্রিপল ধ্বংস করা ডেটা ক্লাসের মতোই কাজ করে, যা পূর্ববর্তী কোডল্যাবে আচ্ছাদিত ছিল।

এই টাস্কে আপনি তালিকা সহ সংগ্রহগুলি এবং একটি নতুন সংগ্রহের ধরন, হ্যাশ মানচিত্র সম্পর্কে আরও জানুন।

ধাপ 1: তালিকা সম্পর্কে আরও জানুন

  1. তালিকা এবং পরিবর্তনযোগ্য তালিকা পূর্ববর্তী পাঠে চালু করা হয়েছিল। এগুলি একটি খুব দরকারী ডেটা কাঠামো, তাই কোটলিন তালিকার জন্য বেশ কয়েকটি অন্তর্নির্মিত ফাংশন সরবরাহ করে। তালিকার জন্য ফাংশনের এই আংশিক তালিকাটি পর্যালোচনা করুন। আপনি List এবং MutableList জন্য Kotlin ডকুমেন্টেশনে সম্পূর্ণ তালিকা খুঁজে পেতে পারেন।

ফাংশন

উদ্দেশ্য

add(element: E)

পরিবর্তনযোগ্য তালিকায় একটি আইটেম যোগ করুন।

remove(element: E)

একটি পরিবর্তনযোগ্য তালিকা থেকে একটি আইটেম সরান.

reversed()

বিপরীত ক্রমে উপাদান সহ তালিকার একটি অনুলিপি ফেরত দিন।

contains(element: E)

যদি তালিকায় আইটেমটি থাকে তবে true প্রত্যাবর্তন করুন।

subList(fromIndex: Int, toIndex: Int)

তালিকার অংশ ফেরত দিন, প্রথম সূচী থেকে শুরু করে দ্বিতীয় সূচকটি অন্তর্ভুক্ত নয়।

  1. এখনও REPL-এ কাজ করছেন, নম্বরগুলির একটি তালিকা তৈরি করুন এবং এতে কল sum() করুন। এই সমস্ত উপাদান যোগফল.
val list = listOf(1, 5, 3, 4)
println(list.sum())
⇒ 13
  1. স্ট্রিংগুলির একটি তালিকা তৈরি করুন এবং তালিকাটি যোগ করুন।
val list2 = listOf("a", "bbb", "cc")
println(list2.sum())
⇒ error: none of the following functions can be called with the arguments supplied:
  1. যদি উপাদানটি এমন কিছু না হয় যে List সরাসরি কীভাবে যোগফল করতে জানে, যেমন একটি স্ট্রিং, আপনি একটি ল্যাম্বডা ফাংশন সহ .sumBy() ব্যবহার করে এটিকে কীভাবে যোগ করতে হবে তা নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ, প্রতিটি স্ট্রিংয়ের দৈর্ঘ্য দ্বারা যোগফল। একটি ল্যাম্বডা আর্গুমেন্টের ডিফল্ট নাম it এবং এখানে it তালিকার প্রতিটি উপাদানকে নির্দেশ করে কারণ তালিকাটি অতিক্রম করা হয়।
val list2 = listOf("a", "bbb", "cc")
println(list2.sumBy { it.length })
⇒ 6
  1. তালিকা দিয়ে আপনি আরও অনেক কিছু করতে পারেন। উপলব্ধ কার্যকারিতা দেখার একটি উপায় হল IntelliJ IDEA-তে একটি তালিকা তৈরি করা, ডট যোগ করা এবং তারপর টুলটিপে স্বয়ংক্রিয়-সম্পূর্ণতা তালিকাটি দেখুন। এটি যেকোনো বস্তুর জন্য কাজ করে। একটি তালিকা দিয়ে এটি চেষ্টা করুন.

  1. তালিকা থেকে listIterator() চয়ন করুন, তারপর for দিয়ে একটি তালিকা দিয়ে যান এবং স্পেস দ্বারা পৃথক করা সমস্ত উপাদান মুদ্রণ করুন।
val list2 = listOf("a", "bbb", "cc")
for (s in list2.listIterator()) {
    println("$s ")
}
⇒ a bbb cc

ধাপ 2: হ্যাশ মানচিত্র ব্যবহার করে দেখুন

কোটলিনে, আপনি hashMapOf() ব্যবহার করে অন্য যেকোন কিছুর সাথে অনেক কিছু ম্যাপ করতে পারেন। হ্যাশ মানচিত্রগুলি জোড়ার তালিকার মতো, যেখানে প্রথম মান একটি কী হিসাবে কাজ করে।

  1. একটি হ্যাশ মানচিত্র তৈরি করুন যা উপসর্গ, কী, এবং মাছের রোগ, মানগুলির সাথে মেলে।
val cures = hashMapOf("white spots" to "Ich", "red sores" to "hole disease")
  1. তারপর আপনি get() , বা এমনকি ছোট, বর্গাকার বন্ধনী [] ব্যবহার করে উপসর্গ কী এর উপর ভিত্তি করে রোগের মান পুনরুদ্ধার করতে পারেন।
println(cures.get("white spots"))
⇒ Ich
println(cures["red sores"])
⇒ hole disease
  1. মানচিত্রে নেই এমন একটি উপসর্গ নির্দিষ্ট করার চেষ্টা করুন।
println(cures["scale loss"])
⇒ null

যদি একটি কী মানচিত্রে না থাকে, তাহলে ম্যাচিং রোগটি ফেরত দেওয়ার চেষ্টা করা null হয়ে যায়। মানচিত্রের ডেটার উপর নির্ভর করে, সম্ভাব্য কী-এর জন্য কোনও মিল না থাকা সাধারণ হতে পারে। এই ধরনের ক্ষেত্রে, Kotlin getOrDefault() ফাংশন প্রদান করে।

  1. getOrDefault() ব্যবহার করে কোনো মিল নেই এমন একটি কী খোঁজার চেষ্টা করুন।
println(cures.getOrDefault("bloating", "sorry, I don't know"))
⇒ sorry, I don't know

আপনি যদি একটি মান ফেরত দেওয়ার চেয়ে আরও বেশি কিছু করতে চান তবে Kotlin getOrElse() ফাংশন প্রদান করে।

  1. getOrDefault() এর পরিবর্তে getOrElse() ব্যবহার করতে আপনার কোড পরিবর্তন করুন।
println(cures.getOrElse("bloating") {"No cure for this"})
⇒ No cure for this

একটি সাধারণ ডিফল্ট মান ফেরত দেওয়ার পরিবর্তে, কোঁকড়া ধনুর্বন্ধনী {} মধ্যে যাই হোক না কেন কোডটি কার্যকর করা হয়। উদাহরণে, else কেবল একটি স্ট্রিং প্রদান করে, তবে এটি একটি প্রতিকার সহ একটি ওয়েবপৃষ্ঠা খুঁজে বের করা এবং এটি ফেরত দেওয়ার মতো অভিনব হতে পারে।

ঠিক যেমন mutableListOf , আপনিও একটি mutableMapOf তৈরি করতে পারেন। একটি পরিবর্তনযোগ্য মানচিত্র আপনাকে আইটেম রাখতে এবং সরাতে দেয়। পরিবর্তনযোগ্য মানে পরিবর্তন করতে সক্ষম, অপরিবর্তনীয় মানে পরিবর্তন করতে অক্ষম।

  1. একটি ইনভেন্টরি ম্যাপ তৈরি করুন যা পরিবর্তন করা যেতে পারে, আইটেমের সংখ্যার সাথে একটি সরঞ্জামের স্ট্রিং ম্যাপ করুন। এটিতে একটি মাছের জাল দিয়ে এটি তৈরি করুন, তারপর put() দিয়ে ইনভেন্টরিতে 3টি ট্যাঙ্ক স্ক্রাবার যোগ করুন এবং remove() দিয়ে মাছের জালটি সরিয়ে দিন।
val inventory = mutableMapOf("fish net" to 1)
inventory.put("tank scrubber", 3)
println(inventory.toString())
inventory.remove("fish net")
println(inventory.toString())
⇒ {fish net=1, tank scrubber=3}{tank scrubber=3}

এই টাস্কে, আপনি কোটলিনের ধ্রুবক এবং তাদের সংগঠিত করার বিভিন্ন উপায় সম্পর্কে শিখবেন।

ধাপ 1: কনস্ট বনাম ভ্যাল সম্পর্কে জানুন

  1. REPL-এ, একটি সংখ্যাসূচক ধ্রুবক তৈরি করার চেষ্টা করুন। কোটলিনে, আপনি শীর্ষ-স্তরের ধ্রুবক তৈরি করতে পারেন এবং const val ব্যবহার করে কম্পাইলের সময় তাদের একটি মান নির্ধারণ করতে পারেন।
const val rocks = 3

মানটি বরাদ্দ করা হয়েছে, এবং পরিবর্তন করা যাবে না, যা অনেকটা নিয়মিত val ঘোষণা করার মতো শোনাচ্ছে। তাহলে const val এবং val মধ্যে পার্থক্য কী? const val মান নির্ধারণ করা হয় কম্পাইলের সময়ে, যেখানে val মান নির্ধারণ করা হয় প্রোগ্রাম এক্সিকিউশনের সময়, যার মানে, রান টাইমে একটি ফাংশন দ্বারা val নির্ধারণ করা যেতে পারে।

তার মানে val একটি ফাংশন থেকে একটি মান নির্ধারণ করা যেতে পারে, কিন্তু const val পারে না।

val value1 = complexFunctionCall() // OK
const val CONSTANT1 = complexFunctionCall() // NOT ok

উপরন্তু, const val শুধুমাত্র শীর্ষ স্তরে কাজ করে, এবং সিঙ্গলটন ক্লাসে object দিয়ে ঘোষিত, নিয়মিত ক্লাসের সাথে নয়। আপনি শুধুমাত্র ধ্রুবক ধারণ করে এমন একটি ফাইল বা সিঙ্গলটন অবজেক্ট তৈরি করতে এটি ব্যবহার করতে পারেন এবং প্রয়োজনে সেগুলি আমদানি করতে পারেন।

object Constants {
    const val CONSTANT2 = "object constant"
}
val foo = Constants.CONSTANT2

ধাপ 2: একটি সহচর বস্তু তৈরি করুন

কোটলিনের শ্রেণী স্তরের ধ্রুবকের ধারণা নেই।

একটি ক্লাসের মধ্যে ধ্রুবকগুলিকে সংজ্ঞায়িত করার জন্য, আপনাকে সেগুলিকে companion কীওয়ার্ড দিয়ে ঘোষিত সহচর বস্তুগুলিতে মোড়ানো হবে। সঙ্গী বস্তুটি মূলত ক্লাসের মধ্যে একটি সিঙ্গলটন অবজেক্ট।

  1. একটি স্ট্রিং ধ্রুবক ধারণকারী একটি সহচর বস্তুর সাথে একটি ক্লাস তৈরি করুন।
class MyClass {
    companion object {
        const val CONSTANT3 = "constant in companion"
    }
}

সহচর বস্তু এবং নিয়মিত বস্তুর মধ্যে মৌলিক পার্থক্য হল:

  • কম্প্যানিয়ন অবজেক্টগুলিকে ধারণ করা ক্লাসের স্ট্যাটিক কনস্ট্রাক্টর থেকে শুরু করা হয়, অর্থাৎ, যখন অবজেক্ট তৈরি হয় তখন সেগুলি তৈরি হয়।
  • নিয়মিত অবজেক্টগুলি সেই বস্তুর প্রথম অ্যাক্সেসে অলসভাবে শুরু করা হয়; যে, যখন তারা প্রথম ব্যবহার করা হয়.

আরও অনেক কিছু আছে, তবে আপনাকে এখন যা জানতে হবে তা হল ক্লাসে ধ্রুবকগুলিকে একটি সহচর বস্তুতে মোড়ানো।

এই টাস্কে, আপনি ক্লাসের আচরণ প্রসারিত সম্পর্কে শিখবেন। একটি ক্লাসের আচরণ প্রসারিত করার জন্য ইউটিলিটি ফাংশন লেখা খুবই সাধারণ। কোটলিন এই ইউটিলিটি ফাংশনগুলি ঘোষণা করার জন্য একটি সুবিধাজনক সিনট্যাক্স প্রদান করে: এক্সটেনশন ফাংশন।

এক্সটেনশন ফাংশন আপনাকে একটি বিদ্যমান ক্লাসে এর সোর্স কোড অ্যাক্সেস না করেই ফাংশন যোগ করতে দেয়। উদাহরণস্বরূপ, আপনি তাদের একটি Extensions.kt ফাইলে ঘোষণা করতে পারেন যা আপনার প্যাকেজের অংশ। এটি আসলে ক্লাসটি পরিবর্তন করে না, তবে এটি আপনাকে সেই ক্লাসের বস্তুতে ফাংশন কল করার সময় ডট-নোটেশন ব্যবহার করার অনুমতি দেয়।

ধাপ 1: একটি এক্সটেনশন ফাংশন লিখুন

  1. এখনও REPL-এ কাজ করছেন, একটি সাধারণ এক্সটেনশন ফাংশন লিখুন, hasSpaces() একটি স্ট্রিং স্পেস আছে কিনা তা পরীক্ষা করতে। ফাংশনের নামটি যে ক্লাসে কাজ করে তার সাথে প্রিফিক্স করা হয়। ফাংশনের ভিতরে, this যে অবজেক্টে কল করা হয় তাকে বোঝায়, এবং it find() কলের পুনরাবৃত্তিকারীকে বোঝায়।
fun String.hasSpaces(): Boolean {
    val found = this.find { it == ' ' }
    return found != null
}
println("Does it have spaces?".hasSpaces())
⇒ true
  1. আপনি hasSpaces() ফাংশন সহজ করতে পারেন। this স্পষ্টভাবে প্রয়োজন হয় না, এবং ফাংশনটি একটি একক অভিব্যক্তিতে কমিয়ে ফিরিয়ে দেওয়া যেতে পারে, তাই এর চারপাশে কোঁকড়া বন্ধনী {} প্রয়োজন হয় না।
fun String.hasSpaces() = find { it == ' ' } != null

ধাপ 2: এক্সটেনশনের সীমাবদ্ধতা জানুন

এক্সটেনশন ফাংশন শুধুমাত্র তারা প্রসারিত করছেন ক্লাসের পাবলিক API অ্যাক্সেস আছে. private যে ভেরিয়েবল অ্যাক্সেস করা যাবে না.

  1. private চিহ্নিত সম্পত্তিতে এক্সটেনশন ফাংশন যোগ করার চেষ্টা করুন।
class AquariumPlant(val color: String, private val size: Int)

fun AquariumPlant.isRed() = color == "red"    // OK
fun AquariumPlant.isBig() = size > 50         // gives error
⇒ error: cannot access 'size': it is private in 'AquariumPlant'
  1. নীচের কোডটি পরীক্ষা করুন এবং এটি কী প্রিন্ট করবে তা বের করুন।
open class AquariumPlant(val color: String, private val size: Int)

class GreenLeafyPlant(size: Int) : AquariumPlant("green", size)

fun AquariumPlant.print() = println("AquariumPlant")
fun GreenLeafyPlant.print() = println("GreenLeafyPlant")

val plant = GreenLeafyPlant(size = 10)
plant.print()
println("\n")
val aquariumPlant: AquariumPlant = plant
aquariumPlant.print()  // what will it print?
⇒ GreenLeafyPlant
AquariumPlant

plant.print() GreenLeafyPlant প্রিন্ট করে। আপনি আশা করতে পারেন aquariumPlant.print() GreenLeafyPlant প্রিন্ট করবে, কারণ এটি plant মান নির্ধারণ করা হয়েছিল। কিন্তু টাইপ কম্পাইল সময়ে সমাধান করা হয়, তাই AquariumPlant মুদ্রিত হয়.

ধাপ 3: একটি এক্সটেনশন সম্পত্তি যোগ করুন

এক্সটেনশন ফাংশন ছাড়াও, কোটলিন আপনাকে এক্সটেনশন বৈশিষ্ট্য যোগ করতে দেয়। এক্সটেনশন ফাংশনগুলির মতো, আপনি যে ক্লাসটি প্রসারিত করছেন তা নির্দিষ্ট করুন, একটি বিন্দু দ্বারা অনুসরণ করুন এবং সম্পত্তির নাম অনুসরণ করুন৷

  1. এখনও REPL-এ কাজ করছেন, AquariumPlant এ একটি এক্সটেনশন প্রপার্টি isGreen যোগ করুন, যদি রঙ সবুজ হয় তাহলে এটি true
val AquariumPlant.isGreen: Boolean
   get() = color == "green"

একটি সাধারণ সম্পত্তির মতোই isGreen সম্পত্তি অ্যাক্সেস করা যেতে পারে; যখন অ্যাক্সেস করা হয়, তখন isGreen এর গেটারকে মান পেতে বলা হয়।

  1. aquariumPlant ভেরিয়েবলের জন্য isGreen সম্পত্তি প্রিন্ট করুন এবং ফলাফলটি পর্যবেক্ষণ করুন।
aquariumPlant.isGreen
⇒ res4: kotlin.Boolean = true

ধাপ 4: বাতিলযোগ্য রিসিভার সম্পর্কে জানুন

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

  1. এখনও REPL এ কাজ করছেন, একটি pull() পদ্ধতি সংজ্ঞায়িত করুন যা একটি বাতিলযোগ্য রিসিভার নেয়। এটি একটি প্রশ্ন চিহ্ন দিয়ে নির্দেশিত হয় ? টাইপের পরে, বিন্দুর আগে। শরীরের ভিতরে, this -ডট null অ্যাপ্লাই ?.apply.
fun AquariumPlant?.pull() {
   this?.apply {
       println("removing $this")
   }
}

val plant: AquariumPlant? = null
plant.pull()
  1. এই ক্ষেত্রে, আপনি প্রোগ্রাম চালানোর সময় কোন আউটপুট নেই। কারণ plant null , ভিতরের println() বলা হয় না।

এক্সটেনশন ফাংশনগুলি খুব শক্তিশালী, এবং বেশিরভাগ কোটলিন স্ট্যান্ডার্ড লাইব্রেরি এক্সটেনশন ফাংশন হিসাবে প্রয়োগ করা হয়।

এই পাঠে, আপনি সংগ্রহ সম্পর্কে আরও শিখেছেন, ধ্রুবক সম্পর্কে শিখেছেন এবং এক্সটেনশন ফাংশন এবং বৈশিষ্ট্যের শক্তির স্বাদ পেয়েছেন।

  • একটি ফাংশন থেকে একাধিক মান ফেরাতে পেয়ার এবং ট্রিপল ব্যবহার করা যেতে পারে। যেমন:
    val twoLists = fish.partition { isFreshWater(it) }
  • Kotlin-এর List জন্য অনেক দরকারী ফাংশন আছে, যেমন reversed() , contains() , এবং subList()
  • একটি HashMap মান কী ম্যাপ করতে ব্যবহার করা যেতে পারে। যেমন:
    val cures = hashMapOf("white spots" to "Ich", "red sores" to "hole disease")
  • const কীওয়ার্ড ব্যবহার করে কম্পাইল-টাইম কনস্ট্যান্ট ঘোষণা করুন। আপনি এগুলিকে শীর্ষ স্তরে রাখতে পারেন, সেগুলিকে একটি সিঙ্গলটন অবজেক্টে সংগঠিত করতে পারেন বা একটি সহচর বস্তুতে রাখতে পারেন৷
  • একটি কম্প্যানিয়ন অবজেক্ট হল ক্লাস ডেফিনেশনের মধ্যে একটি সিঙ্গলটন অবজেক্ট, যা companion কীওয়ার্ড দিয়ে সংজ্ঞায়িত করা হয়।
  • এক্সটেনশন ফাংশন এবং বৈশিষ্ট্য একটি ক্লাসে কার্যকারিতা যোগ করতে পারে। যেমন:
    fun String.hasSpaces() = find { it == ' ' } != null
  • একটি বাতিলযোগ্য রিসিভার আপনাকে একটি ক্লাসে এক্সটেনশন তৈরি করতে দেয় যা null হতে পারে। দ্য ?. কোড এক্সিকিউট করার আগে null চেক করতে অপারেটরকে apply সাথে যুক্ত করা যেতে পারে। যেমন:
    this?.apply { println("removing $this") }

কোটলিন ডকুমেন্টেশন

আপনি যদি এই কোর্সে কোনো বিষয়ে আরও তথ্য চান, বা আপনি যদি আটকে যান, https://kotlinlang.org আপনার সেরা শুরুর পয়েন্ট।

কোটলিন টিউটোরিয়াল

https://try.kotlinlang.org ওয়েবসাইটটিতে Kotlin Koans নামে সমৃদ্ধ টিউটোরিয়াল রয়েছে, একটি ওয়েব-ভিত্তিক দোভাষী , এবং উদাহরণ সহ রেফারেন্স ডকুমেন্টেশনের একটি সম্পূর্ণ সেট।

উদ্যতা কোর্স

এই বিষয়ে Udacity কোর্সটি দেখতে, প্রোগ্রামারদের জন্য Kotlin Bootcamp দেখুন।

ইন্টেলিজ আইডিয়া

IntelliJ IDEA-এর জন্য ডকুমেন্টেশন জেটব্রেইন্স ওয়েবসাইটে পাওয়া যাবে।

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

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

নিচের কোনটি একটি তালিকার অনুলিপি প্রদান করে?

add()

remove()

reversed()

contains()

প্রশ্ন 2

class AquariumPlant(val color: String, val size: Int, private val cost: Double, val leafy: Boolean) এই এক্সটেনশন ফাংশনগুলির মধ্যে কোনটি একটি কম্পাইলার ত্রুটি দেবে?

fun AquariumPlant.isRed() = color == "red"

fun AquariumPlant.isBig() = size > 45

fun AquariumPlant.isExpensive() = cost > 10.00

fun AquariumPlant.isNotLeafy() = leafy == false

প্রশ্ন 3

নিচের কোনটি এমন একটি জায়গা নয় যেখানে আপনি const val দিয়ে ধ্রুবককে সংজ্ঞায়িত করতে পারেন?

▢ একটি ফাইলের শীর্ষ স্তরে

▢ নিয়মিত ক্লাসে

▢ সিঙ্গলটন বস্তুতে

▢ সহচর বস্তুতে

পরবর্তী পাঠে এগিয়ে যান: 5.2 জেনেরিক

অন্যান্য কোডল্যাবগুলির লিঙ্ক সহ কোর্সের একটি ওভারভিউয়ের জন্য, "প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প: কোর্সে স্বাগতম" দেখুন।