همدستی (برنامه‌نویسی شیءگرا)

رابطه تداعی‌گری یا همدستی  در برنامه‌نویسی شیءگرا، یک رابطه بین کلاس‌های شیء را تعریف می‌کند، که به یک نمونه شیء اجازه می‌دهد تا باعث شود شیء دیگر، عملی را از جانب خودش انجام دهد. این رابطه ساختاری است، زیرا تعیین می‌کند که اشیای نوع خاص به اشیای نوع دیگر متصل هستند، اما رفتار را تعیین نمی‌کند.
بندانگشتی|بالا: یک همدستی دوجهتهوسط: همدستی یک جهته: سرپیکان جهت پیمایش را نمایش می‌دهد.پایین: جلوگیری از (ممنوعیت) وجود همدستی
علیت، در اصطلاح عمومی‌اش، برابر «ارسال یک پیام» یا «فراخوانی یک متد» یا «صدازدن یک عضو تابع» به یک شیء کنترل‌شده است. پیاده‌سازی واقعی همدستی معمولاً نیاز به یک شیء درخواست‌کننده دارد که یک «متد» یا «عضو تابع» را (از طریق یک ارجاع یا اشاره‌گر به محل حافظهٔ شیء کنترل‌شده) فراخوانی کند.

اشیایی که از طریق همدستی باهم مرتبط هستند، را اینگونه می‌توان تصور کرد که نسبت به همدستی‌شان یک «نقش»  را بازی می‌کنند، این موضوع وقتی رخ می‌دهد که حالت فعلی شیء (در وضعیت فعال)، به دیگر اشیاء همدست، امکان استفاده از شیء را به روش تعیین‌شده توسط نقش بدهد. از نقش می‌توان در تفکیک «دو شیء یک کلاس» موقعی که استفاده از آن‌ها را در زمینه همدستی توصیف می‌کنیم، استفاده کرد. یک نقش یا role، «جنبه‌های همگانی یا public» یک شیء در زمینه همدستی را توصیف می‌کند.Booch, Grady. Object-Oriented Design & Programming. Addison-Wesley, 1991.

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

Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994.

این کتاب به الگوریتم‌ها و الگوهای طراحی در برنامه‌نویسی شی‌گرا پرداخته است و روابط مختلف میان اشیاء مانند همدستی را تشریح می‌کند.

Martin, Robert C. Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall, 2008.

این کتاب بر اهمیت نوشتن کد تمیز و نگهداری‌پذیر تمرکز دارد و در آن به استفاده از مفاهیم شی‌گرا برای ساده‌سازی کد و طراحی سیستم‌ها پرداخته شده است.

Weiss, Michael A. Object-Oriented Software Construction. Prentice Hall, 1993.

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

Schildt, Herbert. Java: The Complete Reference. McGraw-Hill Education, 2011.

این کتاب شامل توضیحات گسترده‌ای درباره زبان برنامه‌نویسی Java است و نحوه استفاده از همدستی در آن زبان را به طور کامل شرح می‌دهد.

Liskov, Barbara H. Data Abstraction and Hierarchy. ACM Computing Surveys, 1987.

این مقاله یکی از مباحث پایه‌ای در طراحی شی‌گرا است و در آن به لایه‌بندی و ارتباط بین اشیاء در سیستم‌های شی‌گرا پرداخته شده است.

Bierman, Gregor, and Carl B. Smith. Inheritance and Composition: A Comparison of Two Object-Oriented Design Strategies. IEEE Software, 2004.

این مقاله مقایسه‌ای بین وراثت و ترکیب (Composition) انجام می‌دهد و در آن نحوه استفاده از هرکدام در طراحی سیستم‌های شی‌گرا مورد بحث قرار گرفته است.

Yourdon, Edward; Coad, Peter. Object-Oriented Software Engineering: A Use Case Driven Approach. Prentice Hall, 1999.

این کتاب بر مهندسی نرم‌افزار شی‌گرا تأکید دارد و به نحوه استفاده از همدستی‌ها، ترکیب‌ها و سایر مفاهیم شی‌گرا در طراحی و توسعه نرم‌افزار پرداخته است.

انتهای یک همدستی می‌تواند این مشخصات را داشته باشد:
 می‌تواند شامل فراوانی  باشد، که یک حد بالایی و یک حد پایینی دارد و در قالب «حدپایین..حدبالا» بیان می‌شود.
 می‌تواند شامل یک نام باشد.
 می‌تواند رویت‌پذیری را اعلام کند.
 می‌توان تعیین کرد که آیا انتهای یک همدستی منظم است و/یا یکتا است.

 انواع همدستی 
در این بخش می‌توان انواع همدستی را توضیح داد. برخی از انواع رایج همدستی عبارتند از:

 همدستی یک‌به‌یک (One-to-One): در این نوع همدستی، هر شیء از یک کلاس به یک شیء از کلاس دیگر مرتبط است. به عنوان مثال، یک کلاس Person می‌تواند به یک کلاس Passport ارتباط یک‌به‌یک داشته باشد.
 همدستی یک‌به‌چند (One-to-Many): در این نوع همدستی، یک شیء از کلاس اول می‌تواند به چند شیء از کلاس دوم مرتبط باشد. به عنوان مثال، یک کلاس Department ممکن است با چندین شیء از کلاس Employee ارتباط یک‌به‌چند داشته باشد.
 همدستی چندبه‌چند (Many-to-Many): در این نوع همدستی، چند شیء از یک کلاس به چند شیء از کلاس دیگر مرتبط هستند. برای مثال، یک کلاس Student می‌تواند به چندین کلاس Course مرتبط باشد و بالعکس.

 ویژگی‌های همدستی 
در این بخش می‌توان ویژگی‌های مختلف همدستی‌ها را بررسی کرد. از جمله این ویژگی‌ها می‌توان به موارد زیر اشاره کرد:

 ضریب زندگی (Lifecycle): نحوه‌ی مدیریت عمر و زمان‌بندی زندگی اشیاء در یک ارتباط همدستی.
 جهت‌دار بودن (Directionality): در همدستی‌های جهت‌دار، یک شیء می‌تواند فقط به شیء دیگر دسترسی داشته باشد، در حالی که در همدستی‌های غیرجهت‌دار، هر دو شیء می‌توانند به یکدیگر دسترسی داشته باشند.

 مزایای همدستی 
در این بخش می‌توان به مزایای استفاده از همدستی در برنامه‌نویسی شی‌گرا اشاره کرد:

 کاهش پیچیدگی: همدستی‌ها می‌توانند به کاهش پیچیدگی کد کمک کنند، زیرا اشیاء می‌توانند به‌صورت ساده و طبیعی با یکدیگر ارتباط برقرار کنند.
 تقویت انعطاف‌پذیری: استفاده از همدستی‌ها می‌تواند انعطاف‌پذیری طراحی را افزایش دهد، زیرا امکان تغییر ساختار ارتباطی بین اشیاء به راحتی وجود دارد.

 معایب همدستی 
برخی از معایب استفاده از همدستی در طراحی شی‌گرا عبارتند از:

 وابستگی زیاد: در صورت استفاده نادرست از همدستی‌ها، ممکن است وابستگی‌های زیادی بین اشیاء ایجاد شود که می‌تواند منجر به پیچیدگی‌های بیشتر در کد شود.
 مشکلات نگهداری: در صورتی که تعداد ارتباطات همدستی زیاد باشد، ممکن است نگهداری و مدیریت تغییرات در سیستم دشوار شود.

 نمونه‌هایی از همدستی در زبان‌های مختلف 
در این بخش می‌توان به پیاده‌سازی همدستی در زبان‌های مختلف برنامه‌نویسی اشاره کرد:

Java:public class Department {
    private List<Employee> employees;
}

public class Employee {
    private Department department;
}در این مثال، کلاس Department با کلاس Employee یک همدستی یک‌به‌چند ایجاد می‌کند.

C#:public class Department {
    public List<Employee> Employees { get; set; }
}

public class Employee {
    public Department Department { get; set; }
}Python:class Department:
    def __init__(self):
        self.employees = []

class Employee:
    def __init__(self, department):
        self.department = department

 مقایسه با سایر مفاهیم 
در این بخش، می‌توان همدستی را با سایر مفاهیم مانند ترکیب (Composition) و وراثت (Inheritance) مقایسه کرد:

 همدستی vs. ترکیب: در ترکیب، یک شیء می‌تواند شیء دیگری را در خود نگه دارد، در حالی که در همدستی، اشیاء به‌طور مستقیم به یکدیگر ارتباط دارند.
 همدستی vs. وراثت: وراثت یک رابطه خاص است که در آن یک کلاس ویژگی‌ها و رفتارهای کلاس دیگر را به ارث می‌برد، در حالی که همدستی بیشتر به‌عنوان یک ارتباط طبیعی میان اشیاء در نظر گرفته می‌شود.

 نکات و توصیه‌ها برای طراحی همدستی 

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

 پانویس 

 منابع 


رده:برنامه‌نویسی شیءگرا