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

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

اشیایی که از طریق همدستی باهم مرتبط هستند، را اینگونه می‌توان تصور کرد که نسبت به همدستی‌شان یک «نقش»  را بازی می‌کنند، این موضوع وقتی رخ می‌دهد که حالت فعلی شیء (در وضعیت فعال)، به دیگر اشیاء همدست، امکان استفاده از شیء را به روش تعیین‌شده توسط نقش بدهد. از نقش می‌توان در تفکیک «دو شیء یک کلاس» موقعی که استفاده از آن‌ها را در زمینه همدستی توصیف می‌کنیم، استفاده کرد. یک نقش یا role، «جنبه‌های همگانی یا public» یک شیء در زمینه همدستی را توصیف می‌کند.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

## پانویس

## منابع
* 


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