تحدث دورات الاستيراد عندما تقوم حزمتان أو أكثر باستيراد بعضها البعض، إما بشكل مباشر أو غير مباشر، مما يؤدي إلى إنشاء تبعية دائرية.
ما هي دورات الاستيراد؟
في Go، يتم تنظيم التعليمات البرمجية بشكل أساسي في وحدات قابلة للصيانة تسمى 'الحزم'. يمكن أن تعتمد كل حزمة على حزم أخرى، مما يسمح للتطبيق بمشاركة التعليمات البرمجية وتحسين إمكانية القراءة.
تحدث دورات الاستيراد عندما تشكل الحزم سلسلة تبعية دائرية. بمعنى آخر، تستورد الحزمة 'أ' الحزمة 'ب'، وتستورد الحزمة 'ب' الحزمة 'أ' أو حزمة أخرى تستورد الحزمة 'أ' في النهاية.
تخلق هذه العلاقة الدائرية مشكلة لأن نظام البناء الخاص بـ Go لا يمكنه تحديد الترتيب الذي يجب أن يتم به تجميع الحزم مما يؤدي إلى حدوث خطأ.
المنطق وراء دورات الاستيراد
قبل أن نتعمق في التفاصيل التقنية حول سبب حدوث دورات الاستيراد وكيفية تصحيحها، دعونا نتعرف أولاً على السبب وراء عدم دعم دورات الاستيراد في Go.
Go هي لغة مبسطة للغاية ولكنها عالية الكفاءة وتركز بشكل كبير على وقت الترجمة الأسرع بدلاً من وقت التنفيذ.
لذلك، عندما تقوم بتجميع كود Go، يدفع المترجم بشكل كبير على وقت الترجمة بدلاً من كود الجهاز الأكثر كفاءة.
عندما يتعلق الأمر بدورات الاستيراد، يمكن للحزم التي تستورد بعضها البعض أن تزيد بشكل كبير من وقت الترجمة حيث يتم تجميع التعليمات البرمجية في كل مرة يتم فيها تعديل إحدى التبعيات.
يمكنك التفكير في دورات الاستيراد مثل تكرار التبعية اللانهائية غير المباشرة وهو أمر لن يتعامل معه مترجم Go بلطف.
يمكن أن تؤدي أيضًا إلى تسرب الذاكرة حيث يرتبط كل كائن بالآخر ولن يصل المرجع أبدًا إلى الصفر. يصبح تنظيف هذه الكائنات أكثر من مرهق.
لماذا تحدث دورات الاستيراد؟
فيما يلي بعض الأسباب التي قد تواجهها عند استيراد الدورات في قاعدة التعليمات البرمجية الخاصة بك:
تصميم ضعيف للحزم – ربما، باعتبارك مطورًا جديدًا لـ Golang، يمكنك إنشاء حزم ذات تبعيات معقدة للغاية والتي يمكن أن تؤدي إلى دورات استيراد.
مشكلات إعادة البناء - هناك سبب آخر وراء إنشاء دورات الاستيراد في Go وهو إعادة هيكلة الكود. قد تؤدي محاولة إنشاء رمز قابل لإعادة الاستخدام إلى إنشاء دورات الاستيراد.
عدم وجود إدارة التبعية - عدم استخدام أداة إدارة التبعية المناسبة مثل وحدات Go يمكن أن يجعل من الصعب تتبع وإدارة تبعيات الحزمة.
الواجهات المشتركة – إذا كانت الحزم المتعددة تعتمد على واجهة مشتركة، فقد يؤدي ذلك إلى تبعيات دائرية.
مثال على دورة الاستيراد
دعونا ننشئ مثالًا بسيطًا لتوضيح دورات الاستيراد في Go.
لنفترض أن لدينا حزمة تسمى 'PackageX' و'PackageY'. في الكود الخاص بنا، يعتمد 'PackageX' على 'PackageY' ويعتمد 'PackageY' على 'PackageX'.
فيما يلي رمز مثال لـ 'PackageX':
طَرد packageXيستورد (
'إف إم تي'
'الحزمة ص'
)
func وظيفة () {
fmt . برينتلن ( 'الوظيفة في الحزمة أ' )
الحزمةY . وظيفة ()
}
فيما يلي رمز مثال لـ 'PackageY':
طَرد الحزمةYيستورد (
'إف إم تي'
'الحزمةX'
)
func وظيفة () {
fmt . برينتلن ( 'الوظيفة في الحزمة ب' )
packageX . وظيفة ()
}
في هذا المثال، يستورد 'packageX' 'packageY' ويستورد 'packageY' 'packageX'، مما يؤدي إلى إنشاء دورة استيراد.
سيؤدي تشغيل الكود السابق إلى ظهور خطأ 'دورة الاستيراد غير مسموح بها'.
طَرد packageXحزمة الوارداتY
حزمة الوارداتX
إصلاح دورات الاستيراد في Go
لإصلاح دورة الاستيراد، كل ما تحتاجه هو إعادة هيكلة التعليمات البرمجية وإزالة التبعية الدائرية مع الاحتفاظ بالوظيفة.
استخراج الواجهات
إذا كانت الحزم تسبب تبعية دائرية بسبب الواجهة المشتركة، فيمكنك نقل الواجهات إلى حزمة منفصلة. بهذه الطريقة، يمكن لكل حزمة استيراد حزمة الواجهة دون التسبب في حدوث دورة.
انقلاب التبعية
تطبيق مبدأ انعكاس التبعية (DIP) من خلال تحديد الواجهات المجردة في حزمة المستوى الأعلى وتنفيذها في حزمة المستوى الأدنى. وهذا يقلل من التبعيات المباشرة بين الحزم.
خاتمة
في هذا البرنامج التعليمي، تعرفنا على دورات الاستيراد في Go. وتعرفنا أيضًا على دورات الاستيراد ومثال دورة الاستيراد وطرق إصلاحها.