---
title: "الاعتمادية الدائرية"
type: "antipattern"
slug: "circular-dependency"
url: "http://localhost:3000/ar/antipatterns/circular-dependency.md"
description: "الاعتماد المتبادل الإشكالي لموديولات البرمجيات"
---
# الاعتمادية الدائرية

> الاعتماد المتبادل الإشكالي لموديولات البرمجيات

في [هندسة البرمجيات](https://en.wikipedia.org/wiki/Software%5Fengineering "Software engineering")، **الاعتمادية الدائرية** (أو **الاعتمادية الحلقية cyclic dependency**) هي علاقة بين موديولين أو أكثر يعتمد كل منهما على الآخر بشكل مباشر أو غير مباشر لكي يعمل بشكل صحيح. وتعرف مثل هذه الموديولات أيضاً بأنها [ذات استدعاء ذاتي متبادل (mutually recursive)](https://en.wikipedia.org/wiki/Mutual%5Frecursion "Mutual recursion").

## نظرة عامة

الاعتمادات الدائرية طبيعية في العديد من [نماذج النطاقات (domain models)](https://en.wikipedia.org/wiki/Domain%5Fmodel "Domain model") حيث تعتمد كائنات معينة من نفس النطاق على بعضها البعض. ومع ذلك، في [تصميم البرمجيات](https://en.wikipedia.org/wiki/Software%5Fdesign "Software design")، تعتبر الاعتمادات الدائرية بين موديولات البرمجيات الأكبر حجماً [نمطاً مضاداً](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") بسبب آثارها السلبية. وعلى الرغم من ذلك، فقد وُجد أن مثل هذه الاعتمادات الدائرية (أو الحلقية) واسعة الانتشار بين ملفات المصدر للبرمجيات في العالم الحقيقي. ومع ذلك، فإن الموديولات ذات الاستدعاء الذاتي المتبادل شائعة إلى حد ما في [البرمجة الوظيفية](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming")، حيث غالباً ما يتم تشجيع التعريفات الاستقرائية والتكرارية.

## المشكلات

يمكن أن تسبب الاعتمادات الدائرية العديد من الآثار غير المرغوب فيها في البرامج الحاسوبية. والأكثر إشكالية من وجهة نظر تصميم البرمجيات هو _الترابط الوثيق [coupling](https://en.wikipedia.org/wiki/Coupling%5F%28computer%5Fprogramming%29 "Coupling (computer programming)")_ للموديولات المعتمدة متبادلاً مما يقلل أو يجعل من المستحيل إعادة استخدام موديول واحد بشكل منفصل.

يمكن أن تسبب الاعتمادات الدائرية [تأثير الدومينو (domino effect)](https://en.wikipedia.org/wiki/Domino%5Feffect "Domino effect") عندما ينتشر تغيير محلي صغير في موديول واحد إلى موديولات أخرى ويكون له آثار عالمية غير مرغوب فيها (أخطاء في البرنامج، أخطاء تجميع). ويمكن أن تؤدي الاعتمادات الدائرية أيضاً إلى استدعاءات ذاتية لانهائية أو إخفاقات غير متوقعة أخرى.

قد تتسبب الاعتمادات الدائرية أيضاً في حدوث [تسريبات للذاكرة (memory leaks)](https://en.wikipedia.org/wiki/Memory%5Fleak "Memory leak") عن طريق منع بعض أنظمة [جمع المهملات التلقائية](https://en.wikipedia.org/wiki/Garbage%5Fcollection%5F%28computer%5Fscience%29 "Garbage collection (computer science)") (تلك التي تستخدم [عد المراجع reference counting](https://en.wikipedia.org/wiki/Reference%5Fcounting "Reference counting")) من إلغاء تخصيص الكائنات غير المستخدمة.

## الأسباب والحلول

في تصميمات البرمجيات الكبيرة جداً، قد يفقد مهندسو البرمجيات السياق ويقومون عن غير قصد بإدخال اعتمادات دائرية. وهناك أدوات لتحليل البرمجيات والعثور على الاعتمادات الدائرية غير المرغوب فيها.

يمكن إدخال اعتمادات دائرية عند تطبيق وظيفة [دالة الاستدعاء الراجع (callback)](https://en.wikipedia.org/wiki/Callback%5F%28computer%5Fprogramming%29 "Callback (computer programming)"). ويمكن تجنب ذلك عن طريق تطبيق [أنماط التصميم (design patterns)](https://en.wikipedia.org/wiki/Software%5Fdesign%5Fpattern "Software design pattern") مثل [نمط المراقب (observer pattern)](https://en.wikipedia.org/wiki/Observer%5Fpattern "Observer pattern").
