ডিপ কপি বনাম অগভীর অনুলিপি - এবং আপনি কীভাবে এগুলি সুইফটে ব্যবহার করতে পারেন

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

এই নিবন্ধে, আমরা কীভাবে সুইফটে বিভিন্ন ডেটা প্রকারগুলি অনুলিপি করতে পারি এবং তারা কীভাবে বিভিন্ন পরিস্থিতিতে আচরণ করে সে সম্পর্কে বিশদ আলোচনা করব।

মান এবং রেফারেন্স প্রকার

সুইফ্টের সমস্ত ডেটা প্রকারগুলি দুটি ধরণের ক্ষেত্রে মূলত মান ধরণের এবং রেফারেন্স ধরণের মধ্যে পড়ে।

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

উভয় প্রকারের সর্বাধিক স্বতন্ত্র বৈশিষ্ট্যটি তাদের অনুলিপি করার আচরণের মধ্যে রয়েছে।

গভীর এবং অগভীর কপি কি?

উদাহরণস্বরূপ, এটি মান ধরণের বা রেফারেন্সের ধরণ কিনা, নিম্নলিখিত পদ্ধতির একটিতে অনুলিপি করা যেতে পারে:

গভীর অনুলিপি - সব কিছু অনুলিপি

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

উপরের কোডে,

  • লাইন 1: স্ট্রিংগুলির অ্যারে 1 - অ্যারে (একটি মান ধরণের)
  • লাইন 2: arr1 arr2 নির্ধারিত হয়। এটি arr1 এর একটি গভীর অনুলিপি তৈরি করবে এবং তারপরে সেই অনুলিপিটি arr2 এ নিয়োগ করবে
  • লাইন 7 থেকে 11: এন্টার 2 এ করা কোনও পরিবর্তন আরআর 1 তে প্রতিফলিত হয় না।

এটিই গভীর অনুলিপি - সম্পূর্ণ পৃথক দৃষ্টান্ত। একই ধারণাটি সমস্ত মানের ধরণের সাথে কাজ করে।

কিছু পরিস্থিতিতে, যখন কোনও মান ধরণে নেস্টেড রেফারেন্স প্রকার থাকে, গভীর অনুলিপি একটি ভিন্ন ধরণের আচরণ প্রকাশ করে। আমরা আসন্ন বিভাগে এটি দেখতে পাবেন।

অগভীর অনুলিপি - যতটা সম্ভব নকল

  • অগভীর অনুলিপি সহ, উত্স দ্বারা নির্দেশিত কোনও বস্তুর গন্তব্য দ্বারাও নির্দেশ করা হয়। সুতরাং মেমরিতে কেবল একটি অবজেক্ট তৈরি হবে।
  • সংগ্রহ - সংগ্রহের একটি অগভীর অনুলিপি উপাদান কাঠামোর অনুলিপি। অগভীর অনুলিপি সহ দুটি সংগ্রহ এখন পৃথক উপাদানগুলি ভাগ করে।
  • দ্রুত - শুধুমাত্র রেফারেন্স অনুলিপি করা হয়।
  • রেফারেন্স প্রকারের অনুলিপি অগভীর অনুলিপি তৈরি করে।

উপরের কোডে,

  • লাইন 1 থেকে 8: ঠিকানা শ্রেণীর ধরণ
  • লাইন 10: a1 - ঠিকানা ধরণের একটি উদাহরণ
  • লাইন 11: a1 এ 2 তে নির্ধারিত হয়েছে। এটি a1 এর অগভীর অনুলিপি তৈরি করবে এবং তারপরে সেই অনুলিপি a2 তে অর্পণ করবে, কেবলমাত্র রেফারেন্সটি a2 এ অনুলিপি করা হয়েছে।
  • ১ to থেকে ১৯ টি রেখা: এ 2-এ করা যে কোনও পরিবর্তন অবশ্যই a1 এ প্রতিবিম্বিত হবে।

উপরের চিত্রটিতে আমরা দেখতে পাচ্ছি যে এ 1 এবং এ 2 উভয়ই একই মেমরি ঠিকানার দিকে নির্দেশ করে।

গভীরতার সাথে রেফারেন্সের প্রকারগুলি অনুলিপি করা হচ্ছে

এখন পর্যন্ত আমরা জানি যে আমরা যখনই কোনও রেফারেন্স প্রকারের অনুলিপি করার চেষ্টা করি তখন কেবলমাত্র অবজেক্টের রেফারেন্সই অনুলিপি করা হয়। কোনও নতুন অবজেক্ট তৈরি হয় না। যদি আমরা একটি সম্পূর্ণ পৃথক অবজেক্ট তৈরি করতে চাই?

আমরা অনুলিপি () পদ্ধতিটি ব্যবহার করে রেফারেন্স টাইপের একটি গভীর অনুলিপি তৈরি করতে পারি। ডকুমেন্টেশন অনুযায়ী,

অনুলিপি () - অনুলিপি দ্বারা (সাথে :) দ্বারা প্রত্যাবর্তিত বস্তুটি ফেরত দেয়।

এনএসকোপিং প্রোটোকল গ্রহণকারী ক্লাসগুলির জন্য এটি একটি সুবিধাজনক পদ্ধতি। অনুলিপিটির (যদি :) সাথে কোনও প্রয়োগ না হয় তবে উত্সাহিত করা হবে।

এনএসকোপিং প্রোটোকলের সাথে সঙ্গতি রাখতে কোড স্নিপেট 2 এ আমরা তৈরি করা ঠিকানা শ্রেণীর পুনর্গঠন করি।

উপরের কোডে,

  • 1 থেকে 14 টি রেখা: ঠিকানা শ্রেণীর ধরণটি এনএসকোপি করার সাথে সম্মত হয় এবং কপিটি প্রয়োগ করে (সহ :) পদ্ধতিটি
  • লাইন 16: a1 - ঠিকানা ধরণের একটি উদাহরণ
  • লাইন 17: a1 কপি () পদ্ধতি ব্যবহার করে a2 এ দেওয়া হয়েছে। এটি a1 এর একটি গভীর অনুলিপি তৈরি করবে এবং তারপরে সেই অনুলিপি a2 তে অর্পণ করবে, এটি সম্পূর্ণ নতুন অবজেক্ট তৈরি হবে।
  • 22 থেকে 25 লাইন: এ 2-এ করা কোনও পরিবর্তন এ 1-এ প্রতিফলিত হবে না।

উপরের চিত্র থেকে যেমন বোঝা যায়, a1 এবং a2 উভয়ই বিভিন্ন মেমরির অবস্থানগুলিতে নির্দেশ করে।

আসুন অন্য উদাহরণটি দেখুন। এবার আমরা দেখতে পাব কীভাবে এটি নেস্টেড রেফারেন্স ধরণের সাথে কাজ করে - একটি রেফারেন্স টাইপ যাতে অন্য রেফারেন্স টাইপ থাকে।

উপরের কোডে,

  • লাইন 22: পি 1 এর একটি গভীর অনুলিপি অনুলিপি () পদ্ধতিটি ব্যবহার করে p2 এ দেওয়া হয়েছে। এর থেকে বোঝা যায় যে তাদের মধ্যে যে কোনও একটির পরিবর্তন অন্যর উপর অবশ্যই প্রভাব ফেলবে না।
  • লাইনগুলি 27 থেকে 28: পি 2 এর নাম এবং শহরের মান পরিবর্তন করা হয়েছে। এগুলি অবশ্যই পি 1 এ প্রতিফলিত হবে না।
  • লাইন 30: পি 1 এর নামটি প্রত্যাশার মতো তবে এটির শহর? এটি "মুম্বই" হওয়া উচিত নয়? কিন্তু আমরা তা ঘটতে পারি না। "বেঙ্গালুরু" কি কেবল পি 2 এর জন্য ছিল? হ্যাঁ ... exactly.

গভীর অনুলিপি ...! আপনার কাছ থেকে এটি প্রত্যাশিত ছিল না। আপনি বলেছিলেন যে আপনি সমস্ত কিছু অনুলিপি করবেন। এবং এখন আপনি এইরকম আচরণ করছেন। ওহ কেন ..!? আমি এখন কী করব?

আতঙ্কিত হবেন না। এর মধ্যে মেমরির ঠিকানাগুলি কী বলে তা দেখে নেওয়া যাক।

উপরের চিত্র থেকে আমরা তা দেখতে পাচ্ছি

  • প্রত্যাশা অনুযায়ী p1 এবং p2 বিভিন্ন মেমরি অবস্থানের দিকে নির্দেশ করে।
  • তবে তাদের ঠিকানা ভেরিয়েবলগুলি এখনও একই অবস্থানটির দিকে নির্দেশ করছে। এর অর্থ হল যে এগুলি গভীরভাবে অনুলিপি করার পরেও কেবলমাত্র উল্লেখগুলি অনুলিপি করা হয় - এটি অবশ্যই একটি অগভীর অনুলিপি।

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

ফানক অনুলিপি (অঞ্চল সহ: এনএস জোনে? = শূন্য) -> যে কোনও
{
    যাক ব্যক্তি = ব্যক্তি (স্ব-নাম, স্ব.আড্রেস)
    প্রত্যাবর্তনকারী
}

উপরের পদ্ধতিটিতে আমরা ব্যক্তি শ্রেণির জন্য আগে প্রয়োগ করেছিলাম, আমরা নিজের ঠিকানাটি স্বতঃ ঠিকানা দ্বারা অনুলিপি করে একটি নতুন উদাহরণ তৈরি করেছি। এটি কেবল ঠিকানা বস্তুর রেফারেন্সটি অনুলিপি করবে। এই কারণেই পি 1 এবং পি 2 এর ঠিকানা উভয় একই স্থানে ইঙ্গিত করে।

সুতরাং, অনুলিপিটি অনুলিপি করে অনুলিপি () পদ্ধতি ব্যবহার করে অবজেক্টের সত্যিকারের গভীর অনুলিপি তৈরি করা যাবে না।

কোনও রেফারেন্স অবজেক্টকে সম্পূর্ণ নকল করতে: সমস্ত নেস্টেড রেফারেন্স প্রকারের সাথে রেফারেন্স টাইপটি অনুলিপি () পদ্ধতিতে অনুলিপি করতে হবে।

যাক ব্যক্তি = ব্যক্তি (স্বতঃ নাম, স্ব.ড্রেস.কপি ()? ঠিকানা হিসাবে)

ফানক কপিতে উপরের কোডটি ব্যবহার করে (অঞ্চল সহ: এনএসডোন? = শূন্য) -> যে কোনও পদ্ধতিতে সমস্ত কিছু কাজ করবে। আপনি নীচের চিত্র থেকে দেখতে পারেন।

সত্য গভীর অনুলিপি - রেফারেন্স এবং মান ধরণের

আমরা ইতিমধ্যে দেখেছি কীভাবে আমরা রেফারেন্স ধরণের একটি গভীর অনুলিপি তৈরি করতে পারি। অবশ্যই আমরা সমস্ত নেস্টেড রেফারেন্স ধরণের সাথে এটি করতে পারি।

তবে কোনও মান ধরণের নেস্টেড রেফারেন্স টাইপ সম্পর্কে কী, এটি কোনও অবজেক্টের অ্যারে, বা কোনও স্ট্রাক্টে রেফারেন্স টাইপ ভেরিয়েবল বা টুপল হতে পারে? আমরা কি এটি অনুলিপি () ব্যবহার করে সমাধান করতে পারি? না, আমরা আসলে পারি না। অনুলিপি () পদ্ধতিতে এনএসকোপিং প্রোটোকল প্রয়োগ করা প্রয়োজন যা কেবলমাত্র এনএসবজেক্ট সাবক্লাসের জন্য কাজ করে। মান প্রকারগুলি উত্তরাধিকার সমর্থন করে না, তাই আমরা তাদের সাথে অনুলিপি () ব্যবহার করতে পারি না।

লাইন 2-এ, কেবলমাত্র এআর 1 এর কাঠামোটি গভীর অনুলিপি করা হয়েছে তবে এর ভিতরে থাকা ঠিকানা বস্তুগুলি এখনও অগভীর অনুলিপিযুক্ত। আপনি নীচের মেমরি মানচিত্র থেকে এটি দেখতে পারেন।

এরি 1 এবং এআর 2 উভয়ের উপাদানগুলি একই মেমরির অবস্থানগুলিতে নির্দেশ করে। এটি একই কারণের কারণে - রেফারেন্সের ধরণগুলি ডিফল্টরূপে অগভীর অনুলিপি করা হয়।

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

এখানে কিছু এপিআই রয়েছে যা আমরা ডেটা সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করতে ব্যবহার করতে পারি:

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

কোডেবল প্রোটোকলের সাথে সামঞ্জস্য রাখতে আমরা কোড স্নিপেট 3-এ পূর্বে যে সমস্ত এনএসকোপিটিং কোড যুক্ত করেছি সেগুলি সরাতে অ্যাড্রেস ক্লাসটি আরও খানিকটা পুনর্গঠন করি।

উপরের কোডে, 11-10 রেখাগুলি arr1 এর সত্যিকারের গভীর অনুলিপি তৈরি করবে। নীচের চিত্রটি যা মেমরির অবস্থানগুলির একটি পরিষ্কার চিত্র দেয়।

অনুরূপ লিখ

লেখার অনুলিপি একটি অপ্টিমাইজেশন কৌশল যা মান ধরণের অনুলিপি করার সময় পারফরম্যান্স বাড়াতে সহায়তা করে।

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

এখানে লিখিত অনুলিপিটির ধারণাটি আসে - অনুলিপি করার সময়, প্রতিটি রেফারেন্স একই মেমরি ঠিকানার দিকে নির্দেশ করে। এটি কেবল তখনই ঘটে যখন কোনও রেফারেন্স অন্তর্নিহিত ডেটা সংশোধন করে যে সুইফট আসলে প্রকৃত উদাহরণটি অনুলিপি করে এবং সংশোধন করে।

এটি হ'ল এটি গভীর অনুলিপি বা অগভীর অনুলিপি, যতক্ষণ না আমরা অবজেক্টগুলির একটিতে পরিবর্তন না আনা হয় ততক্ষণ নতুন কপি তৈরি করা হবে না।

উপরের কোডে,

  • লাইন 2: arr1 এর একটি গভীর অনুলিপি arr2 তে নির্ধারিত হয়েছে
  • 4 এবং 5 রেখা: arr1 এবং arr2 এখনও একই মেমরি ঠিকানার দিকে নির্দেশ করে
  • লাইন 7: এআর 2 এ পরিবর্তনগুলি
  • লাইন 9 এবং 10: অ্যারে 1 এবং এআর 2 এখন বিভিন্ন মেমরির অবস্থানগুলিতে ইঙ্গিত করছে

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

আরও পড়া

আমার অন্যান্য নিবন্ধগুলি পড়তে ভুলবেন না:

  1. সুইফড 4 এ কোডেবল সম্পর্কে সমস্ত কিছুই
  2. আপনি সর্বদা আইওএস-এ বিজ্ঞপ্তি সম্পর্কে জানতে চেয়েছিলেন এমন সমস্ত কিছু
  3. গ্রেডিয়েন্টস - আইওএস দিয়ে এটি রঙ করুন
  4. আইওএস 11 এর জন্য কোডিং: কীভাবে সংগ্রহ এবং টেবিলগুলিতে টানুন এবং ড্রপ করবেন
  5. আইওএস 10 এ টুডে এক্সটেনশানগুলি (উইজেট) সম্পর্কে আপনার যা জানা দরকার
  6. ইউআইকোলিকেশনভিউসেল নির্বাচন সহজ করা হয়েছে .. !!

আপনার কোনও প্রশ্ন থাকলে বিনা দ্বিধায় মন্তব্য করুন।