مرجع
آخر الزيارات

عكس التحكم

1٬390 كلمة•0 مشاهدة•🗒️ منذ يوم
باختصار: في هندسة البرمجيات، يعد عكس التحكم (IoC) مبدأ في البرمجة. تجد هنا «}»، «وصف» و«خلفية» ضمن 8 أقسام.
المحتويات
  1. }
  2. وصف
  3. خلفية
  4. استخدام نمط التصميم الاستراتيجيstrategy design pattern
  5. نظرة عامة
  6. تقنيات التنفيذ
  7. }
  8. أمثلة

في البداية، في هندسة البرمجيات، يعد عكس التحكم (IoC) مبدأ في البرمجة. يعكس IoC تدفق التحكم flow of control مقارنة بتدفق التحكم التقليديtraditional control flow. في IoC ، تتلقى أجزاء مكتوبة خصيصًا custom-written portions من برنامج الكمبيوتر تدفق التحكم من إطار عامgeneric framework. إن هندسة البرمجيات software architectureمع هذا التصميم تعكس التحكم مقارنة بالبرمجة الإجرائية procedural programming التقليدية: في البرمجة التقليدية، الرمز code المخصص الذي يعبر عن الغرض من البرنامج يستدعي callsمكتبات libraries قابلة لإعادة الاستخدام لرعاية المهام العامة generic tasks، ولكن مع عكس التحكم، فهو الإطارframework الذي يستدعي الرمز code المخصصcustom أو الخاص بالمهمة task-specific. ونتناول فيما يلي مزيدًا من التفاصيل.

وفي هذا السياق، يستعمل عكس التحكم لزيادة نمطيةmodularity البرنامج وجعله قابلاً للتوسيع extensible، ولديه تطبيقات في البرمجة الشيئيةobject-oriented programming ونماذج البرمجة programming paradigmsالأخرى. استعمل مايكل ماتسونMichael Mattsson هذا المصطلح في أطروحة، مأخوذة من هناك بواسطة ستيفانو مازوتشي Stefano Mazzocchiوشاعه في سنة 1999 في مشروع مؤسسة برمجيات أباتشي البائدdefunct Apache Software Foundation project ، أفالون-Avalon> ، ثم تم تعميمه في سنة 2004 من قبل روبرت سي مارتن Robert C. Martinو مارتن فاولرMartin Fowler .

ومن ناحية أخرى، يرتبط المصطلح بمبدأ انقلاب التبعية dependency inversion principle، ولكنه يختلف عنه، والذي يهتم بفصل التبعياتdecoupling dependencies بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال التجريداتabstractions المشتركة. يرتبط المفهوم العام كذلك بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث event loopوإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..

}

ومن جهة أخرى، } يعطي هذا المخطط التفصيلي الأساسيbasic outline في Java مثالاً على التعليمات البرمجية باتباع منهجية IoC. من المهم، مع ذلك، أن فيServerFacade يتم إجراء الكثير من الافتراضاتassumptions حول البياناتdata التي يتم إرجاعهاreturned بواسطة كائن الوصول إلى البيانات object (DAO).

وفي هذا الصدد، على الرغم من أن كل هذه الافتراضات قد تكون صالحة في وقت ما، إلا أنها ترتبط ب ServerFacade لتنفيذ DAO. سيؤدي تصميم التطبيق بطريقة قلب التحكم إلى تسليم عنصر التحكم بالكامل hand over the control completelyإلى DAO object. ثم يصبح الكود code

  • public class ServerFacade {
  • public V respondToRequest(K request, DAO dao) {
  • return dao.getData(request);

وصف

وفي هذا السياق، في البرمجة التقليدية traditional programming، يتم تحديد تدفق منطق الأعمال the flow of the business logic بواسطة كائناتobjects مرتبطة بشكل ثابت ببعضها"Static binding" statically bound البعض. مع عكس التحكم، يعتمد التدفق flow على الرسم البياني للكائن object graphالذي تم إنشاؤه أثناء تنفيذ البرنامج. مثل هذا التدفق الديناميdynamic flow أصبح ممكنا من خلال تفاعلات الكائن object interactionsالتي يتم تعريفها من خلال التجريدabstractions. يتم تحقيق هذا الربط في وقت التشغيل "run-time binding بواسطة آليات مثل حقن التبعية dependency injection أو محدد مواقع الخدمة service locator. في IoC ، يمكن كذلك ربط الكود بشكل ثابت linked statically أثناء التجميع compilation، ولكن العثور على الكود ليتم تنفيذه من خلال قراءة وصفه من التكوين الخارجي external configuration بدلاً من مرجع مباشرdirect reference في الكود نفسه.

وفي السياق ذاته، في حقن التبعية dependency injection، يقترن الكائن objectبالوحدة التابعة بالكائن dependent object or module الذي يحتاجه في وقت التشغيل run time. . لا يمكن عادةً معرفة الكائن المعين particular object الذي سيلبي التبعية satisfy the dependency أثناء تنفيذ البرنامجprogram execution في وقت الترجمةcompile time باستخدام التحليل الثابتcompile time . بينما تم وصفه من حيث تفاعل الكائنobject interaction هنا، يمكن تطبيق المبدأ على منهجيات البرمجة الأخرى إلى جانب البرمجة الموجهة للكائنات object-oriented programming.

في هذا الإطار، لكي يقوم البرنامج الجاريrunning program بربط الكائناتbind objects ببعضها البعض، يجب أن تمتلك الكائنات واجهات متوافقة ompatible interfaces. مثلًا، قد تقوم الفئة class A بتفويض السلوك للواجهة I interfaceالتي يتم تنفيذها بواسطة الفئة class B ؛ يعمل البرنامج على إنشاء A و B ، ثم حقن B في A

خلفية

من جهة ثانية، إن عكس التحكم ليس مصطلحًا جديدًا في علوم الكمبيوتر. يتتبع مارتن فاولرMartin Fowler أصل العبارة حتى عام 1988، ولكنها ترتبط ارتباطًا وثيقًا بمفهوم عكس البرنامج program inversionالذي وصفه مايكل جاكسونMichael Jackson في منهجيتهmethodology في البرمجة جاكسون المنظمة في السبعينيات. يمكن رؤية المحلل من الأسفل إلى الأعلىbottom-up parser على أنه انعكاس للمحلل من أعلى لأسفلtop-down parser : في الحالة الأولى، يقع عنصر التحكم على المحلل اللغوي parser، بينما في الحالة الأخرى، يقع على عاتق تطبيق الاستلام receiving application.

ومن جهة أخرى، حقن التبعية Dependency injectionهو نوع معين من IoC. يشبه محدد الخدمة مثل Java Naming and Directory Interface (JNDI). في مقال كتبه Loek Bergman ، تم تقديمه كمبدأ معماريarchitectural principle.

كذلك، في مقال بقلم روبرت سي مارتن Robert C. Martin، يأتي مبدأ انعكاس التبعية dependency inversion principleوالتجريدabstraction عن طريق الطبقات معا layering come together. إن سبب استخدام مصطلح «الانقلاب» inversion بالمقارنة مع طرق تطوير البرمجيات التقليدية. يصف فك ربط الخدماتuncoupling of services عن طريق تجريد الطبقاتabstraction of layers عندما يتحدث عن انعكاس التبعية dependency inversion. يستعمل المبدأ لمعرفة أين توجد حدود النظام في تصميمdesign طبقات التجريدabstraction layers..

استخدام نمط التصميم الاستراتيجيstrategy design pattern

وفي هذا الصدد، في مقال أصلي لمارتن فاولرMartin Fowler ، تمت مناقشة التقنيات الثلاثة الأولى. في وصف حول عكس أنواع التحكم، تم ذكر النوع الأخير. غالبًا ما يتم إنجاز البحث السياقي contextualized lookupباستخدام محدد مواقع الخدمة service locator

نظرة عامة

ومن جهة أخرى، لتحرير الوحدات النمطية free modulesمن الافتراضات assumptions حول كيفية قيام الأنظمة الأخرى بما تفعله وبدلاً من ذلك تعتمد على العقود contracts.

لمنع الآثار الجانبية side effectsعند استبدال الوحدة module.

من جهة ثانية، كمثال، مع البرمجة التقليدية، قد تقوم الوظيفة الرئيسية main functionللتطبيق بإجراء استدعاءات وظيفية في قائمة مكتبة menu library لعرض قائمة بالأوامر commands المتاحة والاستعلام query عن المستعمل لاختيار واحد. وبالتالي ستعيد المكتبة الخيار الذي تم اختياره كقيمة استدعاء الدالة the value of the function call، وتستعمل الدالة الرئيسية main function هذه القيمة لتنفيذ الأمر المرتبطexecute the associated command.. كان هذا النمط شائعًا في الواجهات القائمة على النصtext based interfaces . مثلًا، قد يعرض عميل البريد الإلكتروني email client شاشة تحتوي على أوامر لتحميل بريد جديد، والإجابة على البريد الحالي، وبدء بريد جديد، وما إلى ذلك، وسيحظر تنفيذ البرنامج حتى يضغط المستعمل على مفتاح key لتحديد أمرcommand.

وفي هذا السياق، مع عكس التحكم inversion of control، من ناحية أخرى، سيتم كتابة البرنامج باستخدام إطار برنامجsoftware framework يعرف العناصر السلوكية common behavioral والرسوم البيانية الشائعة graphical elements ، مثل أنظمة النوافذ windowing systems والقوائم menusوالتحكم في الفأرة controlling the mouse وما إلى ذلك. الرمز المخصصcustom code «يملأ الفراغات» للإطارframework ، مثل توفير جدول عناصر القائمة menu items وتسجيل روتين فرعيregistering a code subroutine لكل عنصرitem ، ولكن الإطارframework الذي يراقبmonitors إجراءات المستعملuser's actions ويستدعي الروتين الفرعي invokes the subroutine عند تحديد عنصر قائمة menu item. في مثال عميل البريدmail client ، يمكن أن يتبع الإطار كلاً من إدخالات لوحة المفاتيح والفأرة ويستدعي الأمر الذي يستدعيهinvoked المستعمل بأي من الوسائل، وفي الوقت نفسه يراقبmonitor واجهة الشبكة network interfaceلمعرفة ما إذا كانت الرسائل الجديدة تصل وتحديث الشاشة refresh the screen عندما تم الكشفdetected عن نشاط الشبكة network activity. يمكن استخدام نفس الإطارframework كالهيكل العظميskeleton لبرنامج جداول البيانات spreadsheet programأو محرر النصوص text editor. على العكس من ذلك، لا يعرف الإطار شيئًا عن متصفحات الويب أو جداول البيانات أو محرري النصوص؛ يتطلب تنفيذ وظائفهمfunctionality رمزًا مخصصًاcustom code.

من جهة ثانية، إن انعكاس التحكم يحمل دلالة قوية strong connotation على أن الكود القابل لإعادة الاستخدام والرمز الخاص بالمشكلة problem-specific يتم تطويرهما بشكل مستقل على الرغم من أنهما يعملان معًا في تطبيق. إطار عمل Software frameworks، الاسترجاعات callbacks، المنظمونschedulers ، حلقات الحدث<a event loops ، حقن التبعيةdependency injection ، وطريقة قالب أمثلة من أنماط التصميمdesign patterns التي تتبع مبدأ انعكاس السيطرة inversion of control principle، ايضاً المصطلح أكثر شيوعا في سياق البرمجة كائنية التوجه object-oriented programming. .

وفي هذا الصدد، أحيانًا ما يُشار إلى انقلاب السيطرة بشكل ظاهري باسم «مبدأ هوليوود: لا تتصل بنا، نحن من سيتصل بك».

  • يخدم عكس التحكم Inversion of control اهداف التصميم design التالية:
  • فصلdecouple تنفيذ المهمة execution of a task عن التنفيذimplementation.
  • لتركيز الوحدة النمطية module على المهمة المصممة لها.

تقنيات التنفيذ

علاوةً على ذلك، في البرمجة الشيئية class ، هناك الكثير من التقنيات الأساسية لتنفيذ عكس التحكم. وهذه هي:

  • استخدام نمط محدد مواقع الخدمة service locator pattern
  • استخدام حقن التبعية ، مثلًا
  • حقن المنشئConstructor injection
  • حقن المعلمة Parameter injection
  • حقن أفضلSetter injection
  • حقن الواجهة Interface injection
  • استخدام بحث سياقي contextualized lookup
  • باستخدام نمط تصميم طريقة القالب

}

  • انظر كذلك
  • برمجة جانبية المنحى
  • استمرارية
  • روتين المقاطعة
  • المراقب
  • نمط محدد موقع الخدمة
  • إطار عمل
  • نموذج الإستراتيجية
  • تحويل لغة الأسلوب الموسع
  • المراجع
  • روابط خارجية

إضافةً إلى ذلك، } يوضح المثال أن الطريقة التي respondToRequestالطريقة يحدد ما إذا كان IoC مستعملًا. إنها الطريقة التي يتم بها استخدام المعلماتparameters التي تحددdefine IoC IoC. يشبه هذا نمط تمرير الرسائل message-passingالذي تستعمله بعض لغات البرمجة الشيئية object-oriented programming.

أمثلة

من جهة ثانية، أغلب الأطرMost frameworks مثل . NET أو Enterprise Java يعرض هذا النمطpattern : public class ServerFacade {

  • public V respondToRequest(K request) {
  • if (businessLayer.validateRequest(request)) {
  • Data data = DAO.getData(request);
  • return Aspect.convertData(data);
  • }
  • return null;

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.