برنامه نویسی

“چرا ترکیب بهتر از وراثت در OOP است: یک راهنمای عملی برای پاک کننده کد”

مقدمه
در دنیای برنامه نویسی شی گرا (OOP) ، توسعه دهندگان اغلب با معضل انتخاب بین وراثت و ترکیب برای به اشتراک گذاشتن و استفاده مجدد از کد روبرو هستند. در حالی که وراثت مدتهاست که یک اصل اساسی OOP بوده است ، می تواند منجر به سلسله مراتب طبقاتی بسیار پیچیده و سفت و سخت شود که حفظ آن دشوار است. از طرف دیگر ، ترکیب یک رویکرد انعطاف پذیر و مدولار برای ساخت نرم افزار ارائه می دهد. در این مقاله ، ما بررسی خواهیم کرد که چرا ترکیب اغلب انتخاب بهتری نسبت به وراثت است و اینکه چگونه می تواند به کد پاک تر و قابل حفظ تر منجر شود.

پیچیدگی سلسله مراتب وراثت
وراثت به کلاسها اجازه می دهد تا خواص و رفتارهای خود را از طبقه والدین ارث برده و سلسله مراتب را تشکیل دهند. در حالی که این در ابتدا می تواند مانند یک راه حل زیبا به نظر برسد ، به سرعت منجر به پیچیدگی می شود ، به خصوص در زنجیره های میراث عمیق. هنگامی که یک سیستم کلاس دارای چندین سطح وراثت است ، درک روابط و لحظه های کپسوله سازی به طور فزاینده ای دشوار می شود. هر زیر کلاس ممکن است رفتارهایی را از کلاس والدین خود نادیده بگیرد یا گسترش دهد و منجر به یک شبکه وابستگی های درهم تنیده شود.

مسائل محصور سازی: یکی از اصول اصلی OOP ، محاصره است – نگه داشتن وضعیت داخلی یک شی پنهان و محافظت شده. سلسله مراتب وراثت عمیق می تواند محاصره را محو کند ، زیرا زیر کلاس ها به داخلی کلاس های والدین خود دسترسی پیدا می کنند. این می تواند منجر به عوارض جانبی ناخواسته هنگام اصلاح کلاس های پایه ، شکستن اصل محاصره شود.

جفت محکم و ساختارهای سفت و سخت
وراثت یک جفت محکم بین کلاسهای پایه و مشتق ایجاد می کند. زیر کلاس ها به کلاسهای پایه خود وابسته هستند و تمام خصوصیات و روشهای آنها را به ارث می برند. این اتصال تنگ به این معنی است که تغییر در یک کلاس پایه می تواند اثر موج دار داشته باشد و بر همه زیر کلاس ها تأثیر بگذارد. این استحکام سازگاری سیستم با الزامات جدید یا استفاده مجدد از کد در زمینه های مختلف را دشوار می کند.

ترکیب انعطاف پذیری را فراهم می کند: ترکیب راهی برای جدا کردن کلاس ها و ساخت سیستم های انعطاف پذیر تر ارائه می دهد. به جای ارث رفتار ، کلاس ها می توانند از کلاس های دیگر تشکیل شوند و اجازه می دهند بدون ایجاد یک سلسله مراتب سفت و سخت ، رفتار به اشتراک گذاشته و دوباره مورد استفاده قرار گیرد. با استفاده از ترکیب ، می توانید بدون تأثیرگذاری بر کل سیستم ، قسمت هایی از یک شی را جایگزین یا اصلاح کنید.

به نفع ترکیب بیش از وراثت
اصل “ترکیب لطف بیش از وراثت” توسعه دهندگان را ترغیب به استفاده از ترکیب برای ساخت سیستم های مدولار و انعطاف پذیر تر می کند. در ترکیب ، اشیاء با استفاده از اشیاء دیگر به عنوان مؤلفه ساخته می شوند. هر مؤلفه مسئولیت مشخصی دارد و آنها برای دستیابی به رفتار مورد نظر با هم کار می کنند.

استفاده مجدد از طریق ترکیب: به جای اینکه تمام عملکردهای یک کلاس پایه را به ارث ببرد ، ترکیب به شما امکان می دهد کلاسهای کوچکتر و متمرکز تری ایجاد کنید که در ترکیب های مختلف قابل استفاده مجدد باشد. این رویکرد گرانول شما را قادر می سازد با آهنگسازی مؤلفه های ساده تر و قابل کنترل تر رفتار پیچیده ای ایجاد کنید.

قابلیت حفظ و قابلیت آزمایش افزایش یافته
ترکیب منجر به سیستم هایی می شود که نگهداری و گسترش آنها آسان تر است. هنگام استفاده از ترکیب ، می توانید مؤلفه های فردی را به طور مستقل اصلاح یا جایگزین کنید و خطر عوارض جانبی ناخواسته را کاهش دهید. این طرح مدولار درک و اصلاح سیستم با تغییر نیازها را آسان تر می کند.

قابلیت آزمایش بهتر: با ترکیب ، شما به طور معمول با کلاسهای کوچکتر و متمرکز تر که آزمایش در انزوا آسان تر هستند ، به پایان می رسید. وابستگی ها را می توان تزریق و تمسخر کرد و امکان آزمایش جامع تر را فراهم کرد. این باعث بهبود پوشش تست کلی و استحکام سیستم می شود.

نمونه های دنیای واقعی
برای نشان دادن مزایای ترکیب ، بیایید چند مثال را در نظر بگیریم:

مثال 1: وسایل نقلیه یک سلسله مراتب کلاس وسیله نقلیه را تصور می کنند که در آن ماشین ، کامیون و موتور سیکلت از وسیله نقلیه به ارث می برند. هر زیر کلاس ممکن است روش هایی را برای تفاوت بین این وسایل نقلیه نادیده بگیرد. با استفاده از ترکیب ، می توانید یک کلاس وسیله نقلیه ایجاد کنید که شامل مواردی از کلاس هایی مانند موتور ، چرخ و انتقال باشد. شما می توانید با ایجاد انواع مختلف وسایل نقلیه بدون تغییر در سلسله مراتب کلاس ، این مؤلفه ها را مخلوط و مطابقت دهید.

مثال 2: رفتارهای پرندگان در یک مدل وراثت سنتی ، ممکن است شما یک کلاس پرنده با زیر کلاس هایی مانند Flyingbird و Nonflyingbird داشته باشید. اگر رفتار پرواز تغییر کند ، این مسئله می تواند مشکل ساز شود. با استفاده از ترکیب ، می توانید یک کلاس پرنده داشته باشید که دارای یک جزء Flybehavior باشد. پرندگان مختلف را می توان به رفتارهای مختلف پرواز (یا هیچ یک) اختصاص داد و باعث می شود بدون تغییر در سلسله مراتب کلاس ، رفتار را در زمان اجرا آسان کنید.

وقتی میراث معنا پیدا می کند
در حالی که ترکیب مزایای بسیاری را ارائه می دهد ، هنوز مواردی وجود دارد که وراثت انتخاب صحیح است:

استفاده از روابط “IS-A”: وراثت در صورت وجود رابطه واضح “IS-A” مناسب است. به عنوان مثال ، یک کلاس سگ که از یک طبقه حیوانات به ارث می برد ، اگر رفتار سگ ها اساساً با مفهوم یک حیوان گره خورده باشد ، منطقی است.

چارچوب ها و ابزار: وراثت اغلب در چارچوب ها برای ارائه رفتارهای استاندارد استفاده می شود. به عنوان مثال ، نماهای مبتنی بر کلاس Django از میراث برای تعریف و گسترش عملکرد دیدگاه ها استفاده می کنند. با این حال ، این موارد به طور معمول به خوبی طراحی شده اند تا از مشکلات سلسله مراتب وراثت عمیق جلوگیری کنند.

پایان
ترکیب اغلب در مقایسه با وراثت به کد تمیزتر ، قابل حفظ و انعطاف پذیر منجر می شود. با استفاده از ترکیب ، می توانید سیستم هایی را ایجاد کنید که درک ، آزمایش و گسترش آن آسان تر باشد. شما با ترکیب اجزای ساده رفتارهای پیچیده ای ایجاد می کنید و منجر به یک طراحی مدولار تر می شوید. با این حال ، وراثت منسوخ نیست و هنوز هم جای خود را دارد که رابطه واضح “IS-A” وجود داشته باشد یا وقتی در چارچوب ها استفاده می شود.

با استفاده از ترکیب بیش از وراثت ، شما یک رویکرد مدولار تر در طراحی نرم افزار را در آغوش می گیرید ، و باعث می شود که پایگاه کد شما با گذشت زمان حفظ و تکامل یابد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا