DIP vs IoC vs DI في عالم Android

سئلت مؤخرًا في مقابلة: "ما هو الفرق بين حقن التبعية ومبدأ انعكاس التبعية من SOLID". كنت أعرف تعريف كل منهما ، لكن لم أتمكن من رسم خط واضح بين هذه المفاهيم. في هذه المقالة ، أريد أن أصف باختصار الاختلاف بين مفاهيم مبدأ انعكاس التبعية (DIP) وانعكاس التحكم (IoC) وحقن التبعية (DI) باستخدام مثال معمارية خالصة وإطار عمل Android. إذا هيا بنا.



مبدأ انعكاس التبعية



تعريف

يجب ألا تعتمد الوحدات عالية المستوى على وحدات المستوى المنخفض. يجب أن يعتمد كلا النوعين من الوحدات النمطية على الأفكار المجردة.

ب. يجب ألا تعتمد الملخصات على التفاصيل. يجب أن تعتمد التفاصيل على التجريد.


يتضمن التعريف الأول مفهوم "الوحدة النمطية". هذا مفهوم مهم للغاية لا يمكن فهم DIP بدونه.



وحدة - مجموعة مترابطة منطقيًا من العناصر الوظيفية



لتجنب سوء الفهم ، ضع في اعتبارك التعريفات باستخدام مثال. لنفترض أننا بحاجة إلى الحصول على قائمة بالكتب المقروءة وعرضها على المستخدم. لهذا سنستخدم فصول BooksInteractor و BooksRepository. نضع كل فئة من هذه الفئات في وحدتها BI و BR ، على التوالي. تعتمد وحدة فئة BooksInteractor على فئة BooksRepository.







BooksInteractor'y بحاجة إلى الحصول على قائمة بالكتب من BooksRepository. لا يهتم Interactor على الإطلاق بكيفية تلقي المستودع لهذه البيانات ، مما يعني أنه في هذه الحالة ، يعد BooksInteractor تجريدًا لمخزن Books. وفقًا للتعريف الثاني ، يجب ألا يعتمد BooksInteractor (التجريد) على BooksRepository (التنفيذ). من ناحية أخرى ، يجب أن يعرف المستودع وحدة BI. إذن ماذا يحدث: يجب أن يكون المتفاعل داخل المستودع؟ لا ، لعكس التبعيات ، نحتاج فقط إلى تغطية BooksRepository بواجهة IBooksRepository ، ووضع هذه الواجهة في وحدة فئة BooksInteractor. لنعد الآن إلى التعريف الأول لـ DIP ونلقي نظرة على الرسم التخطيطي.







انظر ، وحدات المستوى الأعلى (وحدة BI) لا تعتمد على وحدات المستوى الأدنى (وحدة BR). وتعتمد كلتا الوحدتين على تجريد (من واجهة IBooksRepository). إذا اكتشفت سحر انعكاس التبعية من خلال تغطية مستودع بواجهة ، فإنك تفهم مبدأ انعكاس التبعية. تهانينا! اصعب جزء تفهمه يمكنك قراءة المزيد عن DIP في هذا المقال على Habré.



قلب السيطرة



درسنا مفهوم "مبدأ انعكاس التبعية". الآن دعنا ننتقل إلى انعكاس آخر - انعكاس التحكم. المفهوم بحد ذاته واسع جدًا ويمكن أن يعني في البرمجة واحدًا من ثلاثة أشياء:



  1. انعكاس الواجهات - تفويض العلاقة بين الوحدات إلى واجهة وسيطة. أين تنطبق؟ على سبيل المثال ، في DIP ، الذي درسناه سابقًا.
  2. — (, DI/IOC ).
  3. — , . , , — Android . Activity Fragment, .


Dependency Injection



حقن التبعية آلية لتمرير تبعياتها إلى فئة. تصادف هذا دائمًا عندما تحتاج إلى تمرير التبعية إلى فئة أخرى. هناك عدة طرق لحقن التبعيات: من خلال المُنشئ (Constructor Injection) ، ومن خلال طريقة (طريقة الحقن) ومن خلال خاصية (Property Injection). كل من هذه الأساليب تستخدم لأغراضها الخاصة. ولكن من المهم هنا أن نفهم أن حقن التبعية هو مجرد تمرير تبعية لمنشئ أو طريقة أو خاصية.



النظر في حالات الحافة



  • هل يمكن أن يكون هناك DI بدون IoC و DIP؟ نعم ممكن. نقوم بإنشاء مثيل لفئة ملموسة A ونمررها إلى كائن من الفئة B من خلال مُنشئ أو طريقة أو خاصية.
  • هل يمكن أن يكون هناك DIP بدون IoC؟ لا ، DIP هي إحدى طرق تطبيق Interface Inversion في IoC.
  • هل يمكن أن يكون هناك DIP بدون DI؟ نعم ، يمكننا ربط الوحدات السفلية بالواجهة. ستعمل فئات الوحدات العليا مع تجريد الواجهة ، ولكن سيتم إنشاء التنفيذ الملموس لفئة الوحدة النمطية السفلية في مُنشئ الوحدة النمطية العليا.


يمكنك معرفة الاختلافات بين DIP، DI واللجنة الاولمبية الدولية من مؤلفين آخرين هنا و هنا .



يسعدني تلقي تعليقاتكم وملاحظاتكم!



All Articles