কম্পিউটার টিউটোরিয়াল

Swift বুঝুন: ভ্যালু টাইপ এবং রেফারেন্স টাইপের তুলনা

Swift একটি মা? এবং এর দুটি ছেলে ?-

  • Value Type ??‍♀️
  • Reference Type ?‍♂️

কিন্তু তাদের বৈশিষ্ট্যগুলো কী??‍♂️

কি তারা একইভাবে আচরণ করে নাকি বিপরীত? ?‍♂️

Swift একটি মাল্টি-প্যারাডাইম প্রোগ্রামিং ল্যাঙ্গুয়েজ যা Apple দ্বারা iOS, macOS, watchOS, tvOS, Linux, এবং z/OS-এ ডেভেলপ করা হয়েছে।?

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

কিন্তু, ওপস ওপস ওপস…???

Swift-এ স্ট্রাক্টও আছে এবং এটি মেথড, প্রোপার্টি, ইনিশিয়ালাইজার ডিফাইন করতে পারে এবং প্রোটোকল কনফর্ম করতে পারে শুধু ইনহেরিটেন্স বাদে।?

কী? এখন আমি বিভ্রান্ত!!! ???

আর কনফিউশন বাড়ান: স্ট্রাক্টগুলো Swift-এ একমাত্র ভ্যালু টাইপ নয়। টাপল এবং এনামও ভ্যালু টাইপ। ক্লাসগুলোও একমাত্র রেফারেন্স টাইপ নয়। ফাংশন এবং ক্লোজারও রেফারেন্স টাইপ। তবে রाहতের কথা হলো আমরা কমপক্ষে এই টাইপগুলোর প্রাইমারি ফোকাস এবং ব্যবহার বিশেষজ্ঞতা জানি।?

তাহলে এই পয়েন্ট পর্যন্ত আমরা শুধু স্ট্রাক্ট এবং ক্লাসের ব্যবহার নিয়ে একটি বড় বিভ্রান্তির সাথে ছাড়াই।?

তাহলে যাবো এবং এতে ঘুরে থাকা কনফিউশনগুলো দূর করি।?‍♂️

স্টোরেজ লোকেশন

তিন ধরনের স্টোরেজ উপলব্ধ:

  • রেজিস্টার ?
  • স্ট্যাক ☄️
  • হিপ ?

কম জীবনকালিন অবজেক্টগুলো রেজিস্টার বা স্ট্যাকে সংরক্ষিত হয় এবং বেশি জীবনকালিনগুলো হিপে সংরক্ষিত হয়।?

একটি ভ্যালু টাইপ তার কন্টেন্ট স্টকে এলোকেটেড মেমরিতে সংরক্ষণ করে, তাই আমরা বলতে পারি Swift-এ ভ্যালু টাইপগুলো স্টকে এলোকেটেড। ?

কিন্তু ভ্যালু টাইপ সম্পর্কে একটি সাধারণ ভুল ধারণা আছে, শুনেছেন কি??‍♂️

ভুল ধারণাটি হলো অধিকাংশ লোক মনে করে ভ্যালু টাইপগুলো সবসময় স্টকে সংরক্ষিত থাকে।

❌❌ এক মিনিট রুকুন — এটি সবসময় সত্য নয়। ❌❌

ভ্যালু টাইপগুলো স্টকে সংরক্ষিত হতে পারে যখন সেগুলো অস্থায়ী বা লোকাল ভেরিয়েবল। কিন্তু যদি একটি ভ্যালু টাইপ একটি রেফারেন্স টাইপের ভিতরে থাকে?

এই পরিস্থিতিতে, এটি হিপ মেমরিতে সংরক্ষিত হতে পারে। ?

ওহ...এটা কুল!!!?

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

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

রেফারেন্স টাইপের জন্য এটি কীভাবে কাজ করে?

রেফারেন্স টাইপের জন্য, অনেক ভেরিয়েবল একই মেমরি লোকেশনের রেফারেন্স ধরে রাখতে পারে এটি একটি সাধারণ পরিস্থিতি।⚔️

যখন একটি ভ্যালু টাইপ ইনস্ট্যান্স একটি ভেরিয়েবলে অ্যাসাইন করা হয় বা একটি ফাংশনে পাস করা হয়, ইনস্ট্যান্সটি কপি হয়ে সে ভেরিয়েবলে অ্যাসাইন হয়। কিন্তু রেফারেন্স টাইপের সাথে, শুধু রেফারেন্সটি কপি হয় এবং নতুন ভেরিয়েবলটি একই মেমরি লোকেশনের একই রেফারেন্স ধরে রাখে। ?

মিউটেবিলিটির দিক থেকে পার্থক্য

একটি ভেরিয়েবলের জন্য দুটি স্টেট হতে পারে:

  • ?‍♀ ️Mutable ?‍♀
  • ?️‍♂️ Immutable ?️‍♂️

যদি একটি ভ্যালু টাইপ ইনস্ট্যান্স একটি ইমিউটেবল ভেরিয়েবলে অ্যাসাইন করা হয়, তবে ইনস্ট্যান্সটিও ইমিউটেবল হয়ে যায়। ফলে, আমরা সেটিতে কোনো পরিবর্তন করতে পারি না।?‍♂️

যদি একটি ভ্যালু টাইপ ইনস্ট্যান্স একটি মিউটেবল ভেরিয়েবলে অ্যাসাইন করা হয়, তবে শুধু তখন ইনস্ট্যান্সটি মিউটেবল হয়। ?‍♂️

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

স্ট্রাকচারাল টাইপ

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

উম্ম...খুব কঠোর শব্দ...আপনি কী বোঝাতে চাচ্ছেন???

চলুন বলি, আমাদের একটি Person ভ্যালু টাইপ আছে যার অ্যাট্রিবিউট আছে firstName এবং lastName.

struct Person { var firstName: String var lastName: String } var person1 = Person(firstName: "foo", lastName: "bar") var person2 = Person(firstName: "foo", lastName: "bar")

এখানে person1 এবং person2 উভয় ইনস্ট্যান্স firstName ("foo") এবং lastName ("bar") একই ভ্যালু ধরে রেখেছে। আমাদের বোঝাপಡা অনুযায়ী, যেহেতু তাদের অ্যাট্রিবিউট (firstName এবং lastName) একই ভ্যালু ধরে রেখেছে, তাই দুটি ইনস্ট্যান্স একে অপরের সমান।

এটি শুধু এটিতেই সীমাবদ্ধ নয়: ভবিষ্যতে যেকোনো দুটি person ইনস্ট্যান্স যদি firstName এবং lastName এর জন্য একই ভ্যালু ধারণ করে, তারা একে অপরের সমান হবে।

এই পয়েন্ট পর্যন্ত আমাদের বোঝাপড়া অনুযায়ী, আমরা বলতে পারি:

ভ্যালু টাইপের কোনো আইডেন্টিটি নেই, তাই তাদের কোনো রেফারেন্স হতে পারে না। ভ্যালু টাইপ ফেসলেস।?

কী? আপনি কীভাবে এটাকে বলতে পারেন????

var myAge: Int = 21 var friendAge: Int = 21

উভয় myAge এবং friendAge ইন্টিজার টাইপ ভেরিয়েবল ভ্যালু ২১ সহ।

কি আমরা একটাকে অন্যটি থেকে আলাদা করতে পারি? ?

না, কারণ তারা একই ভ্যালু ধরে রেখেছে।?

ভ্যালু ২১ 가진 একটি ইন্টিজার ভেরিয়েবল অন্য একটি ইন্টিজার ভেরিয়েবল থেকে আলাদা হতে পারে না যেটিও ভ্যালু ২১ ধরে রেখেছে। সিম্পল।???

আইডেন্টিটি না থাকা ভ্যালু টাইপকে আরেকটি সুবিধা দেয়: আপনি প্র্যাকটিক্যালি চিন্তা করলে কল্পনা করতে পারেন যদি আপনার আইডেন্টিটি না থাকে তবে আপনার মতো ক্যারেক্টারস্টিক 가진 কেউ আপনাকে রিপ্লেস বা সাবস্টিটিউট করতে পারে। ???

একই চিন্তা আমরা মানুষের জন্যও করতে পারি। যদি আমার আইডেন্টিটি না থাকত তবে আমার মতো ক্যারেক্টারস্টিক 가진 কেউ আমাকে রিপ্লেস করতে পারত???. ভালো যে আমাদের আইডেন্টিটি আছে অন্যথায় আমাদের অস্তিত্বে বড় রিস্ক হত।?

কিন্তু ভ্যালু টাইপের জন্য, তাদের আইডেন্টিটি নেই এবং এটি তাদের জন্য একটি সুবিধা। ?

ভ্যালু টাইপ ব্যবহার করার সুবিধা কী?

? নো রেস কন্ডিশন এবং ডেডলক: ?

মাল্টি-থ্রেডেড এনভায়রনমেন্টে ভ্যালু টাইপের জন্য, এক থ্রেড ইনস্ট্যান্সের স্টেট মিউটেট করার সময় অন্য থ্রেড সেটি ব্যবহার করছে এর জন্য অসম্ভব। তাই আমরা বলতে পারি রেস কন্ডিশন বা ডেডলক হবে না।

⚔️ নো রেটেইন সাইকেল: ⚔️

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

?‍?‍?‍? অটোমেটিক রেফারেন্স কাউন্টিং: ?‍?‍?‍?

রেফারেন্স টাইপের জন্য, Swift অটোমেটিক রেফারেন্স কাউন্টিং ব্যবহার করে সকল লাইভ বা এক্টিভ অবজেক্ট ট্র্যাক রাখতে এবং ইনস্ট্যান্সটি শুধু তখন ডি-অ্যালোকেট করে যখন আর কোনো স্ট্রং রেফারেন্স থাকে না। একটু চিন্তা করলে বলা যায় এটি একটি ভারি অপারেশন কারণ Swift রানটাইমকে সবসময় অবজেক্ট ট্র্যাক রাখতে হয়। কিন্তু যেহেতু ভ্যালু টাইপ স্টকে এলোকেটেড, এতে ARC দরকার নয়। তাই এটি সস্তা এবং দ্রুত??.

কিন্তু ওপস...Array, Dictionary এবং String-এর মেমরি কীভাবে ম্যানেজ করে?

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

কিন্তু এটি কী??

যখন আমরা বলি একটি ইনস্ট্যান্স অন্য ইনস্ট্যান্সের কপি, এটার আসল অর্থ হলো তারা একই, অর্থাৎ একই ভ্যালু ধারণ করে। কিন্তু Swift-এ, উপরের টাইপগুলো (Array, Dictionary, String, ইত্যাদি) এর জন্য, একটি আসল কপি হিপে তখন তৈরি হয় যখন একটি ইনস্ট্যান্স মিউটেট করা হয়। এটি ভ্যালু টাইপের জন্য একটি পারফরম্যান্স অপটিমাইজেশন টেকনিক।???

উপসংহার

কোনো হার্ড রুল নেই যা ডিফাইন করে কখন ভ্যালু টাইপ ব্যবহার করতে হবে এবং কখন রেফারেন্স টাইপ। ভ্যালু টাইপের রেফারেন্স টাইপের ওপর কিছু уникаল সুবিধা আছে এবং বিপরীতও সত্য। তারা দুটোই নিজস্ব ভাবে উникаল। এটি আপনার রিকোয়ারমেন্ট এবং আপনি কী অর্জন করতে চান তার ওপর নির্ভর করে। আপনার কোডের সেম্যান্টিক্স আপনাকে জানতে হবে কারণ আপনি আপনার কোড সবচেয়ে ভালো জানেন, তাই আপনার উপর নির্ভর করে চয়ন করা। আপনার পূর্ণ স্বাধীনতা আছে।

তাই ভ্যালু টাইপ বনাম রেফারেন্স টাইপ নিয়ে লড়াই করার বদলে, সেগুলো বুদ্ধিমানের সাথে ব্যবহার করুন।

??? চিয়ার্স!!! পড়ার জন্য ধন্যবাদ!! ???

✅✅✅আপনি আমাকে Twitter-এ পাবেন।✅✅✅

  1. C#-তে ভ্যালু টাইপ এবং রেফারেন্স টাইপের পার্থক্য ব্যাখ্যা

  2. C#-এ ডেটা টাইপ, ভ্যালু টাইপ এবং রেফারেন্স টাইপ কী?

  3. পাইথনে ডিকশনারিতে কী-এর ভ্যালু আপডেট কীভাবে করবেন?

  4. Swift-এ Generics বনাম Any: মূল পার্থক্য এবং সেরা প্র্যাকটিস