deep clone چیست و اصن چه دردی از من دوا میکنه ؟

سلام دوستان خیلی خوشحالم دوباره توفیق اینو دارم بتونم براتون در مورد یک مبحث تخصصی صحبت کنم امروز اومدیم با یکی از عمیق ترین مفهموم ها داخل ساختمان داده به اسم deep clone اول براتون یک مثال میزنم بعد اهمیت deep clone میگم بعد هم به یک جمع بندی می رسیم پس با من همراه باشید . احتمالا تا حالا خواستید که یک شی که از کلاستون خواستید داخل یک جای از حافظه دیگ کپی کنید یا به اصطلاح clone بگیرید اما دیدین به صورت copy by value شده نه copy by reference این یعنی چی بریم سراغ کد من با کد PHP براتون توضیح میدم ( اما داخل همه زبان های برنامه نویسی این نوع کاربردی میاد پس cast کردنش زحمت خودتونه :) )من اینجا اومدم یک کلاس ساختم به اسم Test که یک property دارم به اسم Ali که با استفاده از متد getName میاد این property بر میگردونم یک نمونه ازش میسازم به اسم test بعد میام مقدار test قرار میدم داخل test1 بعد اومدم مقدار property name داخل به وسیله متغییر test1 عوض کردم خروجی که داریم Mohammad هستش اما اتفاقی می افته ما داریم به صورت copy by value مقادیر تغییر میدیم نه copy by reference این یعنی ناخواسته بدون اینکه حواسمون باشه میایم کلاس اصلی رو تغییر میدیم برای حل این مشکل میایم از قابلیت clone داخل php استفاده میکنیم مشکل حل میشه به این شکل : خب مشکل حل شد ولی به نظرتون اگر متغییر $name ما یک نمونه از یک ابجکت بود چطور بازم حل می شد مشکل ؟ نه نمی شد و بازم مشکل داشتیم اینجا مفهوم Deep cloning به کمک ما می آید .یک توضیح بدم اصن چیه Deep cloning : به معنای ساخت یک کپی کامل از یک شیء یا ساختار داده هست، به طوری که تمامی ویژگی‌ها و ویژگی‌های تو در تو آن شیء هم در کپی ایجاد شده حفظ بشن. به عبارت دیگه، هرگونه تغییری در کپی ایجاد شده تنها بر روی اون تاثیر میذاره و اصل شیء یا ساختار داده بدون تغییر باقی میمونه.کجا مورد استفاده قرار میگیره ؟استفاده از deep clone در برخی موارد خاص الزامی هست. بعضی از موارد کاربردی عبارتند از:1. حفظ داده‌ها: در صورتی که می‌خواید یک نسخه مستقل از یک شیء یا ساختار داده داشته باشید تا تغییرات در یک کپی، تاثیری بر روی اصل داشته باشد، deep clone استفاده می‌شود. این کاربرد مفید است زمانی که شما نیاز دارید تا مقدار اولیه یک شیء رو حفظ کنید و تغییرات در کپی آن نیز دست‌کمی به اصل شیء داشته باشد.2. پشتیبان گیری: هنگامی که می‌خواید اطلاعات مهم رو به صورت کپی نگهداری کنید و از تغییرات در کپی‌ها جلوگیری کنید، می‌تونید از deep clone استفاده کنید. این کاربرد مفید هست زمانی که نیاز به بازیابی داده‌های اصلی بدون تغییرات اضافی دارید.3. کار با ساختارهای پیچیده: در صورتی که با ساختارهای داده پیچیده و چند بعدی کار میکنید که شامل زیرساختارهای تودرتو و ارتباطات گلوبال هستن، deep clone به شما امکان میده تا یک کپی کامل از این ساختارها را بسازید بدون ایجاد پیچیدگی‌های اضافی در تعاملات آنها.خب بریم سراغ کد این روش صرفا حل مشکل داخل زبان php هستش بازم میگم cast کردن این موضوع به زبان مربوطه زحمت خودتونه خب اینجا دو تا کلاس داریم به اسم SubObject و MyCloneable که اومدم یک نمونه از MyCloneable برای خودم درست کردم و اومدم مقدار property داخل نمونه MyCloneable که object1 رو برابر با یک نمونه از کلاس Subobject قرار دادم بعد توسط مجیک متد __clone اومدم clone گرفتم از نمونه ابجکت ام اینطوری تمام ویژگی ها کلاس مدنظرم کپی میشه داخل نمونه clone شده obj2 و بدون دردسر میتونم یک انشعاب بدون دردسر از کلاس خودم بگیرم نکته بسی مهم : مراقب باشید که استفاده از deep clone در برخی موارد ممکن هست سنگین باشد و هزینه‌های زمانی و حافظه رو بالا ببره، به خصوص زمانی که داده‌ها بسیار بزرگ و پیچیده هستن. در این صورت، ممکن است نیاز باشد به جای deep clone، از روش‌های دیگه ای مثل شبه کپی (shallow copy) یا استفاده از اشتراک‌گذاری داده‌ها استفاده کنید.