۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

ترکیب در مقابل وراثت در OOP و C#

مفاهیم کلیدی پشت ترکیب و وراثت را درک کنید که به شما امکان می دهد انواع قابل استفاده مجدد و انعطاف پذیر را در برنامه های NET خود بسازید.

مفاهیم کلیدی پشت ترکیب و وراثت را درک کنید که به شما امکان می دهد انواع قابل استفاده مجدد و انعطاف پذیر را در برنامه های NET خود بسازید.

دو مفهوم کلیدی در برنامه نویسی شی گرا (OOP) وراثت و ترکیب هستند. در حالی که هر دو می توانند به شما در استفاده مجدد از کد کمک کنند، تفاوت های کلیدی بین آنها وجود دارد. وراثت رفتار و رابط‌های مشترکی را برای کلاس‌های شما ایجاد می‌کند، در حالی که ترکیب کلاس‌های موجود را برای ایجاد اشیاء پیچیده‌تر ترکیب کرده و مجدداً استفاده می‌کند.

در این مقاله، به این دو مفهوم OOP می پردازیم و متوجه می شویم که چه زمانی، چرا و چگونه از آنها در برنامه های NET خود استفاده کنیم. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید

ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را دنبال کنید تا یک پروژه برنامه کاربردی کنسول NET Core جدید در Visual Studio ایجاد کنید.

  1. Visual Studio IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود” که در ادامه نشان داده شده است، نام و مکان پروژه جدید را مشخص کنید.
  6. بعدی را کلیک کنید
  7. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 7.0 (Standard Term Support)» را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
  8. روی ایجاد کلیک کنید.

ما از این پروژه برای کار با نمونه‌های وراثت و ترکیب در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

قابلیت استفاده مجدد در برنامه نویسی شی گرا

از آغاز برنامه نویسی کامپیوتری، چالش های مختلف برنامه نویسی رویکردها، پارادایم ها و سبک های معماری متفاوتی را ایجاد کرده است. یکی از پارادایم‌هایی که برای چندین دهه وجود داشته است، برنامه‌نویسی شی گرا است. پارادایم OOP چندین مزیت از جمله قابلیت نگهداری، توسعه پذیری و استفاده مجدد از کد را ارائه می دهد.

آموزش جنگو: با Django 5.0 شروع کنید

یکی از مزایای کلیدی OOP قابلیت استفاده مجدد کد است. شما می توانید به دو روش مختلف به این امر دست یابید، یا از طریق وراثت (رابطه است) یا با ترکیب (دارای رابطه). مفاهیم ترکیب و وراثت هر دو برای OOP اساسی هستند، اما رویکردها و مفاهیم آنها متفاوت است.

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

وراثت در OOP چیست؟ چرا باید از آن استفاده کنید؟

در وراثت، یک کلاس خصوصیات و رفتارها را از کلاس دیگری به ارث می برد، به جز مواردی که خصوصی هستند. رابطه ارثی بین کلاس ها به عنوان یک رابطه “است” توصیف می شود (مشتری یک فرد است)، که در آن یک زیر کلاس نسخه تخصصی سوپرکلاس آن در نظر گرفته می شود.

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

ارث بری چندین مزیت دارد:

  • وارثت با اجازه دادن به شما برای ایجاد کلاس های پایه که حاوی توابع مشترکی هستند که کلاس های مشتق شده باید به ارث بری بروند، توسعه پذیری را ارتقا می دهد.
  • وارث به شما کمک می کند اشیاء دنیای واقعی و روابط آنها را در انواع انتزاعی ترسیم کنید.
  • وارثت افزونگی کد را به حداقل می‌رساند و هزینه‌های توسعه و نگهداری را کاهش می‌دهد زیرا می‌توانید از کد موجود مجددا استفاده کنید.
  • وارثت تضمین می‌کند که کلاس‌های فرعی از یک رابط استاندارد پیروی می‌کنند.
9 دلیلی که SQL باید از کار بیفتد

اما، وراثت معایبی نیز دارد:

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

از وراثت در OOP و C# استفاده کنید

برای پیاده سازی وراثت در سی شارپ، باید از کلمه کلیدی extends همانطور که در قطعه کد زیر نشان داده شده است استفاده کنید.

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
}
public class Customer: Person
{
    //Write the members of the customer class here
}
public class Supplier : Person
{
    //Write the members of the supplier class here
}

ترکیب در OOP چیست؟ چرا باید از آن استفاده کنید؟

Composition مکانیزمی است که به یک نمونه یا شی از یک کلاس اجازه می دهد تا نمونه هایی از همان کلاس ها یا کلاس های دیگر را در خود داشته باشد. این یک رابطه “has a” بین کلاس ها برقرار می کند (یک نویسنده کتابی دارد)، که در آن یک کلاس حاوی یک شی از کلاس دیگر است.

Composition کلاس‌های موجود را برای ایجاد کلاس‌های پیچیده‌تر ترکیب می‌کند که استفاده مجدد از کد را ترویج می‌کند. از آنجا که اشیاء را می توان به صورت پویا در زمان اجرا ترکیب کرد و به راحتی جایگزین یا تغییر داد بدون اینکه بر کل سیستم تأثیر بگذارد، ترکیب بندی انعطاف پذیری و ماژولاریت بیشتری را امکان پذیر می کند.

از ترکیب در OOPS و C# استفاده کنید

قطعه کد زیر نشان می دهد که چگونه می توانید ترکیب را در C# پیاده سازی کنید.

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
}
public class Author
{
    protected List<Book> books = new List<Book>();
    //Other members
}

چرا ترکیب را بر وراثت ترجیح می دهید؟

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

  • همه زیرکلاس های کلاس پایه مجبور خواهند شد به پیاده سازی های رابط پایبند باشند.
  • ممکن است در طول زمان تغییر اجرای کلاس پایه دشوار شود.
  • جفت شدید بین کلاس پایه و همه زیر کلاس‌های آن ممکن است مانع توسعه شود.
مانیتورینگ تله متری مقیاس با InfluxDB

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

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

وقتی نیاز به استفاده مجدد از کد دارید و انواع رابطه “است” ندارند، استفاده از ترکیب را به ارث بری ترجیح دهید. به‌علاوه، اگر انواع شما رابطه «است» ندارند اما به چندشکلی نیاز دارید، از ترکیب با رابط‌ها استفاده کنید.

به عنوان یک قاعده، باید تصمیم بگیرید که ترکیب یا ارث بر اساس نیازهای خاص برای نیازهای شما مناسب تر است یا خیر. یک انتخاب خوب، ترکیب ترکیب و وراثت هنگام توسعه سیستم‌ها برای به دست آوردن بهترین هر دو جهان است. در نهایت، تصمیم بین ترکیب و وراثت به نوع برنامه‌ای که می‌سازید، روابط بین کلاس‌ها و ویژگی‌هایی که می‌خواهید بستگی دارد.