افحص التغييرات الفردية
المظهر
تسمح لك هذه الصفحة بفحص المتغيرات التي تم إنشاؤها بواسطة عامل تصفية إساءة الاستخدام لإجراء تغيير فردي.
المتغيرات المولدة لهذا التغيير
متغير | قيمة |
---|---|
عدد التعديلات للمستخدم (user_editcount ) | null |
اسم حساب المستخدم (user_name ) | '2001:16A2:B4A:2800:4A9:55A2:E488:59B3' |
عمر حساب المستخدم (user_age ) | 0 |
المجموعات (متضمنة غير المباشرة) التي المستخدم فيها (user_groups ) | [
0 => '*'
] |
ما إذا كان المستخدم يعدل من تطبيق المحمول (user_app ) | true |
ما إذا كان المستخدم يعدل عبر واجهة المحمول (user_mobile ) | false |
المجموعات العالميَّة التي يمتلكها الحساب (global_user_groups ) | [] |
هوية الصفحة (page_id ) | 7493536 |
نطاق الصفحة (page_namespace ) | 0 |
عنوان الصفحة (بدون نطاق) (page_title ) | 'عكس التحكم' |
عنوان الصفحة الكامل (page_prefixedtitle ) | 'عكس التحكم' |
آخر عشرة مساهمين في الصفحة (page_recent_contributors ) | [
0 => 'JarBot',
1 => '185.200.38.130',
2 => 'AlaaBot',
3 => 'ASammourBot',
4 => 'MenoBot',
5 => 'Mahmoud2013',
6 => 'Mr.Ibrahembot'
] |
عمر الصفحة (بالثواني) (page_age ) | 58746789 |
أول مستخدم ساهم في الصفحة (page_first_contributor ) | 'Mahmoud2013' |
فعل (action ) | 'edit' |
ملخص التعديل/السبب (summary ) | '' |
نموذج المحتوى القديم (old_content_model ) | 'wikitext' |
نموذج المحتوى الجديد (new_content_model ) | 'wikitext' |
نص الويكي القديم للصفحة، قبل التعديل (old_wikitext ) | '{{مقالة غير مراجعة|تاريخ = مايو 2020}}
في [[هندسة البرمجيات]] ، يعد '''عكس التحكم''' ( '''IoC''' ) {{إنج|inversion of control}} مبدأ في البرمجة. يعكس 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.
يستخدم عكس التحكم لزيادة [[برمجة تركيبية|نمطية]][[:en:Modularity (programming)|modularity]] البرنامج وجعله قابلاً للتوسيع [[:en:Extensible programming|extensible]]، <ref>{{استشهاد ويب
| مسار = http://www.laputan.org/drc/drc.html
| عنوان = Designing Reusable Classes
| تاريخ = June–July 1988
| موقع = Journal of Object-Oriented Programming, Volume 1, Number 2
| ناشر = Department of Computer Science University of Illinois at Urbana-Champaign
| صفحات = 22–35
| تاريخ الوصول = 29 April 2014
| الأخير = Ralph E. Johnson & Brian Foote
| مسار أرشيف = https://web.archive.org/web/20191026065057/http://laputan.org/drc/drc.html | تاريخ أرشيف = 26 أكتوبر 2019 }}</ref> ولديه تطبيقات في [[برمجة كائنية التوجه|البرمجة]] [[نمط برمجة|الشيئية]][[:en:Object-oriented programming|object-oriented programming]] ونماذج البرمجة [[:en:Programming paradigm|programming paradigms]]<nowiki/>الأخرى. استخدم مايكل ماتسونMichael Mattsson هذا المصطلح في أطروحة، <ref>{{استشهاد ويب
| مسار = https://www.researchgate.net/publication/2238535
| عنوان = Object-Oriented Frameworks, A survey of methodological issues
| تاريخ = Feb 1996
| الأخير = Michael Mattsson
|مسار أرشيف= https://web.archive.org/web/20200517040540/https://www.researchgate.net/publication/2238535|تاريخ أرشيف=2020-05-17}}</ref> مأخوذة من هناك <ref>{{استشهاد ويب
| مسار = http://www.betaversion.org/~stefano/linotype/news/38/
| عنوان = On Inversion of Control
| تاريخ = Jan 22, 2004
| مسار أرشيف = https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/
| تاريخ أرشيف = 2 February 2004
| الأخير = Stefano Mazzocchi
| وصلة مكسورة = yes | تاريخ الوصول = أغسطس 2020 }}</ref> بواسطة ستيفانو مازوتشي Stefano Mazzocchiوشاعه في عام 1999 في مشروع مؤسسة برمجيات أباتشي البائدdefunct Apache Software Foundation project ، أفالون-Avalon> ، ثم تم تعميمه في عام 2004 من قبل [[روبرت سيسيل مارتن|روبرت سي مارتن]] [[:en:Robert Cecil Martin|Robert C. Martin]]<nowiki/>و [[مارتن فاولر]][[:en:Martin Fowler (software engineer)|Martin Fowler]] .
يرتبط المصطلح بمبدأ انقلاب التبعية [[:en:Dependency inversion principle|dependency inversion principle]]، ولكنه يختلف عنه، والذي يهتم [[اقتران (حاسوب)|بفصل التبعيات]][[:en:Dependency (computer science)|decoupling dependencies]] بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال [[تجريد (حاسوب)|التجريدات]][[:en:Abstraction (computing)|abstractions]] المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event loop|event loop]]<nowiki/>وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..
== نظرة عامة ==
كمثال، مع البرمجة التقليدية، قد تقوم الوظيفة الرئيسية [[:en:Main function|main function]]<nowiki/>للتطبيق بإجراء استدعاءات وظيفية في قائمة مكتبة menu library لعرض قائمة [[أمر (حوسبة)|بالأوامر]] [[:en:Command (computing)|commands]] المتاحة والاستعلام query عن المستخدم لاختيار واحد.<ref name="FowlerDI">[https://martinfowler.com/articles/injection.html Dependency Injection]. {{Webarchive|url=https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html |date=12 مايو 2020}}</ref> وبالتالي ستعيد المكتبة الخيار الذي تم اختياره كقيمة استدعاء الدالة the value of the function call، وتستخدم الدالة الرئيسية main function هذه القيمة لتنفيذ الأمر المرتبطexecute the associated command.. كان هذا النمط شائعًا في [[واجهة مستخدم نصية|الواجهات القائمة على النص]][[:en:Text based interface|text based interfaces]] . على سبيل المثال، قد يعرض [[عميل بريد إلكتروني|عميل البريد الإلكتروني]] [[:en:Email client|email client]] شاشة تحتوي على أوامر لتحميل بريد جديد، والإجابة على البريد الحالي، وبدء بريد جديد، وما إلى ذلك، وسيحظر تنفيذ البرنامج حتى يضغط المستخدم على مفتاح key لتحديد أمرcommand.
مع عكس التحكم inversion of control، من ناحية أخرى، سيتم كتابة [[إطار عمل (برمجة)|البرنامج]] باستخدام [[إطار عمل (برمجة)|إطار برنامج]][[:en:Software framework|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 [[سطح بيني للشبكة|واجهة الشبكة]] [[:en:Network interface|network interface]]<nowiki/>لمعرفة ما إذا كانت الرسائل الجديدة تصل وتحديث الشاشة refresh the screen عندما تم الكشفdetected عن نشاط الشبكة network activity. يمكن استخدام نفس الإطارframework كالهيكل العظميskeleton لبرنامج جداول البيانات spreadsheet programأو محرر النصوص text editor. على العكس من ذلك، لا يعرف الإطار شيئًا عن متصفحات الويب أو جداول البيانات أو محرري النصوص ؛ يتطلب تنفيذ وظائفهمfunctionality رمزًا مخصصًاcustom code.
إن انعكاس التحكم يحمل دلالة قوية strong connotation على أن الكود القابل لإعادة الاستخدام والرمز الخاص بالمشكلة problem-specific يتم تطويرهما بشكل مستقل على الرغم من أنهما يعملان معًا في تطبيق. [[إطار عمل (برمجة)|إطار عمل]] [[:en:Software framework|Software frameworks]]، الاسترجاعات [[:en:Callback (computer programming)|callbacks]]، [[جدولة (حاسوب)|المنظمون]][[:en:Scheduling (computing)|schedulers]] ، حلقات الحدث<a event loops ، حقن التبعيةdependency injection ، و طريقة قالب <template method> أمثلة من [[قالب التصميم (علم الحاسب)|أنماط التصميم]][[:en:Design pattern|design patterns]] التي تتبع مبدأ انعكاس السيطرة inversion of control principle، ايضاً المصطلح أكثر شيوعا في سياق [[برمجة كائنية التوجه|البرمجة كائنية التوجه]] [[:en:Object-oriented programming|object-oriented programming]]. .
يخدم عكس التحكم Inversion of control اهداف التصميم design التالية:
* [[برمجة كائنية التوجه|فصل]][[:en:Object decoupling|decouple]] تنفيذ المهمة execution of a task عن التنفيذimplementation.
* لتركيز الوحدة النمطية module على المهمة المصممة لها.
* لتحرير الوحدات النمطية free modulesمن الافتراضات assumptions حول كيفية قيام الأنظمة الأخرى بما تفعله وبدلاً من ذلك تعتمد على [[تصميم بالعقود|العقود]] [[:en:Design by contract|contracts]].
* لمنع [[تأثير جانبي (علم الحاسوب)|الآثار الجانبية]] [[:en:Side effect (computer science)|side effects]]<nowiki/>عند استبدال الوحدة module.
أحيانًا ما يُشار إلى انقلاب السيطرة بشكل ظاهري باسم "مبدأ هوليوود: لا تتصل بنا، نحن من سيتصل بك".
== خلفية ==
إن عكس التحكم ليس مصطلحًا جديدًا في علوم الكمبيوتر. يتتبع [[مارتن فاولر]][[:en:Martin Fowler (software engineer)|Martin Fowler]] أصل العبارة حتى عام 1988 ، <ref name="FowlerIoC">[https://martinfowler.com/bliki/InversionOfControl.html Inversion of Control] on Martin Fowler's Bliki {{Webarchive|url=https://web.archive.org/web/20200509104127/https://martinfowler.com/bliki/InversionOfControl.html |date=9 مايو 2020}}</ref> ولكنها ترتبط ارتباطًا وثيقًا بمفهوم '''عكس البرنامج program inversionالذي''' وصفه [[مايكل جاكسون (عالم حاسوب)|مايكل جاكسون]][[:en:Michael A. Jackson|Michael Jackson]] في منهجيتهmethodology في البرمجة جاكسون المنظمة<a Jackson Structured Programming> في السبعينيات.<ref>{{استشهاد ويب
| مسار = http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf
| عنوان = Introduction to Jackson Design Method
| مسار أرشيف = https://web.archive.org/web/20180516215640/http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf | تاريخ أرشيف = 16 مايو 2018 }}</ref> يمكن رؤية المحلل من الأسفل إلى الأعلى<nowiki/>[[:en:Bottom-up parsing|bottom-up parser]] على أنه انعكاس [[التحليل من أعلى إلى أسفل|للمحلل]] من [[التحليل من أعلى إلى أسفل|أعلى لأسفل]][[:en:Top-down parsing|top-down parser]] : في الحالة الأولى، يقع عنصر التحكم على المحلل اللغوي parser، بينما في الحالة الأخرى، يقع على عاتق تطبيق الاستلام receiving application.
حقن التبعية [[:en:Dependency injection|Dependency injection]]<nowiki/>هو نوع معين من IoC.<ref name="FowlerDI" /> يشبه محدد الخدمة <service locator> مثل Java Naming and Directory Interface (JNDI). في مقال كتبه Loek Bergman ، <ref>{{Webarchive|url=https://web.archive.org/web/*/http://loekbergman.nl/InsideArchitecture/TheVision/InversionOfControl|date=*}} Inside Architecture: write once, run anywhere by Loek Bergman</ref> تم تقديمه كمبدأ معماريarchitectural principle.
في مقال بقلم [[روبرت سيسيل مارتن|روبرت سي مارتن]] [[:en:Robert Cecil Martin|Robert C. Martin]]، <ref name="robertmartin">[https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf The Dependency Inversion principle] by Robert C. Martin {{Webarchive|url=https://web.archive.org/web/20200517040519/https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf |date=17 مايو 2020}}</ref> يأتي مبدأ انعكاس التبعية dependency inversion principleوالتجريدabstraction عن طريق الطبقات معا layering come together. إن سبب استخدام مصطلح "الانقلاب" inversion بالمقارنة مع طرق تطوير البرمجيات التقليدية. يصف فك ربط الخدماتuncoupling of services عن طريق تجريد الطبقاتabstraction of layers عندما يتحدث عن انعكاس التبعية dependency inversion. يستخدم المبدأ لمعرفة أين توجد حدود النظام في تصميمdesign طبقات التجريدabstraction layers..
== وصف ==
في البرمجة التقليدية traditional programming، يتم تحديد [[تدفق السيطرة|تدفق]] [[منطق العمل|منطق الأعمال]] the [[:en:Control flow|flow]] of the [[:en:Business logic|business logic]] بواسطة كائناتobjects مرتبطة بشكل ثابت ببعضها"Static binding" statically bound البعض. مع عكس التحكم، يعتمد التدفق flow على الرسم البياني للكائن object graphالذي تم إنشاؤه أثناء تنفيذ البرنامج. مثل هذا التدفق الديناميdynamic flow أصبح ممكنا من خلال تفاعلات الكائن object interactionsالتي يتم تعريفها من خلال التجريدabstractions. يتم تحقيق هذا الربط في وقت التشغيل "run-time binding بواسطة آليات مثل حقن التبعية dependency injection أو محدد مواقع الخدمة [[:en:Service locator pattern|service locator]]. في IoC ، يمكن أيضًا ربط الكود بشكل ثابت linked statically أثناء التجميع compilation، ولكن العثور على الكود ليتم تنفيذه من خلال قراءة وصفه من [[ملف إعداد|التكوين الخارجي]] [[:en:Configuration file|external configuration]] بدلاً من مرجع مباشرdirect reference في الكود نفسه.
في حقن التبعية dependency injection، يقترن [[برمجة كائنية التوجه|الكائن]] [[:en:Object-oriented programming|object]]<nowiki/>بالوحدة التابعة بالكائن dependent [[:en:Object-oriented programming|object]] or module الذي يحتاجه في [[وقت التنفيذ|وقت التشغيل]] [[:en:Run time (program lifecycle phase)|run time]]. . لا يمكن عادةً معرفة الكائن المعين particular object الذي سيلبي التبعية satisfy the dependency أثناء تنفيذ البرنامجprogram execution في [[وقت التصريف|وقت الترجمة]][[:en:Compile time|compile time]] باستخدام [[تحليل البرنامج الساكن|التحليل الثابت]][[:en:Compile time|compile time]] . بينما تم وصفه من حيث تفاعل الكائنobject interaction هنا، يمكن تطبيق المبدأ على منهجيات البرمجة الأخرى إلى جانب [[برمجة كائنية التوجه|البرمجة الموجهة للكائنات]] [[:en:Object-oriented programming|object-oriented programming]].
لكي يقوم البرنامج الجاريrunning program بربط الكائناتbind objects ببعضها البعض، يجب أن تمتلك الكائنات [[واجهة (حوسبة)|واجهات]] متوافقة ompatible [[:en:Software interface|interfaces]]. على سبيل المثال، قد تقوم الفئة class <code>A</code> بتفويض السلوك للواجهة <code>I</code> <code>interface</code>التي يتم تنفيذها بواسطة الفئة class <code>B</code> ؛ يعمل البرنامج على إنشاء <code>A</code> و <code>B</code> ، ثم حقن <code>B</code> في <code>A</code>
== تقنيات التنفيذ ==
في [[برمجة كائنية التوجه|البرمجة الشيئية]] class ، هناك العديد من التقنيات الأساسية لتنفيذ عكس التحكم. وهذه هي:
* استخدام نمط محدد مواقع الخدمة service locator pattern
* استخدام حقن التبعية<dependency injection> ، على سبيل المثال
** حقن المنشئConstructor injection
** حقن المعلمة Parameter injection
** حقن أفضلSetter injection
** حقن الواجهة Interface injection
* استخدام بحث سياقي contextualized lookup
* باستخدام نمط تصميم طريقة القالب <template method design pattern>
* استخدام [[نموذج الإستراتيجية|نمط التصميم الاستراتيجي]][[:en:Strategy design pattern|strategy design pattern]]
في مقال أصلي لمارتن فاولرMartin Fowler ، <ref>[https://www.martinfowler.com/articles/injection.html Inversion of Control Containers and the Dependency Injection Pattern] by Martin Fowler {{Webarchive|url=https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html |date=12 مايو 2020}}</ref> تمت مناقشة التقنيات الثلاثة الأولى. في وصف حول عكس أنواع التحكم، <ref>[http://docs.codehaus.org/display/PICO/IoC+Types IoC Types] {{Webarchive|url=https://web.archive.org/web/20090615045650/http://docs.codehaus.org/display/PICO/IoC+Types|date=15 June 2009}}</ref> تم ذكر النوع الأخير. غالبًا ما يتم إنجاز البحث السياقي contextualized lookupباستخدام محدد مواقع الخدمة service locator
== أمثلة ==
معظم الأطرMost frameworks مثل [[دوت نت فريموورك|.]] [[دوت نت فريموورك|NET]] أو [[منصة جافا (النسخة التجارية)|Enterprise Java]] يعرض هذا النمطpattern : <syntaxhighlight lang="java">
public class ServerFacade {
public <K, V> V respondToRequest(K request) {
if (businessLayer.validateRequest(request)) {
Data data = DAO.getData(request);
return Aspect.convertData(data);
}
return null;
}
}
</syntaxhighlight> يعطي هذا المخطط التفصيلي الأساسيbasic outline في Java مثالاً على التعليمات البرمجية باتباع منهجية IoC. من المهم، مع ذلك، أن فيServerFacade {{Java|ServerFacade}} يتم إجراء الكثير من الافتراضاتassumptions حول البياناتdata التي يتم إرجاعهاreturned بواسطة كائن الوصول إلى البيانات object (DAO).
على الرغم من أن كل هذه الافتراضات قد تكون صالحة في وقت ما، إلا أنها ترتبط ب ServerFacade لتنفيذ DAO. سيؤدي تصميم التطبيق بطريقة قلب التحكم إلى تسليم عنصر التحكم بالكامل hand over the control completelyإلى DAO object. ثم يصبح الكود code
<br /><syntaxhighlight lang="java">
public class ServerFacade {
public <K, V> V respondToRequest(K request, DAO dao) {
return dao.getData(request);
}
}
</syntaxhighlight> يوضح المثال أن الطريقة التي {{Java|respondToRequest}} respondToRequestالطريقة يحدد ما إذا كان IoC مستخدمًا. إنها الطريقة التي يتم بها استخدام المعلماتparameters التي تحددdefine IoC IoC. يشبه هذا نمط تمرير الرسائل [[:en:Message Passing|message-passing]]<nowiki/>الذي تستخدمه بعض لغات البرمجة الشيئية object-oriented programming.
<br />
{{انماط تصميم برمجيات}}
== انظر أيضا ==
{{Div col|colwidth=22em}}
* [[برمجة جانبية المنحى]]
* [[استمرارية (معلوماتية)|استمرارية]]
* [[روتين المقاطعة (نظام تشغيل)|روتين المقاطعة]]
* [[المراقب (نموذج تصميم)|المراقب]]
* [[نمط محدد موقع الخدمة]]
* [[إطار عمل (برمجة)|إطار عمل]]
* [[نموذج الإستراتيجية]]
* [[تحويل لغة الأسلوب الموسع]]
{{Div col end}}
== المراجع ==
{{مراجع}}
== روابط خارجية ==
* [http://javaprogrammernotes.blogspot.com/2015/03/inversion-of-control-dependency.html عكس تفسير التحكم ومثال التنفيذ]{{أنماط تصميم البرمجيات}}
{{شريط بوابات|برمجة الحاسوب|علم الحاسوب}}
[[تصنيف:معمارية البرمجيات]]
[[تصنيف:لغة برمجة جافا]]
[[تصنيف:نماذج تصميم البرمجيات]]
[[تصنيف:هندسة البرمجيات بالمكونات]]' |
نص الويكي الجديد للصفحة، بعد التعديل (new_wikitext ) | '*{{<sup>{{* '''{{{{مقالة غير مراجعة|تاريخ = مايو 2020}}
** في [[هندسة البرمجيات]] ، يعد '''عكس التحكم''' ( '''IoC''' ) {{إنج|inversion of control}} مبدأ في البرمجة. يعكس IoC [[تدفق السيطرة|تدفق التحكم]] flow of control مقارنة بتدفق التحكم التقليديtraditional control flow. في IoC ، تتلقى أجزاء مكتوبة خصيصًا custom-written portions
** }}'''=={{}}</sup>}}
==
=={{<ref>''' '''</ref>}}==
==
}}==
من [[برنامج (حاسوب)|برنامج الكمبيوتر]] تدفق التحكم من [[إطار عمل (برمجة)|إطار]] عامgeneric framework. إن [[معمارية برمجيات|هندسة البرمجيات]] software architectureمع هذا التصميم تعكس التحكم مقارنة [[برمجة إجرائية|بالبرمجة الإجرائية]] procedural programming التقليدية: في البرمجة التقليدية، الرمز code المخصص الذي يعبر عن الغرض من البرنامج [[دالة (برمجة)|يستدعي]] callsمكتبات libraries قابلة لإعادة الاستخدام لرعاية المهام العامة generic tasks، ولكن مع عكس التحكم، فهو الإطارframework الذي يستدعي الرمز code المخصصcustom أو الخاص بالمهمة task-specific.
يستخدم عكس التحكم لزيادة [[برمجة تركيبية|نمطية]][[:en:Modularity (programming)|modularity]] البرنامج وجعله قابلاً للتوسيع [[:en:Extensible programming|extensible]]، <ref>{{استشهاد ويب
| مسار = http://www.laputan.org/drc/drc.html
| عنوان = Designing Reusable Classes
| تاريخ = June–July 1988
| موقع = Journal of Object-Oriented Programming, Volume 1, Number 2
| ناشر = Department of Computer Science University of Illinois at Urbana-Champaign
| صفحات = 22–35
| تاريخ الوصول = 29 April 2014
| الأخير = Ralph E. Johnson & Brian Foote
| مسار أرشيف = https://web.archive.org/web/20191026065057/http://laputan.org/drc/drc.html | تاريخ أرشيف = 26 أكتوبر 2019 }}</ref> ولديه تطبيقات في [[برمجة كائنية التوجه|البرمجة]] [[نمط برمجة|الشيئية]][[:en:Object-oriented programming|object-oriented programming]] ونماذج البرمجة [[:en:Programming paradigm|programming paradigms]]<nowiki/>الأخرى. استخدم مايكل ماتسونMichael Mattsson هذا المصطلح في أطروحة، <ref>{{استشهاد ويب
| مسار = https://www.researchgate.net/publication/2238535
| عنوان = Object-Oriented Frameworks, A survey of methodological issues
| تاريخ = Feb 1996
| الأخير = Michael Mattsson
|مسار أرشيف= https://web.archive.org/web/20200517040540/https://www.researchgate.net/publication/2238535|تاريخ أرشيف=2020-05-17}}</ref> مأخوذة من هناك <ref>{{استشهاد ويب
| مسار = http://www.betaversion.org/~stefano/linotype/news/38/
| عنوان = On Inversion of Control
| تاريخ = Jan 22, 2004
| مسار أرشيف = https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/
| تاريخ أرشيف = 2 February 2004
| الأخير = Stefano Mazzocchi
| وصلة مكسورة = yes | تاريخ الوصول = أغسطس 2020 }}</ref> بواسطة ستيفانو مازوتشي Stefano Mazzocchiوشاعه في عام 1999 في مشروع مؤسسة برمجيات أباتشي البائدdefunct Apache Software Foundation project ، أفالون-Avalon> ، ثم تم تعميمه في عام 2004 من قبل [[روبرت سيسيل مارتن|روبرت سي مارتن]] [[:en:Robert Cecil Martin|Robert C. Martin]]<nowiki/>و [[مارتن فاولر]][[:en:Martin Fowler (software engineer)|Martin Fowler]] .
يرتبط المصطلح بمبدأ انقلاب التبعية [[:en:Dependency inversion principle|dependency inversion principle]]، ولكنه يختلف عنه، والذي يهتم [[اقتران (حاسوب)|بفصل التبعيات]][[:en:Dependency (computer science)|decoupling dependencies]] بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال [[تجريد (حاسوب)|التجريدات]][[:en:Abstraction (computing)|abstractions]] المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event
[[جائزة بي بي سي لأفضل لاعب كرة قدم أفريقي في السنة| ]]
loop|event loop]]<nowiki/>وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..
== نظرة عامة ==
كمثال، مع البرمجة التقليدية، قد تقوم الوظيفة الرئيسية [[:en:Main function|main function]]<nowiki/>للتطبيق بإجراء استدعاءات وظيفية في قائمة مكتبة menu library لعرض قائمة [[أمر (حوسبة)|بالأوامر]] [[:en:Command (computing)|commands]] المتاحة والاستعلام query عن المستخدم لاختيار واحد.<ref name="FowlerDI">[https://martinfowler.com/articles/injection.html Dependency Injection]. {{Webarchive|url=https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html |date=12 مايو 2020}}</ref> وبالتالي ستعيد المكتبة الخيار الذي تم اختياره كقيمة استدعاء الدالة the value of the function call، وتستخدم الدالة الرئيسية main function هذه القيمة لتنفيذ الأمر المرتبطexecute the associated command.. كان هذا النمط شائعًا في [[واجهة مستخدم نصية|الواجهات القائمة على النص]][[:en:Text based interface|text based interfaces]] . على سبيل المثال، قد يعرض [[عميل بريد إلكتروني|عميل البريد الإلكتروني]] [[:en:Email client|email client]] شاشة تحتوي على أوامر لتحميل بريد جديد، والإجابة على البريد الحالي، وبدء بريد جديد، وما إلى ذلك، وسيحظر تنفيذ البرنامج حتى يضغط المستخدم على مفتاح key لتحديد أمرcommand.
مع عكس التحكم inversion of control، من ناحية أخرى، سيتم كتابة [[إطار عمل (برمجة)|البرنامج]] باستخدام [[إطار عمل (برمجة)|إطار برنامج]][[:en:Software framework|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 [[سطح بيني للشبكة|واجهة الشبكة]] [[:en:Network interface|network interface]]<nowiki/>لمعرفة ما إذا كانت الرسائل الجديدة تصل وتحديث الشاشة refresh the screen عندما تم الكشفdetected عن نشاط الشبكة network activity. يمكن استخدام نفس الإطارframework كالهيكل العظميskeleton لبرنامج جداول البيانات spreadsheet programأو محرر النصوص text editor. على العكس من ذلك، لا يعرف الإطار شيئًا عن متصفحات الويب أو جداول البيانات أو محرري النصوص ؛ يتطلب تنفيذ وظائفهمfunctionality رمزًا مخصصًاcustom code.
إن انعكاس التحكم يحمل دلالة قوية strong connotation على أن الكود القابل لإعادة الاستخدام والرمز الخاص بالمشكلة problem-specific يتم تطويرهما بشكل مستقل على الرغم من أنهما يعملان معًا في تطبيق. [[إطار عمل (برمجة)|إطار عمل]] [[:en:Software framework|Software frameworks]]، الاسترجاعات [[:en:Callback (computer programming)|callbacks]]، [[جدولة (حاسوب)|المنظمون]][[:en:Scheduling (computing)|schedulers]] ، حلقات الحدث<a event loops ، حقن التبعيةdependency injection ، و طريقة قالب <template method> أمثلة من [[قالب التصميم (علم الحاسب)|أنماط التصميم]][[:en:Design pattern|design patterns]] التي تتبع مبدأ انعكاس السيطرة inversion of control principle، ايضاً المصطلح أكثر شيوعا في سياق [[برمجة كائنية التوجه|البرمجة كائنية التوجه]] [[:en:Object-oriented programming|object-oriented programming]]. .
يخدم عكس التحكم Inversion of control اهداف التصميم design التالية:
* [[برمجة كائنية التوجه|فصل]][[:en:Object decoupling|decouple]] تنفيذ المهمة execution of a task عن التنفيذimplementation.
* لتركيز الوحدة النمطية module على المهمة المصممة لها.
* لتحرير الوحدات النمطية free modulesمن الافتراضات assumptions حول كيفية قيام الأنظمة الأخرى بما تفعله وبدلاً من ذلك تعتمد على [[تصميم بالعقود|العقود]] [[:en:Design by contract|contracts]].
* لمنع [[تأثير جانبي (علم الحاسوب)|الآثار الجانبية]] [[:en:Side effect (computer science)|side effects]]<nowiki/>عند استبدال الوحدة module.
أحيانًا ما يُشار إلى انقلاب السيطرة بشكل ظاهري باسم "مبدأ هوليوود: لا تتصل بنا، نحن من سيتصل بك".
== خلفية ==
إن عكس التحكم ليس مصطلحًا جديدًا في علوم الكمبيوتر. يتتبع [[مارتن فاولر]][[:en:Martin Fowler (software engineer)|Martin Fowler]] أصل العبارة حتى عام 1988 ، <ref name="FowlerIoC">[https://martinfowler.com/bliki/InversionOfControl.html Inversion of Control] on Martin Fowler's Bliki {{Webarchive|url=https://web.archive.org/web/20200509104127/https://martinfowler.com/bliki/InversionOfControl.html |date=9 مايو 2020}}</ref> ولكنها ترتبط ارتباطًا وثيقًا بمفهوم '''عكس البرنامج program inversionالذي''' وصفه [[مايكل جاكسون (عالم حاسوب)|مايكل جاكسون]][[:en:Michael A. Jackson|Michael Jackson]] في منهجيتهmethodology في البرمجة جاكسون المنظمة<a Jackson Structured Programming> في السبعينيات.<ref>{{استشهاد ويب
| مسار = http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf
| عنوان = Introduction to Jackson Design Method
| مسار أرشيف = https://web.archive.org/web/20180516215640/http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf | تاريخ أرشيف = 16 مايو 2018 }}</ref> يمكن رؤية المحلل من الأسفل إلى الأعلى<nowiki/>[[:en:Bottom-up parsing|bottom-up parser]] على أنه انعكاس [[التحليل من أعلى إلى أسفل|للمحلل]] من [[التحليل من أعلى إلى أسفل|أعلى لأسفل]][[:en:Top-down parsing|top-down parser]] : في الحالة الأولى، يقع عنصر التحكم على المحلل اللغوي parser، بينما في الحالة الأخرى، يقع على عاتق تطبيق الاستلام receiving application.
حقن التبعية [[:en:Dependency injection|Dependency injection]]<nowiki/>هو نوع معين من IoC.<ref name="FowlerDI" /> يشبه محدد الخدمة <service locator> مثل Java Naming and Directory Interface (JNDI). في مقال كتبه Loek Bergman ، <ref>{{Webarchive|url=https://web.archive.org/web/*/http://loekbergman.nl/InsideArchitecture/TheVision/InversionOfControl|date=*}} Inside Architecture: write once, run anywhere by Loek Bergman</ref> تم تقديمه كمبدأ معماريarchitectural principle.
في مقال بقلم [[روبرت سيسيل مارتن|روبرت سي مارتن]] [[:en:Robert Cecil Martin|Robert C. Martin]]، <ref name="robertmartin">[https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf The Dependency Inversion principle] by Robert C. Martin {{Webarchive|url=https://web.archive.org/web/20200517040519/https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf |date=17 مايو 2020}}</ref> يأتي مبدأ انعكاس التبعية dependency inversion principleوالتجريدabstraction عن طريق الطبقات معا layering come together. إن سبب استخدام مصطلح "الانقلاب" inversion بالمقارنة مع طرق تطوير البرمجيات التقليدية. يصف فك ربط الخدماتuncoupling of services عن طريق تجريد الطبقاتabstraction of layers عندما يتحدث عن انعكاس التبعية dependency inversion. يستخدم المبدأ لمعرفة أين توجد حدود النظام في تصميمdesign طبقات التجريدabstraction layers..
== وصف ==
في البرمجة التقليدية traditional programming، يتم تحديد [[تدفق السيطرة|تدفق]] [[منطق العمل|منطق الأعمال]] the [[:en:Control flow|flow]] of the [[:en:Business logic|business logic]] بواسطة كائناتobjects مرتبطة بشكل ثابت ببعضها"Static binding" statically bound البعض. مع عكس التحكم، يعتمد التدفق flow على الرسم البياني للكائن object graphالذي تم إنشاؤه أثناء تنفيذ البرنامج. مثل هذا التدفق الديناميdynamic flow أصبح ممكنا من خلال تفاعلات الكائن object interactionsالتي يتم تعريفها من خلال التجريدabstractions. يتم تحقيق هذا الربط في وقت التشغيل "run-time binding بواسطة آليات مثل حقن التبعية dependency injection أو محدد مواقع الخدمة [[:en:Service locator pattern|service locator]]. في IoC ، يمكن أيضًا ربط الكود بشكل ثابت linked statically أثناء التجميع compilation، ولكن العثور على الكود ليتم تنفيذه من خلال قراءة وصفه من [[ملف إعداد|التكوين الخارجي]] [[:en:Configuration file|external configuration]] بدلاً من مرجع مباشرdirect reference في الكود نفسه.
في حقن التبعية dependency injection، يقترن [[برمجة كائنية التوجه|الكائن]] [[:en:Object-oriented programming|object]]<nowiki/>بالوحدة التابعة بالكائن dependent [[:en:Object-oriented programming|object]] or module الذي يحتاجه في [[وقت التنفيذ|وقت التشغيل]] [[:en:Run time (program lifecycle phase)|run time]]. . لا يمكن عادةً معرفة الكائن المعين particular object الذي سيلبي التبعية satisfy the dependency أثناء تنفيذ البرنامجprogram execution في [[وقت التصريف|وقت الترجمة]][[:en:Compile time|compile time]] باستخدام [[تحليل البرنامج الساكن|التحليل الثابت]][[:en:Compile time|compile time]] . بينما تم وصفه من حيث تفاعل الكائنobject interaction هنا، يمكن تطبيق المبدأ على منهجيات البرمجة الأخرى إلى جانب [[برمجة كائنية التوجه|البرمجة الموجهة للكائنات]] [[:en:Object-oriented programming|object-oriented programming]].
لكي يقوم البرنامج الجاريrunning program بربط الكائناتbind objects ببعضها البعض، يجب أن تمتلك الكائنات [[واجهة (حوسبة)|واجهات]] متوافقة ompatible [[:en:Software interface|interfaces]]. على سبيل المثال، قد تقوم الفئة class <code>A</code> بتفويض السلوك للواجهة <code>I</code> <code>interface</code>التي يتم تنفيذها بواسطة الفئة class <code>B</code> ؛ يعمل البرنامج على إنشاء <code>A</code> و <code>B</code> ، ثم حقن <code>B</code> في <code>A</code>
== تقنيات التنفيذ ==
في [[برمجة كائنية التوجه|البرمجة الشيئية]] class ، هناك العديد من التقنيات الأساسية لتنفيذ عكس التحكم. وهذه هي:
* استخدام نمط محدد مواقع الخدمة service locator pattern
* استخدام حقن التبعية<dependency injection> ، على سبيل المثال
** حقن المنشئConstructor injection
** حقن المعلمة Parameter injection
** حقن أفضلSetter injection
** حقن الواجهة Interface injection
* استخدام بحث سياقي contextualized lookup
* باستخدام نمط تصميم طريقة القالب <template method design pattern>
* استخدام [[نموذج الإستراتيجية|نمط التصميم الاستراتيجي]][[:en:Strategy design pattern|strategy design pattern]]
في مقال أصلي لمارتن فاولرMartin Fowler ، <ref>[https://www.martinfowler.com/articles/injection.html Inversion of Control Containers and the Dependency Injection Pattern] by Martin Fowler {{Webarchive|url=https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html |date=12 مايو 2020}}</ref> تمت مناقشة التقنيات الثلاثة الأولى. في وصف حول عكس أنواع التحكم، <ref>[http://docs.codehaus.org/display/PICO/IoC+Types IoC Types] {{Webarchive|url=https://web.archive.org/web/20090615045650/http://docs.codehaus.org/display/PICO/IoC+Types|date=15 June 2009}}</ref> تم ذكر النوع الأخير. غالبًا ما يتم إنجاز البحث السياقي contextualized lookupباستخدام محدد مواقع الخدمة service locator
== أمثلة ==
معظم الأطرMost frameworks مثل [[دوت نت فريموورك|.]] [[دوت نت فريموورك|NET]] أو [[منصة جافا (النسخة التجارية)|Enterprise Java]] يعرض هذا النمطpattern : <syntaxhighlight lang="java">
public class ServerFacade {
public <K, V> V respondToRequest(K request) {
if (businessLayer.validateRequest(request)) {
Data data = DAO.getData(request);
return Aspect.convertData(data);
}
return null;
}
}
</syntaxhighlight> يعطي هذا المخطط التفصيلي الأساسيbasic outline في Java مثالاً على التعليمات البرمجية باتباع منهجية IoC. من المهم، مع ذلك، أن فيServerFacade {{Java|ServerFacade}} يتم إجراء الكثير من الافتراضاتassumptions حول البياناتdata التي يتم إرجاعهاreturned بواسطة كائن الوصول إلى البيانات object (DAO).
على الرغم من أن كل هذه الافتراضات قد تكون صالحة في وقت ما، إلا أنها ترتبط ب ServerFacade لتنفيذ DAO. سيؤدي تصميم التطبيق بطريقة قلب التحكم إلى تسليم عنصر التحكم بالكامل hand over the control completelyإلى DAO object. ثم يصبح الكود code
<br /><syntaxhighlight lang="java">
public class ServerFacade {
public <K, V> V respondToRequest(K request, DAO dao) {
return dao.getData(request);
}
}
</syntaxhighlight> يوضح المثال أن الطريقة التي {{Java|respondToRequest}} respondToRequestالطريقة يحدد ما إذا كان IoC مستخدمًا. إنها الطريقة التي يتم بها استخدام المعلماتparameters التي تحددdefine IoC IoC. يشبه هذا نمط تمرير الرسائل [[:en:Message Passing|message-passing]]<nowiki/>الذي تستخدمه بعض لغات البرمجة الشيئية object-oriented programming.
<br />
{{انماط تصميم برمجيات}}
== انظر أيضا ==
{{Div col|colwidth=22em}}
* [[برمجة جانبية المنحى]]
* [[استمرارية (معلوماتية)|استمرارية]]
* [[روتين المقاطعة (نظام تشغيل)|روتين المقاطعة]]
* [[المراقب (نموذج تصميم)|المراقب]]
* [[نمط محدد موقع الخدمة]]
* [[إطار عمل (برمجة)|إطار عمل]]
* [[نموذج الإستراتيجية]]
* [[تحويل لغة الأسلوب الموسع]]
{{Div col end}}
== المراجع ==
{{مراجع}}
== روابط خارجية ==
* [http://javaprogrammernotes.blogspot.com/2015/03/inversion-of-control-dependency.html عكس تفسير التحكم ومثال التنفيذ]{{أنماط تصميم البرمجيات}}
{{شريط بوابات|برمجة الحاسوب|علم الحاسوب}}
[[تصنيف:معمارية البرمجيات]]
[[تصنيف:لغة برمجة جافا]]
[[تصنيف:نماذج تصميم البرمجيات]]
[[تصنيف:هندسة البرمجيات بالمكونات]]' |
فرق موحد للتغييرات المصنوعة بواسطة التعديل (edit_diff ) | '@@ -1,4 +1,10 @@
-{{مقالة غير مراجعة|تاريخ = مايو 2020}}
-في [[هندسة البرمجيات]] ، يعد '''عكس التحكم''' ( '''IoC''' ) {{إنج|inversion of control}} مبدأ في البرمجة. يعكس 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.
+*{{<sup>{{* '''{{{{مقالة غير مراجعة|تاريخ = مايو 2020}}
+** في [[هندسة البرمجيات]] ، يعد '''عكس التحكم''' ( '''IoC''' ) {{إنج|inversion of control}} مبدأ في البرمجة. يعكس IoC [[تدفق السيطرة|تدفق التحكم]] flow of control مقارنة بتدفق التحكم التقليديtraditional control flow. في IoC ، تتلقى أجزاء مكتوبة خصيصًا custom-written portions
+** }}'''=={{}}</sup>}}
+==
+=={{<ref>''' '''</ref>}}==
+==
+}}==
+ من [[برنامج (حاسوب)|برنامج الكمبيوتر]] تدفق التحكم من [[إطار عمل (برمجة)|إطار]] عامgeneric framework. إن [[معمارية برمجيات|هندسة البرمجيات]] software architectureمع هذا التصميم تعكس التحكم مقارنة [[برمجة إجرائية|بالبرمجة الإجرائية]] procedural programming التقليدية: في البرمجة التقليدية، الرمز code المخصص الذي يعبر عن الغرض من البرنامج [[دالة (برمجة)|يستدعي]] callsمكتبات libraries قابلة لإعادة الاستخدام لرعاية المهام العامة generic tasks، ولكن مع عكس التحكم، فهو الإطارframework الذي يستدعي الرمز code المخصصcustom أو الخاص بالمهمة task-specific.
يستخدم عكس التحكم لزيادة [[برمجة تركيبية|نمطية]][[:en:Modularity (programming)|modularity]] البرنامج وجعله قابلاً للتوسيع [[:en:Extensible programming|extensible]]، <ref>{{استشهاد ويب
@@ -25,5 +31,7 @@
| وصلة مكسورة = yes | تاريخ الوصول = أغسطس 2020 }}</ref> بواسطة ستيفانو مازوتشي Stefano Mazzocchiوشاعه في عام 1999 في مشروع مؤسسة برمجيات أباتشي البائدdefunct Apache Software Foundation project ، أفالون-Avalon> ، ثم تم تعميمه في عام 2004 من قبل [[روبرت سيسيل مارتن|روبرت سي مارتن]] [[:en:Robert Cecil Martin|Robert C. Martin]]<nowiki/>و [[مارتن فاولر]][[:en:Martin Fowler (software engineer)|Martin Fowler]] .
-يرتبط المصطلح بمبدأ انقلاب التبعية [[:en:Dependency inversion principle|dependency inversion principle]]، ولكنه يختلف عنه، والذي يهتم [[اقتران (حاسوب)|بفصل التبعيات]][[:en:Dependency (computer science)|decoupling dependencies]] بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال [[تجريد (حاسوب)|التجريدات]][[:en:Abstraction (computing)|abstractions]] المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event loop|event loop]]<nowiki/>وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..
+يرتبط المصطلح بمبدأ انقلاب التبعية [[:en:Dependency inversion principle|dependency inversion principle]]، ولكنه يختلف عنه، والذي يهتم [[اقتران (حاسوب)|بفصل التبعيات]][[:en:Dependency (computer science)|decoupling dependencies]] بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال [[تجريد (حاسوب)|التجريدات]][[:en:Abstraction (computing)|abstractions]] المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event
+[[جائزة بي بي سي لأفضل لاعب كرة قدم أفريقي في السنة| ]]
+ loop|event loop]]<nowiki/>وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..
== نظرة عامة ==
' |
حجم الصفحة الجديد (new_size ) | 22651 |
حجم الصفحة القديم (old_size ) | 22473 |
الحجم المتغير في التعديل (edit_delta ) | 178 |
السطور المضافة في التعديل (added_lines ) | [
0 => '*{{<sup>{{* '''{{{{مقالة غير مراجعة|تاريخ = مايو 2020}}',
1 => '** في [[هندسة البرمجيات]] ، يعد '''عكس التحكم''' ( '''IoC''' ) {{إنج|inversion of control}} مبدأ في البرمجة. يعكس IoC [[تدفق السيطرة|تدفق التحكم]] flow of control مقارنة بتدفق التحكم التقليديtraditional control flow. في IoC ، تتلقى أجزاء مكتوبة خصيصًا custom-written portions',
2 => '** }}'''=={{}}</sup>}}',
3 => '==',
4 => '=={{<ref>''' '''</ref>}}==',
5 => '==',
6 => '}}==',
7 => ' من [[برنامج (حاسوب)|برنامج الكمبيوتر]] تدفق التحكم من [[إطار عمل (برمجة)|إطار]] عامgeneric framework. إن [[معمارية برمجيات|هندسة البرمجيات]] software architectureمع هذا التصميم تعكس التحكم مقارنة [[برمجة إجرائية|بالبرمجة الإجرائية]] procedural programming التقليدية: في البرمجة التقليدية، الرمز code المخصص الذي يعبر عن الغرض من البرنامج [[دالة (برمجة)|يستدعي]] callsمكتبات libraries قابلة لإعادة الاستخدام لرعاية المهام العامة generic tasks، ولكن مع عكس التحكم، فهو الإطارframework الذي يستدعي الرمز code المخصصcustom أو الخاص بالمهمة task-specific.',
8 => 'يرتبط المصطلح بمبدأ انقلاب التبعية [[:en:Dependency inversion principle|dependency inversion principle]]، ولكنه يختلف عنه، والذي يهتم [[اقتران (حاسوب)|بفصل التبعيات]][[:en:Dependency (computer science)|decoupling dependencies]] بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال [[تجريد (حاسوب)|التجريدات]][[:en:Abstraction (computing)|abstractions]] المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event',
9 => '[[جائزة بي بي سي لأفضل لاعب كرة قدم أفريقي في السنة| ]]',
10 => ' loop|event loop]]<nowiki/>وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..'
] |
السطور المزالة في التعديل (removed_lines ) | [
0 => '{{مقالة غير مراجعة|تاريخ = مايو 2020}}',
1 => 'في [[هندسة البرمجيات]] ، يعد '''عكس التحكم''' ( '''IoC''' ) {{إنج|inversion of control}} مبدأ في البرمجة. يعكس 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.',
2 => 'يرتبط المصطلح بمبدأ انقلاب التبعية [[:en:Dependency inversion principle|dependency inversion principle]]، ولكنه يختلف عنه، والذي يهتم [[اقتران (حاسوب)|بفصل التبعيات]][[:en:Dependency (computer science)|decoupling dependencies]] بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال [[تجريد (حاسوب)|التجريدات]][[:en:Abstraction (computing)|abstractions]] المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event loop|event loop]]<nowiki/>وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..'
] |
كل الوصلات الخارجية المضافة في التعديل (added_links ) | [] |
كل الوصلات الخارجية المزالة في التعديل (removed_links ) | [] |
نص الصفحة الجديد، مجردا من أية تهيئة (new_text ) | '{{{{* {{ هذه مقالة غير مراجعة. ينبغي أن يزال هذا القالب بعد أن يراجعها محرر؛ إذا لزم الأمر فيجب أن توسم المقالة بقوالب الصيانة المناسبة. يمكن أيضاً تقديم طلب لمراجعة المقالة في الصفحة المخصصة لذلك. (مايو 2020)
في هندسة البرمجيات ، يعد عكس التحكم ( IoC ) (بالإنجليزية: inversion of control) مبدأ في البرمجة. يعكس IoC تدفق التحكم flow of control مقارنة بتدفق التحكم التقليديtraditional control flow. في IoC ، تتلقى أجزاء مكتوبة خصيصًا custom-written portions
}}=={{}}}}
==
محتويات
1 {{[1]}}
2 نظرة عامة
3 خلفية
4 وصف
5 تقنيات التنفيذ
6 أمثلة
7 انظر أيضا
8 المراجع
9 روابط خارجية
{{[1]}}
==
}}==
من برنامج الكمبيوتر تدفق التحكم من إطار عامgeneric framework. إن هندسة البرمجيات software architectureمع هذا التصميم تعكس التحكم مقارنة بالبرمجة الإجرائية procedural programming التقليدية: في البرمجة التقليدية، الرمز code المخصص الذي يعبر عن الغرض من البرنامج يستدعي callsمكتبات libraries قابلة لإعادة الاستخدام لرعاية المهام العامة generic tasks، ولكن مع عكس التحكم، فهو الإطارframework الذي يستدعي الرمز code المخصصcustom أو الخاص بالمهمة task-specific.
يستخدم عكس التحكم لزيادة نمطيةmodularity البرنامج وجعله قابلاً للتوسيع extensible، [2] ولديه تطبيقات في البرمجة الشيئيةobject-oriented programming ونماذج البرمجة programming paradigmsالأخرى. استخدم مايكل ماتسونMichael Mattsson هذا المصطلح في أطروحة، [3] مأخوذة من هناك [4] بواسطة ستيفانو مازوتشي 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، في حين يتم التعامل مع حلقة الأحداث [[:en:Event
loop|event loop]]وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..
نظرة عامة[عدل]
كمثال، مع البرمجة التقليدية، قد تقوم الوظيفة الرئيسية main functionللتطبيق بإجراء استدعاءات وظيفية في قائمة مكتبة menu library لعرض قائمة بالأوامر commands المتاحة والاستعلام query عن المستخدم لاختيار واحد.[5] وبالتالي ستعيد المكتبة الخيار الذي تم اختياره كقيمة استدعاء الدالة 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 ، و طريقة قالب <template method> أمثلة من أنماط التصميمdesign patterns التي تتبع مبدأ انعكاس السيطرة inversion of control principle، ايضاً المصطلح أكثر شيوعا في سياق البرمجة كائنية التوجه object-oriented programming. .
يخدم عكس التحكم Inversion of control اهداف التصميم design التالية:
فصلdecouple تنفيذ المهمة execution of a task عن التنفيذimplementation.
لتركيز الوحدة النمطية module على المهمة المصممة لها.
لتحرير الوحدات النمطية free modulesمن الافتراضات assumptions حول كيفية قيام الأنظمة الأخرى بما تفعله وبدلاً من ذلك تعتمد على العقود contracts.
لمنع الآثار الجانبية side effectsعند استبدال الوحدة module.
أحيانًا ما يُشار إلى انقلاب السيطرة بشكل ظاهري باسم "مبدأ هوليوود: لا تتصل بنا، نحن من سيتصل بك".
خلفية[عدل]
إن عكس التحكم ليس مصطلحًا جديدًا في علوم الكمبيوتر. يتتبع مارتن فاولرMartin Fowler أصل العبارة حتى عام 1988 ، [6] ولكنها ترتبط ارتباطًا وثيقًا بمفهوم عكس البرنامج program inversionالذي وصفه مايكل جاكسونMichael Jackson في منهجيتهmethodology في البرمجة جاكسون المنظمة<a Jackson Structured Programming> في السبعينيات.[7] يمكن رؤية المحلل من الأسفل إلى الأعلىbottom-up parser على أنه انعكاس للمحلل من أعلى لأسفلtop-down parser : في الحالة الأولى، يقع عنصر التحكم على المحلل اللغوي parser، بينما في الحالة الأخرى، يقع على عاتق تطبيق الاستلام receiving application.
حقن التبعية Dependency injectionهو نوع معين من IoC.[5] يشبه محدد الخدمة <service locator> مثل Java Naming and Directory Interface (JNDI). في مقال كتبه Loek Bergman ، [8] تم تقديمه كمبدأ معماريarchitectural principle.
في مقال بقلم روبرت سي مارتن Robert C. Martin، [9] يأتي مبدأ انعكاس التبعية dependency inversion principleوالتجريدabstraction عن طريق الطبقات معا layering come together. إن سبب استخدام مصطلح "الانقلاب" inversion بالمقارنة مع طرق تطوير البرمجيات التقليدية. يصف فك ربط الخدماتuncoupling of services عن طريق تجريد الطبقاتabstraction of layers عندما يتحدث عن انعكاس التبعية dependency inversion. يستخدم المبدأ لمعرفة أين توجد حدود النظام في تصميمdesign طبقات التجريدabstraction layers..
وصف[عدل]
في البرمجة التقليدية 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
تقنيات التنفيذ[عدل]
في البرمجة الشيئية class ، هناك العديد من التقنيات الأساسية لتنفيذ عكس التحكم. وهذه هي:
استخدام نمط محدد مواقع الخدمة service locator pattern
استخدام حقن التبعية<dependency injection> ، على سبيل المثال
حقن المنشئConstructor injection
حقن المعلمة Parameter injection
حقن أفضلSetter injection
حقن الواجهة Interface injection
استخدام بحث سياقي contextualized lookup
باستخدام نمط تصميم طريقة القالب <template method design pattern>
استخدام نمط التصميم الاستراتيجيstrategy design pattern
في مقال أصلي لمارتن فاولرMartin Fowler ، [10] تمت مناقشة التقنيات الثلاثة الأولى. في وصف حول عكس أنواع التحكم، [11] تم ذكر النوع الأخير. غالبًا ما يتم إنجاز البحث السياقي contextualized lookupباستخدام محدد مواقع الخدمة service locator
أمثلة[عدل]
معظم الأطرMost frameworks مثل . NET أو Enterprise Java يعرض هذا النمطpattern : public class ServerFacade {
public <K, V> V respondToRequest(K request) {
if (businessLayer.validateRequest(request)) {
Data data = DAO.getData(request);
return Aspect.convertData(data);
}
return null;
}
}
يعطي هذا المخطط التفصيلي الأساسيbasic outline في Java مثالاً على التعليمات البرمجية باتباع منهجية IoC. من المهم، مع ذلك، أن فيServerFacade قالب:Java يتم إجراء الكثير من الافتراضاتassumptions حول البياناتdata التي يتم إرجاعهاreturned بواسطة كائن الوصول إلى البيانات object (DAO).
على الرغم من أن كل هذه الافتراضات قد تكون صالحة في وقت ما، إلا أنها ترتبط ب ServerFacade لتنفيذ DAO. سيؤدي تصميم التطبيق بطريقة قلب التحكم إلى تسليم عنصر التحكم بالكامل hand over the control completelyإلى DAO object. ثم يصبح الكود code
public class ServerFacade {
public <K, V> V respondToRequest(K request, DAO dao) {
return dao.getData(request);
}
}
يوضح المثال أن الطريقة التي قالب:Java respondToRequestالطريقة يحدد ما إذا كان IoC مستخدمًا. إنها الطريقة التي يتم بها استخدام المعلماتparameters التي تحددdefine IoC IoC. يشبه هذا نمط تمرير الرسائل message-passingالذي تستخدمه بعض لغات البرمجة الشيئية object-oriented programming.
قالب:انماط تصميم برمجيات
انظر أيضا[عدل]
.mw-parser-output .div-col{margin-top:0.3em;column-width:30em}.mw-parser-output .div-col-small{font-size:90%}.mw-parser-output .div-col-rules{column-rule:1px solid #aaa}.mw-parser-output .div-col dl,.mw-parser-output .div-col ol,.mw-parser-output .div-col ul{margin-top:0}.mw-parser-output .div-col li,.mw-parser-output .div-col dd{page-break-inside:avoid;break-inside:avoid-column}
برمجة جانبية المنحى
استمرارية
روتين المقاطعة
المراقب
نمط محدد موقع الخدمة
إطار عمل
نموذج الإستراتيجية
تحويل لغة الأسلوب الموسع
المراجع[عدل]
.mw-parser-output .reflist{font-size:90%;margin-bottom:0.5em;list-style-type:decimal;overflow-y:auto;max-height:300px}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}@media print{.mw-parser-output .reflist{overflow-y:visible!important;max-height:none!important}}
^
^ .mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:#d33}.mw-parser-output .cs1-visible-error{color:#d33}.mw-parser-output .cs1-maint{display:none;color:#3a3;margin-left:0.3em}.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}Ralph E. Johnson & Brian Foote (يونيو–يوليو 1988)، "Designing Reusable Classes"، Journal of Object-Oriented Programming, Volume 1, Number 2، Department of Computer Science University of Illinois at Urbana-Champaign، ص. 22–35، مؤرشف من الأصل في 26 أكتوبر 2019، اطلع عليه بتاريخ 29 أبريل 2014.
^ Michael Mattsson (فبراير 1996)، "Object-Oriented Frameworks, A survey of methodological issues"، مؤرشف من الأصل في 17 مايو 2020.
^ Stefano Mazzocchi (22 يناير 2004)، "On Inversion of Control"، مؤرشف من الأصل في 02 فبراير 2004، اطلع عليه بتاريخ أغسطس 2020. {{استشهاد ويب}}: تحقق من التاريخ في: |تاريخ الوصول= (مساعدة)
↑ أ ب Dependency Injection. نسخة محفوظة 12 مايو 2020 على موقع واي باك مشين.
^ Inversion of Control on Martin Fowler's Bliki نسخة محفوظة 9 مايو 2020 على موقع واي باك مشين.
^ "Introduction to Jackson Design Method" (PDF)، مؤرشف من الأصل (PDF) في 16 مايو 2018.
^ نسخة محفوظة index على موقع واي باك مشين. Inside Architecture: write once, run anywhere by Loek Bergman
^ The Dependency Inversion principle by Robert C. Martin نسخة محفوظة 17 مايو 2020 على موقع واي باك مشين.
^ Inversion of Control Containers and the Dependency Injection Pattern by Martin Fowler نسخة محفوظة 12 مايو 2020 على موقع واي باك مشين.
^ IoC Types نسخة محفوظة 15 June 2009 على موقع واي باك مشين.
روابط خارجية[عدل]
عكس تفسير التحكم ومثال التنفيذ.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:right;text-align:right}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-left:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-right:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}.mw-parser-output .infobox .navbar{font-size:100%}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:right;text-align:right;margin-left:0.5em}عنت أنماط تصميم البرمجيات (برمجة)إنشائي (Creational)
Abstract factory
نمط تصميم الباني
حقن التبعية
نمط طريقة المصنع
Lazy initialization
Multiton
Object pool
Prototype
اكتساب الموارد تهيئة
النمط المفرد
هيكلي (Structural)
نمط المحول
نموذج التصميم جسر
نموذج التصميم المجمع
نموذج التصميم ديكور
Delegation
نمط واجهة المبنى
نموذج التصميم وزن الذبابة
Front controller
Marker interface
Module
نمط الوكيل
Twin
سلوكي (Behavioral)
Blackboard
Chain of responsibility
Command
Interpreter
نمط المكرر
Mediator
Memento
Null object
المراقب (نموذج تصميم)
Servant
Specification
State
نموذج الإستراتيجية
Template method
Visitor
وظيفي (Functional)
مونويد
Functor
Applicative
Monad
Comonad
Free monad
HOF
Currying
Function composition
Closure
المولد
متزامن (Concurrency)
Active object
Actor
Balking
حاجز (حوسبة)
Binding properties
Coroutine
Compute kernel
Double-checked locking
Event-based asynchronous
ليف
Futex
Futures and promises
Guarded suspension
Immutable object
Join
Lock
صيغة التراسل
Monitor
Nuclear
Proactor
Reactor
Read write lock
Scheduler
STM
Thread pool
Thread-local storage
معماري (Architectural)
* ADR
نمط التسجيل النشط
نمط الوسيط
نموذج الخادم والعميل
هندسة البرمجيات بالمكونات
DAO
كائن نقل البيانات
تصميم موجه بالمجال
ECB
ECS
EDA
Front controller
Identity map
Interceptor
Implicit invocation
عكس التحكم
Model 2
MOM
Microservices
MVA
نمط وعرض ومتحكم
MVP
MVVM
Monolithic
عمارة متعددة الطبقات
Naked objects
ORB
ند لند
Publish–subscribe
PAC
رست
بنية خدمية
نمط محدد موقع الخدمة
SN
SBA
Specification
توزيع سحابي (Cloud Distributed)
Ambassador
Anti-Corruption Layer
Bulkhead
Cache-Aside
Circuit Breaker
CQRS
Compensating Transaction
Competing Consumers
Compute Resource Consolidation
Event Sourcing
External Configuration Store
Federated Identity
Gatekeeper
فهرس قاعدة بيانات
Leader Election
نموذج الهيكلة والتجميع
Materialized View
Pipes
Filters
Priority Queue
Publisher-Subscriber
Queue-Based Load Leveling
Retry
Scheduler Agent Supervisor
Sharding
Sidecar
Strangler
Throttling
Valet Key
أخرى
Business delegate
Composite entity
Intercepting filter
Lazy loading
Mangler
غرض مقلد
Type tunnel
Method chaining
كتب
خطط التصميم
Enterprise Integration Patterns
Code Complete
POSA
أشخاص
كريستوفر الكسندر
إريك جاما
رالف جونسن
John Vlissides
Grady Booch
كينت بيك
وورد كانينغهام
مارتن فاولر
روبرت سيسيل مارتن
Jim Coplien
دوغلاس س. شميت
Linda Rising
مجتمعات (Communities)
The Hillside Group
The Portland Pattern Repository
بوابة برمجة الحاسوب
بوابة علم الحاسوب' |
كل الوصلات الخارجية في النص الجديد (all_links ) | [
0 => 'https://web.archive.org/web/20191026065057/http://laputan.org/drc/drc.html',
1 => 'http://www.laputan.org/drc/drc.html',
2 => 'https://web.archive.org/web/20200517040540/https://www.researchgate.net/publication/2238535',
3 => 'https://www.researchgate.net/publication/2238535',
4 => 'https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/',
5 => 'http://www.betaversion.org/~stefano/linotype/news/38/',
6 => 'https://martinfowler.com/articles/injection.html',
7 => 'https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html',
8 => 'https://martinfowler.com/bliki/InversionOfControl.html',
9 => 'https://web.archive.org/web/20200509104127/https://martinfowler.com/bliki/InversionOfControl.html',
10 => 'https://web.archive.org/web/20180516215640/http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf',
11 => 'http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf',
12 => 'https://web.archive.org/web/*/http://loekbergman.nl/InsideArchitecture/TheVision/InversionOfControl',
13 => 'https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf',
14 => 'https://web.archive.org/web/20200517040519/https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf',
15 => 'https://www.martinfowler.com/articles/injection.html',
16 => 'http://docs.codehaus.org/display/PICO/IoC+Types',
17 => 'https://web.archive.org/web/20090615045650/http://docs.codehaus.org/display/PICO/IoC+Types',
18 => 'http://javaprogrammernotes.blogspot.com/2015/03/inversion-of-control-dependency.html'
] |
الوصلات في الصفحة، قبل التعديل (old_links ) | [
0 => 'http://docs.codehaus.org/display/PICO/IoC+Types',
1 => 'http://javaprogrammernotes.blogspot.com/2015/03/inversion-of-control-dependency.html',
2 => 'http://www.betaversion.org/~stefano/linotype/news/38/',
3 => 'http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf',
4 => 'http://www.laputan.org/drc/drc.html',
5 => 'https://martinfowler.com/articles/injection.html',
6 => 'https://martinfowler.com/bliki/InversionOfControl.html',
7 => 'https://web.archive.org/web/*/http://loekbergman.nl/InsideArchitecture/TheVision/InversionOfControl',
8 => 'https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/',
9 => 'https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf',
10 => 'https://web.archive.org/web/20090615045650/http://docs.codehaus.org/display/PICO/IoC+Types',
11 => 'https://web.archive.org/web/20180516215640/http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf',
12 => 'https://web.archive.org/web/20191026065057/http://laputan.org/drc/drc.html',
13 => 'https://web.archive.org/web/20200509104127/https://martinfowler.com/bliki/InversionOfControl.html',
14 => 'https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html',
15 => 'https://web.archive.org/web/20200517040519/https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf',
16 => 'https://web.archive.org/web/20200517040540/https://www.researchgate.net/publication/2238535',
17 => 'https://www.martinfowler.com/articles/injection.html',
18 => 'https://www.researchgate.net/publication/2238535'
] |
مصدر HTML المعروض للمراجعة الجديدة (new_html ) | '<div class="mw-parser-output"><ul><li>{{<sup>{{* <b>{{</b><div class="إعلام محتوى" style="محتوى"><b><div class="صورة" style="display:inline"><a href="/wiki/%D9%85%D9%84%D9%81:N_write.svg" class="image"><img alt="N write.svg" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/a5/N_write.svg/40px-N_write.svg.png" decoding="async" width="40" height="40" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/a/a5/N_write.svg/60px-N_write.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/a/a5/N_write.svg/80px-N_write.svg.png 2x" data-file-width="44" data-file-height="44" /></a></div> </b><div style="display:inline"><b><span style="float:left;"><a href="/wiki/%D9%82%D8%A7%D9%84%D8%A8:%D9%85%D9%82%D8%A7%D9%84%D8%A9_%D8%BA%D9%8A%D8%B1_%D9%85%D8%B1%D8%A7%D8%AC%D8%B9%D8%A9" title="تعرَّف على طريقة التعامل مع هذه المسألة من أجل إزالة هذا القالب."><img alt="تعرَّف على طريقة التعامل مع هذه المسألة من أجل إزالة هذا القالب." src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Breezeicons-actions-22-help-about.svg/22px-Breezeicons-actions-22-help-about.svg.png" decoding="async" width="22" height="22" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Breezeicons-actions-22-help-about.svg/33px-Breezeicons-actions-22-help-about.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Breezeicons-actions-22-help-about.svg/44px-Breezeicons-actions-22-help-about.svg.png 2x" data-file-width="512" data-file-height="512" /></a></span>هذه </b>مقالة غير مراجعة<b>. ينبغي أن يزال هذا القالب بعد أن <a href="/wiki/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7:%D9%85%D8%B1%D8%A7%D8%AC%D8%B9%D8%A7%D8%AA_%D9%85%D8%B9%D9%84%D9%85%D8%A9" title="ويكيبيديا:مراجعات معلمة">يراجعها</a> محرر؛ إذا لزم الأمر فيجب أن توسم المقالة <a href="/wiki/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7:%D9%82%D9%88%D8%A7%D9%84%D8%A8_%D8%B5%D9%8A%D8%A7%D9%86%D8%A9" title="ويكيبيديا:قوالب صيانة">بقوالب الصيانة</a> المناسبة. يمكن أيضاً تقديم </b><a href="/wiki/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7:%D8%B7%D9%84%D8%A8%D8%A7%D8%AA_%D9%85%D8%B1%D8%A7%D8%AC%D8%B9%D8%A9_%D8%A7%D9%84%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA" title="ويكيبيديا:طلبات مراجعة المقالات">طلب لمراجعة المقالة</a><b> في الصفحة المخصصة لذلك. <small>(مايو 2020)</small></b></div></div>
<ul><li>في <a href="/wiki/%D9%87%D9%86%D8%AF%D8%B3%D8%A9_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA" title="هندسة البرمجيات">هندسة البرمجيات</a> ، يعد <b>عكس التحكم</b> ( <b>IoC</b> ) (<a href="/wiki/%D8%A7%D9%84%D9%84%D8%BA%D8%A9_%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D9%84%D9%8A%D8%B2%D9%8A%D8%A9" title="اللغة الإنجليزية">بالإنجليزية</a>: <span class="mw-content-ltr" lang="en">inversion of control</span>) مبدأ في البرمجة. يعكس IoC <a href="/wiki/%D8%AA%D8%AF%D9%81%D9%82_%D8%A7%D9%84%D8%B3%D9%8A%D8%B7%D8%B1%D8%A9" title="تدفق السيطرة">تدفق التحكم</a> flow of control مقارنة بتدفق التحكم التقليديtraditional control flow. في IoC ، تتلقى أجزاء مكتوبة خصيصًا custom-written portions</li>
<li>}}<b>=={{}}}}</b></li></ul></sup></li></ul>
<p>==
</p>
<div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="ar" dir="rtl"><h2 id="mw-toc-heading">محتويات</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
<ul>
<li class="toclevel-1"><a href="#{{[1]}}"><span class="tocnumber">1</span> <span class="toctext">{{<sup>[1]</sup>}}</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#نظرة_عامة"><span class="tocnumber">2</span> <span class="toctext">نظرة عامة</span></a></li>
<li class="toclevel-1 tocsection-3"><a href="#خلفية"><span class="tocnumber">3</span> <span class="toctext">خلفية</span></a></li>
<li class="toclevel-1 tocsection-4"><a href="#وصف"><span class="tocnumber">4</span> <span class="toctext">وصف</span></a></li>
<li class="toclevel-1 tocsection-5"><a href="#تقنيات_التنفيذ"><span class="tocnumber">5</span> <span class="toctext">تقنيات التنفيذ</span></a></li>
<li class="toclevel-1 tocsection-6"><a href="#أمثلة"><span class="tocnumber">6</span> <span class="toctext">أمثلة</span></a></li>
<li class="toclevel-1 tocsection-7"><a href="#انظر_أيضا"><span class="tocnumber">7</span> <span class="toctext">انظر أيضا</span></a></li>
<li class="toclevel-1 tocsection-8"><a href="#المراجع"><span class="tocnumber">8</span> <span class="toctext">المراجع</span></a></li>
<li class="toclevel-1 tocsection-9"><a href="#روابط_خارجية"><span class="tocnumber">9</span> <span class="toctext">روابط خارجية</span></a></li>
</ul>
</div>
<h2><span id=".7B.7B.5B1.5D.7D.7D"></span><span class="mw-headline" id="{{[1]}}">{{<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>}}</span></h2>
<p>==
}}==
</p>
<pre>من <a href="/wiki/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC_(%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="برنامج (حاسوب)">برنامج الكمبيوتر</a> تدفق التحكم من <a href="/wiki/%D8%A5%D8%B7%D8%A7%D8%B1_%D8%B9%D9%85%D9%84_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="إطار عمل (برمجة)">إطار</a> عامgeneric framework. إن <a href="/wiki/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9_%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA" title="معمارية برمجيات">هندسة البرمجيات</a> software architectureمع هذا التصميم تعكس التحكم مقارنة <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D8%A5%D8%AC%D8%B1%D8%A7%D8%A6%D9%8A%D8%A9" title="برمجة إجرائية">بالبرمجة الإجرائية</a> procedural programming التقليدية: في البرمجة التقليدية، الرمز code المخصص الذي يعبر عن الغرض من البرنامج <a href="/wiki/%D8%AF%D8%A7%D9%84%D8%A9_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="دالة (برمجة)">يستدعي</a> callsمكتبات libraries قابلة لإعادة الاستخدام لرعاية المهام العامة generic tasks، ولكن مع عكس التحكم، فهو الإطارframework الذي يستدعي الرمز code المخصصcustom أو الخاص بالمهمة task-specific.
</pre>
<p>يستخدم عكس التحكم لزيادة <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D8%AA%D8%B1%D9%83%D9%8A%D8%A8%D9%8A%D8%A9" title="برمجة تركيبية">نمطية</a><a href="https://en.wikipedia.org/wiki/Modularity_(programming)" class="extiw" title="en:Modularity (programming)">modularity</a> البرنامج وجعله قابلاً للتوسيع <a href="https://en.wikipedia.org/wiki/Extensible_programming" class="extiw" title="en:Extensible programming">extensible</a>، <sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[2]</a></sup> ولديه تطبيقات في <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87" title="برمجة كائنية التوجه">البرمجة</a> <a href="/wiki/%D9%86%D9%85%D8%B7_%D8%A8%D8%B1%D9%85%D8%AC%D8%A9" title="نمط برمجة">الشيئية</a><a href="https://en.wikipedia.org/wiki/Object-oriented_programming" class="extiw" title="en:Object-oriented programming">object-oriented programming</a> ونماذج البرمجة <a href="https://en.wikipedia.org/wiki/Programming_paradigm" class="extiw" title="en:Programming paradigm">programming paradigms</a>الأخرى. استخدم مايكل ماتسونMichael Mattsson هذا المصطلح في أطروحة، <sup id="cite_ref-3" class="reference"><a href="#cite_note-3">[3]</a></sup> مأخوذة من هناك <sup id="cite_ref-4" class="reference"><a href="#cite_note-4">[4]</a></sup> بواسطة ستيفانو مازوتشي Stefano Mazzocchiوشاعه في عام 1999 في مشروع مؤسسة برمجيات أباتشي البائدdefunct Apache Software Foundation project ، أفالون-Avalon> ، ثم تم تعميمه في عام 2004 من قبل <a href="/wiki/%D8%B1%D9%88%D8%A8%D8%B1%D8%AA_%D8%B3%D9%8A%D8%B3%D9%8A%D9%84_%D9%85%D8%A7%D8%B1%D8%AA%D9%86" title="روبرت سيسيل مارتن">روبرت سي مارتن</a> <a href="https://en.wikipedia.org/wiki/Robert_Cecil_Martin" class="extiw" title="en:Robert Cecil Martin">Robert C. Martin</a>و <a href="/wiki/%D9%85%D8%A7%D8%B1%D8%AA%D9%86_%D9%81%D8%A7%D9%88%D9%84%D8%B1" title="مارتن فاولر">مارتن فاولر</a><a href="https://en.wikipedia.org/wiki/Martin_Fowler_(software_engineer)" class="extiw" title="en:Martin Fowler (software engineer)">Martin Fowler</a> .
</p><p>يرتبط المصطلح بمبدأ انقلاب التبعية <a href="https://en.wikipedia.org/wiki/Dependency_inversion_principle" class="extiw" title="en:Dependency inversion principle">dependency inversion principle</a>، ولكنه يختلف عنه، والذي يهتم <a href="/wiki/%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D9%86_(%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="اقتران (حاسوب)">بفصل التبعيات</a><a href="https://en.wikipedia.org/wiki/Dependency_(computer_science)" class="extiw" title="en:Dependency (computer science)">decoupling dependencies</a> بين الطبقات عالية المستوى ومنخفضة المستوى high-level and low-level layers من خلال <a href="/wiki/%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF_(%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="تجريد (حاسوب)">التجريدات</a><a href="https://en.wikipedia.org/wiki/Abstraction_(computing)" class="extiw" title="en:Abstraction (computing)">abstractions</a> المشتركة. يرتبط المفهوم العام أيضًا بالبرمجة القائمة على الأحداثevent-driven programming من حيث أنه غالبًا ما يتم تنفيذه باستخدام IoC ، بحيث لا يهتم الرمز المخصصcustom code عادة إلا بمعالجة الأحداث handling of events، في حين يتم التعامل مع حلقة الأحداث [[:en:Event
<a href="/wiki/%D8%AC%D8%A7%D8%A6%D8%B2%D8%A9_%D8%A8%D9%8A_%D8%A8%D9%8A_%D8%B3%D9%8A_%D9%84%D8%A3%D9%81%D8%B6%D9%84_%D9%84%D8%A7%D8%B9%D8%A8_%D9%83%D8%B1%D8%A9_%D9%82%D8%AF%D9%85_%D8%A3%D9%81%D8%B1%D9%8A%D9%82%D9%8A_%D9%81%D9%8A_%D8%A7%D9%84%D8%B3%D9%86%D8%A9" title="جائزة بي بي سي لأفضل لاعب كرة قدم أفريقي في السنة"> </a>
</p>
<pre>loop|event loop]]وإرسال dispatchالأحداث / الرسائل من خلال الإطارframework أو بيئة وقت التشغيل runtime environment..
</pre>
<h2><span id=".D9.86.D8.B8.D8.B1.D8.A9_.D8.B9.D8.A7.D9.85.D8.A9"></span><span class="mw-headline" id="نظرة_عامة">نظرة عامة</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=2" title="عدل القسم: نظرة عامة">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>كمثال، مع البرمجة التقليدية، قد تقوم الوظيفة الرئيسية <a href="https://en.wikipedia.org/wiki/Main_function" class="extiw" title="en:Main function">main function</a>للتطبيق بإجراء استدعاءات وظيفية في قائمة مكتبة menu library لعرض قائمة <a href="/wiki/%D8%A3%D9%85%D8%B1_(%D8%AD%D9%88%D8%B3%D8%A8%D8%A9)" title="أمر (حوسبة)">بالأوامر</a> <a href="https://en.wikipedia.org/wiki/Command_(computing)" class="extiw" title="en:Command (computing)">commands</a> المتاحة والاستعلام query عن المستخدم لاختيار واحد.<sup id="cite_ref-FowlerDI_5-0" class="reference"><a href="#cite_note-FowlerDI-5">[5]</a></sup> وبالتالي ستعيد المكتبة الخيار الذي تم اختياره كقيمة استدعاء الدالة the value of the function call، وتستخدم الدالة الرئيسية main function هذه القيمة لتنفيذ الأمر المرتبطexecute the associated command.. كان هذا النمط شائعًا في <a href="/wiki/%D9%88%D8%A7%D8%AC%D9%87%D8%A9_%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85_%D9%86%D8%B5%D9%8A%D8%A9" title="واجهة مستخدم نصية">الواجهات القائمة على النص</a><a href="https://en.wikipedia.org/wiki/Text_based_interface" class="extiw" title="en:Text based interface">text based interfaces</a> . على سبيل المثال، قد يعرض <a href="/wiki/%D8%B9%D9%85%D9%8A%D9%84_%D8%A8%D8%B1%D9%8A%D8%AF_%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A" title="عميل بريد إلكتروني">عميل البريد الإلكتروني</a> <a href="https://en.wikipedia.org/wiki/Email_client" class="extiw" title="en:Email client">email client</a> شاشة تحتوي على أوامر لتحميل بريد جديد، والإجابة على البريد الحالي، وبدء بريد جديد، وما إلى ذلك، وسيحظر تنفيذ البرنامج حتى يضغط المستخدم على مفتاح key لتحديد أمرcommand.
</p><p>مع عكس التحكم inversion of control، من ناحية أخرى، سيتم كتابة <a href="/wiki/%D8%A5%D8%B7%D8%A7%D8%B1_%D8%B9%D9%85%D9%84_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="إطار عمل (برمجة)">البرنامج</a> باستخدام <a href="/wiki/%D8%A5%D8%B7%D8%A7%D8%B1_%D8%B9%D9%85%D9%84_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="إطار عمل (برمجة)">إطار برنامج</a><a href="https://en.wikipedia.org/wiki/Software_framework" class="extiw" title="en:Software framework">software framework</a> يعرف العناصر السلوكية 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 <a href="/wiki/%D8%B3%D8%B7%D8%AD_%D8%A8%D9%8A%D9%86%D9%8A_%D9%84%D9%84%D8%B4%D8%A8%D9%83%D8%A9" title="سطح بيني للشبكة">واجهة الشبكة</a> <a href="https://en.wikipedia.org/wiki/Network_interface" class="extiw" title="en:Network interface">network interface</a>لمعرفة ما إذا كانت الرسائل الجديدة تصل وتحديث الشاشة refresh the screen عندما تم الكشفdetected عن نشاط الشبكة network activity. يمكن استخدام نفس الإطارframework كالهيكل العظميskeleton لبرنامج جداول البيانات spreadsheet programأو محرر النصوص text editor. على العكس من ذلك، لا يعرف الإطار شيئًا عن متصفحات الويب أو جداول البيانات أو محرري النصوص ؛ يتطلب تنفيذ وظائفهمfunctionality رمزًا مخصصًاcustom code.
</p><p>إن انعكاس التحكم يحمل دلالة قوية strong connotation على أن الكود القابل لإعادة الاستخدام والرمز الخاص بالمشكلة problem-specific يتم تطويرهما بشكل مستقل على الرغم من أنهما يعملان معًا في تطبيق. <a href="/wiki/%D8%A5%D8%B7%D8%A7%D8%B1_%D8%B9%D9%85%D9%84_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="إطار عمل (برمجة)">إطار عمل</a> <a href="https://en.wikipedia.org/wiki/Software_framework" class="extiw" title="en:Software framework">Software frameworks</a>، الاسترجاعات <a href="https://en.wikipedia.org/wiki/Callback_(computer_programming)" class="extiw" title="en:Callback (computer programming)">callbacks</a>، <a href="/wiki/%D8%AC%D8%AF%D9%88%D9%84%D8%A9_(%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="جدولة (حاسوب)">المنظمون</a><a href="https://en.wikipedia.org/wiki/Scheduling_(computing)" class="extiw" title="en:Scheduling (computing)">schedulers</a> ، حلقات الحدث<a event loops ، حقن التبعيةdependency injection ، و طريقة قالب <template method> أمثلة من <a href="/wiki/%D9%82%D8%A7%D9%84%D8%A8_%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85_(%D8%B9%D9%84%D9%85_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D8%A8)" class="mw-redirect" title="قالب التصميم (علم الحاسب)">أنماط التصميم</a><a href="https://en.wikipedia.org/wiki/Design_pattern" class="extiw" title="en:Design pattern">design patterns</a> التي تتبع مبدأ انعكاس السيطرة inversion of control principle، ايضاً المصطلح أكثر شيوعا في سياق <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87" title="برمجة كائنية التوجه">البرمجة كائنية التوجه</a> <a href="https://en.wikipedia.org/wiki/Object-oriented_programming" class="extiw" title="en:Object-oriented programming">object-oriented programming</a>. .
</p><p>يخدم عكس التحكم Inversion of control اهداف التصميم design التالية:
</p>
<ul><li><a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87" title="برمجة كائنية التوجه">فصل</a><a href="https://en.wikipedia.org/wiki/Object_decoupling" class="extiw" title="en:Object decoupling">decouple</a> تنفيذ المهمة execution of a task عن التنفيذimplementation.</li>
<li>لتركيز الوحدة النمطية module على المهمة المصممة لها.</li>
<li>لتحرير الوحدات النمطية free modulesمن الافتراضات assumptions حول كيفية قيام الأنظمة الأخرى بما تفعله وبدلاً من ذلك تعتمد على <a href="/wiki/%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A8%D8%A7%D9%84%D8%B9%D9%82%D9%88%D8%AF" title="تصميم بالعقود">العقود</a> <a href="https://en.wikipedia.org/wiki/Design_by_contract" class="extiw" title="en:Design by contract">contracts</a>.</li>
<li>لمنع <a href="/wiki/%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1_%D8%AC%D8%A7%D9%86%D8%A8%D9%8A_(%D8%B9%D9%84%D9%85_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="تأثير جانبي (علم الحاسوب)">الآثار الجانبية</a> <a href="https://en.wikipedia.org/wiki/Side_effect_(computer_science)" class="extiw" title="en:Side effect (computer science)">side effects</a>عند استبدال الوحدة module.</li></ul>
<p>أحيانًا ما يُشار إلى انقلاب السيطرة بشكل ظاهري باسم "مبدأ هوليوود: لا تتصل بنا، نحن من سيتصل بك".
</p>
<h2><span id=".D8.AE.D9.84.D9.81.D9.8A.D8.A9"></span><span class="mw-headline" id="خلفية">خلفية</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=3" title="عدل القسم: خلفية">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>إن عكس التحكم ليس مصطلحًا جديدًا في علوم الكمبيوتر. يتتبع <a href="/wiki/%D9%85%D8%A7%D8%B1%D8%AA%D9%86_%D9%81%D8%A7%D9%88%D9%84%D8%B1" title="مارتن فاولر">مارتن فاولر</a><a href="https://en.wikipedia.org/wiki/Martin_Fowler_(software_engineer)" class="extiw" title="en:Martin Fowler (software engineer)">Martin Fowler</a> أصل العبارة حتى عام 1988 ، <sup id="cite_ref-FowlerIoC_6-0" class="reference"><a href="#cite_note-FowlerIoC-6">[6]</a></sup> ولكنها ترتبط ارتباطًا وثيقًا بمفهوم <b>عكس البرنامج program inversionالذي</b> وصفه <a href="/wiki/%D9%85%D8%A7%D9%8A%D9%83%D9%84_%D8%AC%D8%A7%D9%83%D8%B3%D9%88%D9%86_(%D8%B9%D8%A7%D9%84%D9%85_%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="مايكل جاكسون (عالم حاسوب)">مايكل جاكسون</a><a href="https://en.wikipedia.org/wiki/Michael_A._Jackson" class="extiw" title="en:Michael A. Jackson">Michael Jackson</a> في منهجيتهmethodology في البرمجة جاكسون المنظمة<a Jackson Structured Programming> في السبعينيات.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7">[7]</a></sup> يمكن رؤية المحلل من الأسفل إلى الأعلى<a href="https://en.wikipedia.org/wiki/Bottom-up_parsing" class="extiw" title="en:Bottom-up parsing">bottom-up parser</a> على أنه انعكاس <a href="/wiki/%D8%A7%D9%84%D8%AA%D8%AD%D9%84%D9%8A%D9%84_%D9%85%D9%86_%D8%A3%D8%B9%D9%84%D9%89_%D8%A5%D9%84%D9%89_%D8%A3%D8%B3%D9%81%D9%84" title="التحليل من أعلى إلى أسفل">للمحلل</a> من <a href="/wiki/%D8%A7%D9%84%D8%AA%D8%AD%D9%84%D9%8A%D9%84_%D9%85%D9%86_%D8%A3%D8%B9%D9%84%D9%89_%D8%A5%D9%84%D9%89_%D8%A3%D8%B3%D9%81%D9%84" title="التحليل من أعلى إلى أسفل">أعلى لأسفل</a><a href="https://en.wikipedia.org/wiki/Top-down_parsing" class="extiw" title="en:Top-down parsing">top-down parser</a> : في الحالة الأولى، يقع عنصر التحكم على المحلل اللغوي parser، بينما في الحالة الأخرى، يقع على عاتق تطبيق الاستلام receiving application.
</p><p>حقن التبعية <a href="https://en.wikipedia.org/wiki/Dependency_injection" class="extiw" title="en:Dependency injection">Dependency injection</a>هو نوع معين من IoC.<sup id="cite_ref-FowlerDI_5-1" class="reference"><a href="#cite_note-FowlerDI-5">[5]</a></sup> يشبه محدد الخدمة <service locator> مثل Java Naming and Directory Interface (JNDI). في مقال كتبه Loek Bergman ، <sup id="cite_ref-8" class="reference"><a href="#cite_note-8">[8]</a></sup> تم تقديمه كمبدأ معماريarchitectural principle.
</p><p>في مقال بقلم <a href="/wiki/%D8%B1%D9%88%D8%A8%D8%B1%D8%AA_%D8%B3%D9%8A%D8%B3%D9%8A%D9%84_%D9%85%D8%A7%D8%B1%D8%AA%D9%86" title="روبرت سيسيل مارتن">روبرت سي مارتن</a> <a href="https://en.wikipedia.org/wiki/Robert_Cecil_Martin" class="extiw" title="en:Robert Cecil Martin">Robert C. Martin</a>، <sup id="cite_ref-robertmartin_9-0" class="reference"><a href="#cite_note-robertmartin-9">[9]</a></sup> يأتي مبدأ انعكاس التبعية dependency inversion principleوالتجريدabstraction عن طريق الطبقات معا layering come together. إن سبب استخدام مصطلح "الانقلاب" inversion بالمقارنة مع طرق تطوير البرمجيات التقليدية. يصف فك ربط الخدماتuncoupling of services عن طريق تجريد الطبقاتabstraction of layers عندما يتحدث عن انعكاس التبعية dependency inversion. يستخدم المبدأ لمعرفة أين توجد حدود النظام في تصميمdesign طبقات التجريدabstraction layers..
</p>
<h2><span id=".D9.88.D8.B5.D9.81"></span><span class="mw-headline" id="وصف">وصف</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=4" title="عدل القسم: وصف">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>في البرمجة التقليدية traditional programming، يتم تحديد <a href="/wiki/%D8%AA%D8%AF%D9%81%D9%82_%D8%A7%D9%84%D8%B3%D9%8A%D8%B7%D8%B1%D8%A9" title="تدفق السيطرة">تدفق</a> <a href="/wiki/%D9%85%D9%86%D8%B7%D9%82_%D8%A7%D9%84%D8%B9%D9%85%D9%84" title="منطق العمل">منطق الأعمال</a> the <a href="https://en.wikipedia.org/wiki/Control_flow" class="extiw" title="en:Control flow">flow</a> of the <a href="https://en.wikipedia.org/wiki/Business_logic" class="extiw" title="en:Business logic">business logic</a> بواسطة كائناتobjects مرتبطة بشكل ثابت ببعضها"Static binding" statically bound البعض. مع عكس التحكم، يعتمد التدفق flow على الرسم البياني للكائن object graphالذي تم إنشاؤه أثناء تنفيذ البرنامج. مثل هذا التدفق الديناميdynamic flow أصبح ممكنا من خلال تفاعلات الكائن object interactionsالتي يتم تعريفها من خلال التجريدabstractions. يتم تحقيق هذا الربط في وقت التشغيل "run-time binding بواسطة آليات مثل حقن التبعية dependency injection أو محدد مواقع الخدمة <a href="https://en.wikipedia.org/wiki/Service_locator_pattern" class="extiw" title="en:Service locator pattern">service locator</a>. في IoC ، يمكن أيضًا ربط الكود بشكل ثابت linked statically أثناء التجميع compilation، ولكن العثور على الكود ليتم تنفيذه من خلال قراءة وصفه من <a href="/wiki/%D9%85%D9%84%D9%81_%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF" title="ملف إعداد">التكوين الخارجي</a> <a href="https://en.wikipedia.org/wiki/Configuration_file" class="extiw" title="en:Configuration file">external configuration</a> بدلاً من مرجع مباشرdirect reference في الكود نفسه.
</p><p>في حقن التبعية dependency injection، يقترن <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87" title="برمجة كائنية التوجه">الكائن</a> <a href="https://en.wikipedia.org/wiki/Object-oriented_programming" class="extiw" title="en:Object-oriented programming">object</a>بالوحدة التابعة بالكائن dependent <a href="https://en.wikipedia.org/wiki/Object-oriented_programming" class="extiw" title="en:Object-oriented programming">object</a> or module الذي يحتاجه في <a href="/wiki/%D9%88%D9%82%D8%AA_%D8%A7%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0" title="وقت التنفيذ">وقت التشغيل</a> <a href="https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)" class="extiw" title="en:Run time (program lifecycle phase)">run time</a>. . لا يمكن عادةً معرفة الكائن المعين particular object الذي سيلبي التبعية satisfy the dependency أثناء تنفيذ البرنامجprogram execution في <a href="/wiki/%D9%88%D9%82%D8%AA_%D8%A7%D9%84%D8%AA%D8%B5%D8%B1%D9%8A%D9%81" title="وقت التصريف">وقت الترجمة</a><a href="https://en.wikipedia.org/wiki/Compile_time" class="extiw" title="en:Compile time">compile time</a> باستخدام <a href="/wiki/%D8%AA%D8%AD%D9%84%D9%8A%D9%84_%D8%A7%D9%84%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC_%D8%A7%D9%84%D8%B3%D8%A7%D9%83%D9%86" title="تحليل البرنامج الساكن">التحليل الثابت</a><a href="https://en.wikipedia.org/wiki/Compile_time" class="extiw" title="en:Compile time">compile time</a> . بينما تم وصفه من حيث تفاعل الكائنobject interaction هنا، يمكن تطبيق المبدأ على منهجيات البرمجة الأخرى إلى جانب <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87" title="برمجة كائنية التوجه">البرمجة الموجهة للكائنات</a> <a href="https://en.wikipedia.org/wiki/Object-oriented_programming" class="extiw" title="en:Object-oriented programming">object-oriented programming</a>.
</p><p>لكي يقوم البرنامج الجاريrunning program بربط الكائناتbind objects ببعضها البعض، يجب أن تمتلك الكائنات <a href="/wiki/%D9%88%D8%A7%D8%AC%D9%87%D8%A9_(%D8%AD%D9%88%D8%B3%D8%A8%D8%A9)" title="واجهة (حوسبة)">واجهات</a> متوافقة ompatible <a href="https://en.wikipedia.org/wiki/Software_interface" class="extiw" title="en:Software interface">interfaces</a>. على سبيل المثال، قد تقوم الفئة class <code>A</code> بتفويض السلوك للواجهة <code>I</code> <code>interface</code>التي يتم تنفيذها بواسطة الفئة class <code>B</code> ؛ يعمل البرنامج على إنشاء <code>A</code> و <code>B</code> ، ثم حقن <code>B</code> في <code>A</code>
</p>
<h2><span id=".D8.AA.D9.82.D9.86.D9.8A.D8.A7.D8.AA_.D8.A7.D9.84.D8.AA.D9.86.D9.81.D9.8A.D8.B0"></span><span class="mw-headline" id="تقنيات_التنفيذ">تقنيات التنفيذ</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=5" title="عدل القسم: تقنيات التنفيذ">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>في <a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9_%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87" title="برمجة كائنية التوجه">البرمجة الشيئية</a> class ، هناك العديد من التقنيات الأساسية لتنفيذ عكس التحكم. وهذه هي:
</p>
<ul><li>استخدام نمط محدد مواقع الخدمة service locator pattern</li>
<li>استخدام حقن التبعية<dependency injection> ، على سبيل المثال
<ul><li>حقن المنشئConstructor injection</li>
<li>حقن المعلمة Parameter injection</li>
<li>حقن أفضلSetter injection</li>
<li>حقن الواجهة Interface injection</li></ul></li>
<li>استخدام بحث سياقي contextualized lookup</li>
<li>باستخدام نمط تصميم طريقة القالب <template method design pattern></li>
<li>استخدام <a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%A5%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A9" title="نموذج الإستراتيجية">نمط التصميم الاستراتيجي</a><a href="https://en.wikipedia.org/wiki/Strategy_design_pattern" class="extiw" title="en:Strategy design pattern">strategy design pattern</a></li></ul>
<p>في مقال أصلي لمارتن فاولرMartin Fowler ، <sup id="cite_ref-10" class="reference"><a href="#cite_note-10">[10]</a></sup> تمت مناقشة التقنيات الثلاثة الأولى. في وصف حول عكس أنواع التحكم، <sup id="cite_ref-11" class="reference"><a href="#cite_note-11">[11]</a></sup> تم ذكر النوع الأخير. غالبًا ما يتم إنجاز البحث السياقي contextualized lookupباستخدام محدد مواقع الخدمة service locator
</p>
<h2><span id=".D8.A3.D9.85.D8.AB.D9.84.D8.A9"></span><span class="mw-headline" id="أمثلة">أمثلة</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=6" title="عدل القسم: أمثلة">عدل</a><span class="mw-editsection-bracket">]</span></span></h2><p>
معظم الأطرMost frameworks مثل <a href="/wiki/%D8%AF%D9%88%D8%AA_%D9%86%D8%AA_%D9%81%D8%B1%D9%8A%D9%85%D9%88%D9%88%D8%B1%D9%83" title="دوت نت فريموورك">.</a> <a href="/wiki/%D8%AF%D9%88%D8%AA_%D9%86%D8%AA_%D9%81%D8%B1%D9%8A%D9%85%D9%88%D9%88%D8%B1%D9%83" title="دوت نت فريموورك">NET</a> أو <a href="/wiki/%D9%85%D9%86%D8%B5%D8%A9_%D8%AC%D8%A7%D9%81%D8%A7_(%D8%A7%D9%84%D9%86%D8%B3%D8%AE%D8%A9_%D8%A7%D9%84%D8%AA%D8%AC%D8%A7%D8%B1%D9%8A%D8%A9)" title="منصة جافا (النسخة التجارية)">Enterprise Java</a> يعرض هذا النمطpattern : </p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ServerFacade</span> <span class="p">{</span>
<span class="kd">public</span> <span class="o"><</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">></span> <span class="n">V</span> <span class="nf">respondToRequest</span><span class="p">(</span><span class="n">K</span> <span class="n">request</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">businessLayer</span><span class="p">.</span><span class="na">validateRequest</span><span class="p">(</span><span class="n">request</span><span class="p">))</span> <span class="p">{</span>
<span class="n">Data</span> <span class="n">data</span> <span class="o">=</span> <span class="n">DAO</span><span class="p">.</span><span class="na">getData</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
<span class="k">return</span> <span class="n">Aspect</span><span class="p">.</span><span class="na">convertData</span><span class="p">(</span><span class="n">data</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div><p> يعطي هذا المخطط التفصيلي الأساسيbasic outline في Java مثالاً على التعليمات البرمجية باتباع منهجية IoC. من المهم، مع ذلك، أن فيServerFacade <a href="/w/index.php?title=%D9%82%D8%A7%D9%84%D8%A8:Java&action=edit&redlink=1" class="new" title="قالب:Java (الصفحة غير موجودة)">قالب:Java</a> يتم إجراء الكثير من الافتراضاتassumptions حول البياناتdata التي يتم إرجاعهاreturned بواسطة كائن الوصول إلى البيانات object (DAO).
</p><p>على الرغم من أن كل هذه الافتراضات قد تكون صالحة في وقت ما، إلا أنها ترتبط ب ServerFacade لتنفيذ DAO. سيؤدي تصميم التطبيق بطريقة قلب التحكم إلى تسليم عنصر التحكم بالكامل hand over the control completelyإلى DAO object. ثم يصبح الكود code
</p>
<p><br /></p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ServerFacade</span> <span class="p">{</span>
<span class="kd">public</span> <span class="o"><</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">></span> <span class="n">V</span> <span class="nf">respondToRequest</span><span class="p">(</span><span class="n">K</span> <span class="n">request</span><span class="p">,</span> <span class="n">DAO</span> <span class="n">dao</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">dao</span><span class="p">.</span><span class="na">getData</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div><p> يوضح المثال أن الطريقة التي <a href="/w/index.php?title=%D9%82%D8%A7%D9%84%D8%A8:Java&action=edit&redlink=1" class="new" title="قالب:Java (الصفحة غير موجودة)">قالب:Java</a> respondToRequestالطريقة يحدد ما إذا كان IoC مستخدمًا. إنها الطريقة التي يتم بها استخدام المعلماتparameters التي تحددdefine IoC IoC. يشبه هذا نمط تمرير الرسائل <a href="https://en.wikipedia.org/wiki/Message_Passing" class="extiw" title="en:Message Passing">message-passing</a>الذي تستخدمه بعض لغات البرمجة الشيئية object-oriented programming.
</p><p><br />
<a href="/w/index.php?title=%D9%82%D8%A7%D9%84%D8%A8:%D8%A7%D9%86%D9%85%D8%A7%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA&action=edit&redlink=1" class="new" title="قالب:انماط تصميم برمجيات (الصفحة غير موجودة)">قالب:انماط تصميم برمجيات</a>
</p>
<h2><span id=".D8.A7.D9.86.D8.B8.D8.B1_.D8.A3.D9.8A.D8.B6.D8.A7"></span><span class="mw-headline" id="انظر_أيضا">انظر أيضا</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=7" title="عدل القسم: انظر أيضا">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<style data-mw-deduplicate="TemplateStyles:r52273807">.mw-parser-output .div-col{margin-top:0.3em;column-width:30em}.mw-parser-output .div-col-small{font-size:90%}.mw-parser-output .div-col-rules{column-rule:1px solid #aaa}.mw-parser-output .div-col dl,.mw-parser-output .div-col ol,.mw-parser-output .div-col ul{margin-top:0}.mw-parser-output .div-col li,.mw-parser-output .div-col dd{page-break-inside:avoid;break-inside:avoid-column}</style><div class="div-col columns column-width" style="-moz-column-width: 22em; -webkit-column-width: 22em; column-width: 22em;">
<ul><li><a href="/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D8%AC%D8%A7%D9%86%D8%A8%D9%8A%D8%A9_%D8%A7%D9%84%D9%85%D9%86%D8%AD%D9%89" title="برمجة جانبية المنحى">برمجة جانبية المنحى</a></li>
<li><a href="/wiki/%D8%A7%D8%B3%D8%AA%D9%85%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9_(%D9%85%D8%B9%D9%84%D9%88%D9%85%D8%A7%D8%AA%D9%8A%D8%A9)" title="استمرارية (معلوماتية)">استمرارية</a></li>
<li><a href="/wiki/%D8%B1%D9%88%D8%AA%D9%8A%D9%86_%D8%A7%D9%84%D9%85%D9%82%D8%A7%D8%B7%D8%B9%D8%A9_(%D9%86%D8%B8%D8%A7%D9%85_%D8%AA%D8%B4%D8%BA%D9%8A%D9%84)" title="روتين المقاطعة (نظام تشغيل)">روتين المقاطعة</a></li>
<li><a href="/wiki/%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8_(%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%AA%D8%B5%D9%85%D9%8A%D9%85)" title="المراقب (نموذج تصميم)">المراقب</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D9%85%D8%AD%D8%AF%D8%AF_%D9%85%D9%88%D9%82%D8%B9_%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A9" title="نمط محدد موقع الخدمة">نمط محدد موقع الخدمة</a></li>
<li><a href="/wiki/%D8%A5%D8%B7%D8%A7%D8%B1_%D8%B9%D9%85%D9%84_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="إطار عمل (برمجة)">إطار عمل</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%A5%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A9" title="نموذج الإستراتيجية">نموذج الإستراتيجية</a></li>
<li><a href="/wiki/%D8%AA%D8%AD%D9%88%D9%8A%D9%84_%D9%84%D8%BA%D8%A9_%D8%A7%D9%84%D8%A3%D8%B3%D9%84%D9%88%D8%A8_%D8%A7%D9%84%D9%85%D9%88%D8%B3%D8%B9" title="تحويل لغة الأسلوب الموسع">تحويل لغة الأسلوب الموسع</a></li></ul>
</div>
<h2><span id=".D8.A7.D9.84.D9.85.D8.B1.D8.A7.D8.AC.D8.B9"></span><span class="mw-headline" id="المراجع">المراجع</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=8" title="عدل القسم: المراجع">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<style data-mw-deduplicate="TemplateStyles:r56810696">.mw-parser-output .reflist{font-size:90%;margin-bottom:0.5em;list-style-type:decimal;overflow-y:auto;max-height:300px}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}@media print{.mw-parser-output .reflist{overflow-y:visible!important;max-height:none!important}}</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><b> </b></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r57313094">.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:linear-gradient(transparent,transparent),url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:#d33}.mw-parser-output .cs1-visible-error{color:#d33}.mw-parser-output .cs1-maint{display:none;color:#3a3;margin-left:0.3em}.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}</style><cite id="CITEREFRalph_E._Johnson_&_Brian_Foote1988" class="citation web cs1">Ralph E. Johnson & Brian Foote (يونيو–يوليو 1988)، <a rel="nofollow" class="external text" href="https://web.archive.org/web/20191026065057/http://laputan.org/drc/drc.html">"Designing Reusable Classes"</a>، <i>Journal of Object-Oriented Programming, Volume 1, Number 2</i>، Department of Computer Science University of Illinois at Urbana-Champaign، ص. 22–35، مؤرشف من <a rel="nofollow" class="external text" href="http://www.laputan.org/drc/drc.html">الأصل</a> في 26 أكتوبر 2019<span class="reference-accessdate">، اطلع عليه بتاريخ 29 أبريل 2014</span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=Journal+of+Object-Oriented+Programming%2C+Volume+1%2C+Number+2&rft.atitle=Designing+Reusable+Classes&rft.pages=22-35&rft.date=1988-06%2F1988-07&rft.au=Ralph+E.+Johnson+%26+Brian+Foote&rft_id=http%3A%2F%2Fwww.laputan.org%2Fdrc%2Fdrc.html&rfr_id=info%3Asid%2Far.wikipedia.org%3A%D8%B9%D9%83%D8%B3+%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85" class="Z3988"></span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r57313094"/><cite id="CITEREFMichael_Mattsson1996" class="citation web cs1">Michael Mattsson (فبراير 1996)، <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200517040540/https://www.researchgate.net/publication/2238535">"Object-Oriented Frameworks, A survey of methodological issues"</a>، مؤرشف من <a rel="nofollow" class="external text" href="https://www.researchgate.net/publication/2238535">الأصل</a> في 17 مايو 2020.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=Object-Oriented+Frameworks%2C+A+survey+of+methodological+issues&rft.date=1996-02&rft.au=Michael+Mattsson&rft_id=https%3A%2F%2Fwww.researchgate.net%2Fpublication%2F2238535&rfr_id=info%3Asid%2Far.wikipedia.org%3A%D8%B9%D9%83%D8%B3+%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85" class="Z3988"></span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r57313094"/><cite id="CITEREFStefano_Mazzocchi2004" class="citation web cs1">Stefano Mazzocchi (22 يناير 2004)، <a rel="nofollow" class="external text" href="https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/">"On Inversion of Control"</a>، مؤرشف من <a rel="nofollow" class="external text" href="http://www.betaversion.org/~stefano/linotype/news/38/">الأصل</a> في 02 فبراير 2004<span class="reference-accessdate">، اطلع عليه بتاريخ أغسطس 2020</span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=On+Inversion+of+Control&rft.date=2004-01-22&rft.au=Stefano+Mazzocchi&rft_id=http%3A%2F%2Fwww.betaversion.org%2F~stefano%2Flinotype%2Fnews%2F38%2F&rfr_id=info%3Asid%2Far.wikipedia.org%3A%D8%B9%D9%83%D8%B3+%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85" class="Z3988"></span> <span class="cs1-hidden-error citation-comment"><code class="cs1-code">{{<a href="/wiki/%D9%82%D8%A7%D9%84%D8%A8:%D8%A7%D8%B3%D8%AA%D8%B4%D9%87%D8%A7%D8%AF_%D9%88%D9%8A%D8%A8" title="قالب:استشهاد ويب">استشهاد ويب</a>}}</code>: </span><span class="cs1-hidden-error citation-comment">تحقق من التاريخ في: <code class="cs1-code">|تاريخ الوصول=</code> (<a href="/wiki/%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9:CS1_errors#bad_date" title="مساعدة:CS1 errors">مساعدة</a>)</span></span>
</li>
<li id="cite_note-FowlerDI-5"><span class="mw-cite-backlink">↑ <a href="#cite_ref-FowlerDI_5-0"><sup><i><b>أ</b></i></sup></a> <a href="#cite_ref-FowlerDI_5-1"><sup><i><b>ب</b></i></sup></a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://martinfowler.com/articles/injection.html">Dependency Injection</a>. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html">نسخة محفوظة</a> 12 مايو 2020 على موقع <a href="/wiki/%D9%88%D8%A7%D9%8A_%D8%A8%D8%A7%D9%83_%D9%85%D8%B4%D9%8A%D9%86" title="واي باك مشين">واي باك مشين</a>.</span>
</li>
<li id="cite_note-FowlerIoC-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-FowlerIoC_6-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://martinfowler.com/bliki/InversionOfControl.html">Inversion of Control</a> on Martin Fowler's Bliki <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200509104127/https://martinfowler.com/bliki/InversionOfControl.html">نسخة محفوظة</a> 9 مايو 2020 على موقع <a href="/wiki/%D9%88%D8%A7%D9%8A_%D8%A8%D8%A7%D9%83_%D9%85%D8%B4%D9%8A%D9%86" title="واي باك مشين">واي باك مشين</a>.</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r57313094"/><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20180516215640/http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf">"Introduction to Jackson Design Method"</a> <span class="cs1-format">(PDF)</span>، مؤرشف من <a rel="nofollow" class="external text" href="http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf">الأصل</a> <span class="cs1-format">(PDF)</span> في 16 مايو 2018.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=Introduction+to+Jackson+Design+Method&rft_id=http%3A%2F%2Fwww.jacksonworkbench.co.uk%2Fstevefergspages%2Fpapers%2Fourusoff--introduction_to_jackson_design_method.pdf&rfr_id=info%3Asid%2Far.wikipedia.org%3A%D8%B9%D9%83%D8%B3+%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85" class="Z3988"></span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://web.archive.org/web/*/http://loekbergman.nl/InsideArchitecture/TheVision/InversionOfControl">نسخة محفوظة</a> index على موقع <a href="/wiki/%D9%88%D8%A7%D9%8A_%D8%A8%D8%A7%D9%83_%D9%85%D8%B4%D9%8A%D9%86" title="واي باك مشين">واي باك مشين</a>. Inside Architecture: write once, run anywhere by Loek Bergman</span>
</li>
<li id="cite_note-robertmartin-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-robertmartin_9-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf">The Dependency Inversion principle</a> by Robert C. Martin <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200517040519/https://web.archive.org/web/20041221102842/http://www.objectmentor.com/resources/articles/dip.pdf">نسخة محفوظة</a> 17 مايو 2020 على موقع <a href="/wiki/%D9%88%D8%A7%D9%8A_%D8%A8%D8%A7%D9%83_%D9%85%D8%B4%D9%8A%D9%86" title="واي باك مشين">واي باك مشين</a>.</span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.martinfowler.com/articles/injection.html">Inversion of Control Containers and the Dependency Injection Pattern</a> by Martin Fowler <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200512234946/https://martinfowler.com/articles/injection.html">نسخة محفوظة</a> 12 مايو 2020 على موقع <a href="/wiki/%D9%88%D8%A7%D9%8A_%D8%A8%D8%A7%D9%83_%D9%85%D8%B4%D9%8A%D9%86" title="واي باك مشين">واي باك مشين</a>.</span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://docs.codehaus.org/display/PICO/IoC+Types">IoC Types</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20090615045650/http://docs.codehaus.org/display/PICO/IoC+Types">نسخة محفوظة</a> 15 June 2009 على موقع <a href="/wiki/%D9%88%D8%A7%D9%8A_%D8%A8%D8%A7%D9%83_%D9%85%D8%B4%D9%8A%D9%86" title="واي باك مشين">واي باك مشين</a>.</span>
</li>
</ol></div></div>
<h2><span id=".D8.B1.D9.88.D8.A7.D8.A8.D8.B7_.D8.AE.D8.A7.D8.B1.D8.AC.D9.8A.D8.A9"></span><span class="mw-headline" id="روابط_خارجية">روابط خارجية</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=%D8%B9%D9%83%D8%B3_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85&action=edit&section=9" title="عدل القسم: روابط خارجية">عدل</a><span class="mw-editsection-bracket">]</span></span></h2>
<ul><li><a rel="nofollow" class="external text" href="http://javaprogrammernotes.blogspot.com/2015/03/inversion-of-control-dependency.html">عكس تفسير التحكم ومثال التنفيذ</a><div role="navigation" class="navbox" aria-labelledby="أنماط_تصميم_البرمجيات_(برمجة)" style="padding:1px"><table class="nowraplinks hlist mw-collapsible mw-collapsed navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r52500470">.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:right;text-align:right}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-left:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-right:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}.mw-parser-output .infobox .navbar{font-size:100%}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:right;text-align:right;margin-left:0.5em}</style><div class="navbar plainlinks hlist navbar-mini"><ul><li class="nv-view"><a href="/wiki/%D9%82%D8%A7%D9%84%D8%A8:%D8%A3%D9%86%D9%85%D8%A7%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA" title="قالب:أنماط تصميم البرمجيات"><abbr title="عرض هذا القالب" style=";;background:none transparent;border:none;box-shadow:none;padding:0;">ع</abbr></a></li><li class="nv-talk"><a href="/wiki/%D9%86%D9%82%D8%A7%D8%B4_%D8%A7%D9%84%D9%82%D8%A7%D9%84%D8%A8:%D8%A3%D9%86%D9%85%D8%A7%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA" title="نقاش القالب:أنماط تصميم البرمجيات"><abbr title="ناقش هذا القالب" style=";;background:none transparent;border:none;box-shadow:none;padding:0;">ن</abbr></a></li><li class="nv-edit"><a class="external text" href="https://ar.wikipedia.org/w/index.php?title=%D9%82%D8%A7%D9%84%D8%A8:%D8%A3%D9%86%D9%85%D8%A7%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA&action=edit"><abbr title="عدل هذا القالب" style=";;background:none transparent;border:none;box-shadow:none;padding:0;">ت</abbr></a></li></ul></div><div id="أنماط_تصميم_البرمجيات_(برمجة)" style="font-size:114%;margin:0 4em"><a href="/wiki/%D9%82%D8%A7%D9%84%D8%A8:%D8%A3%D9%86%D9%85%D8%A7%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA" title="قالب:أنماط تصميم البرمجيات"> أنماط تصميم البرمجيات</a> (<a href="/wiki/%D8%A8%D9%88%D8%A7%D8%A8%D8%A9:%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" title="بوابة:برمجة الحاسوب">برمجة</a>)</div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/%D8%A3%D9%86%D9%85%D8%A7%D8%B7_%D8%A5%D8%A8%D8%AF%D8%A7%D8%B9%D9%8A%D8%A9" title="أنماط إبداعية">إنشائي (Creational)</a></th><td class="navbox-list navbox-odd hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<li><a href="/w/index.php?title=Abstract_factory_pattern&action=edit&redlink=1" class="new" title="Abstract factory pattern (الصفحة غير موجودة)">Abstract factory</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D8%A8%D8%A7%D9%86%D9%8A" title="نمط تصميم الباني">نمط تصميم الباني</a></li>
<li><a href="/wiki/%D8%AD%D9%82%D9%86_%D8%A7%D9%84%D8%AA%D8%A8%D8%B9%D9%8A%D8%A9" title="حقن التبعية">حقن التبعية</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%B7%D8%B1%D9%8A%D9%82%D8%A9_%D8%A7%D9%84%D9%85%D8%B5%D9%86%D8%B9" title="نمط طريقة المصنع">نمط طريقة المصنع</a></li>
<li><a href="/w/index.php?title=Lazy_initialization&action=edit&redlink=1" class="new" title="Lazy initialization (الصفحة غير موجودة)">Lazy initialization</a></li>
<li><a href="/w/index.php?title=Multiton_pattern&action=edit&redlink=1" class="new" title="Multiton pattern (الصفحة غير موجودة)">Multiton</a></li>
<li><a href="/w/index.php?title=Object_pool_pattern&action=edit&redlink=1" class="new" title="Object pool pattern (الصفحة غير موجودة)">Object pool</a></li>
<li><a href="/w/index.php?title=Prototype_pattern&action=edit&redlink=1" class="new" title="Prototype pattern (الصفحة غير موجودة)">Prototype</a></li>
<li><a href="/wiki/%D8%A7%D9%83%D8%AA%D8%B3%D8%A7%D8%A8_%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B1%D8%AF_%D8%AA%D9%87%D9%8A%D8%A6%D8%A9" title="اكتساب الموارد تهيئة">اكتساب الموارد تهيئة</a></li>
<li><a href="/wiki/%D8%A7%D9%84%D9%86%D9%85%D8%B7_%D8%A7%D9%84%D9%85%D9%81%D8%B1%D8%AF" title="النمط المفرد">النمط المفرد</a></li>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">هيكلي (Structural)</th><td class="navbox-list navbox-even hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84" title="نمط المحول">نمط المحول</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%AC%D8%B3%D8%B1" title="نموذج التصميم جسر">نموذج التصميم جسر</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D9%85%D8%AC%D9%85%D8%B9" title="نموذج التصميم المجمع">نموذج التصميم المجمع</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%AF%D9%8A%D9%83%D9%88%D8%B1" title="نموذج التصميم ديكور">نموذج التصميم ديكور</a></li>
<li><a href="/w/index.php?title=Delegation_pattern&action=edit&redlink=1" class="new" title="Delegation pattern (الصفحة غير موجودة)">Delegation</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D9%88%D8%A7%D8%AC%D9%87%D8%A9_%D8%A7%D9%84%D9%85%D8%A8%D9%86%D9%89" title="نمط واجهة المبنى">نمط واجهة المبنى</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D9%88%D8%B2%D9%86_%D8%A7%D9%84%D8%B0%D8%A8%D8%A7%D8%A8%D8%A9" title="نموذج التصميم وزن الذبابة">نموذج التصميم وزن الذبابة</a></li>
<li><a href="/w/index.php?title=Front_controller&action=edit&redlink=1" class="new" title="Front controller (الصفحة غير موجودة)">Front controller</a></li>
<li><a href="/w/index.php?title=Marker_interface_pattern&action=edit&redlink=1" class="new" title="Marker interface pattern (الصفحة غير موجودة)">Marker interface</a></li>
<li><a href="/w/index.php?title=Module_pattern&action=edit&redlink=1" class="new" title="Module pattern (الصفحة غير موجودة)">Module</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%A7%D9%84%D9%88%D9%83%D9%8A%D9%84" title="نمط الوكيل">نمط الوكيل</a></li>
<li><a href="/w/index.php?title=Twin_pattern&action=edit&redlink=1" class="new" title="Twin pattern (الصفحة غير موجودة)">Twin</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">سلوكي (Behavioral)</th><td class="navbox-list navbox-odd hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/w/index.php?title=Blackboard_(design_pattern)&action=edit&redlink=1" class="new" title="Blackboard (design pattern) (الصفحة غير موجودة)">Blackboard</a></li>
<li><a href="/w/index.php?title=Chain-of-responsibility_pattern&action=edit&redlink=1" class="new" title="Chain-of-responsibility pattern (الصفحة غير موجودة)">Chain of responsibility</a></li>
<li><a href="/w/index.php?title=Command_pattern&action=edit&redlink=1" class="new" title="Command pattern (الصفحة غير موجودة)">Command</a></li>
<li><a href="/w/index.php?title=Interpreter_pattern&action=edit&redlink=1" class="new" title="Interpreter pattern (الصفحة غير موجودة)">Interpreter</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%A7%D9%84%D9%85%D9%83%D8%B1%D8%B1" title="نمط المكرر">نمط المكرر</a></li>
<li><a href="/w/index.php?title=Mediator_pattern&action=edit&redlink=1" class="new" title="Mediator pattern (الصفحة غير موجودة)">Mediator</a></li>
<li><a href="/w/index.php?title=Memento_pattern&action=edit&redlink=1" class="new" title="Memento pattern (الصفحة غير موجودة)">Memento</a></li>
<li><a href="/w/index.php?title=Null_object_pattern&action=edit&redlink=1" class="new" title="Null object pattern (الصفحة غير موجودة)">Null object</a></li>
<li><a href="/wiki/%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8_(%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%AA%D8%B5%D9%85%D9%8A%D9%85)" title="المراقب (نموذج تصميم)">المراقب (نموذج تصميم)</a></li>
<li><a href="/w/index.php?title=Servant_(design_pattern)&action=edit&redlink=1" class="new" title="Servant (design pattern) (الصفحة غير موجودة)">Servant</a></li>
<li><a href="/w/index.php?title=Specification_pattern&action=edit&redlink=1" class="new" title="Specification pattern (الصفحة غير موجودة)">Specification</a></li>
<li><a href="/w/index.php?title=State_pattern&action=edit&redlink=1" class="new" title="State pattern (الصفحة غير موجودة)">State</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%A5%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A9" title="نموذج الإستراتيجية">نموذج الإستراتيجية</a></li>
<li><a href="/w/index.php?title=Template_method_pattern&action=edit&redlink=1" class="new" title="Template method pattern (الصفحة غير موجودة)">Template method</a></li>
<li><a href="/w/index.php?title=Visitor_pattern&action=edit&redlink=1" class="new" title="Visitor pattern (الصفحة غير موجودة)">Visitor</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">وظيفي (Functional)</th><td class="navbox-list navbox-even hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/wiki/%D9%85%D9%88%D9%86%D9%88%D9%8A%D8%AF" title="مونويد">مونويد</a></li>
<li><a href="/w/index.php?title=Functor_(functional_programming)&action=edit&redlink=1" class="new" title="Functor (functional programming) (الصفحة غير موجودة)">Functor</a></li>
<li><a href="/w/index.php?title=Applicative_functor&action=edit&redlink=1" class="new" title="Applicative functor (الصفحة غير موجودة)">Applicative</a></li>
<li><a href="/w/index.php?title=Monad_(functional_programming)&action=edit&redlink=1" class="new" title="Monad (functional programming) (الصفحة غير موجودة)">Monad</a></li>
<li><a href="/w/index.php?title=Monad_(functional_programming)&action=edit&redlink=1" class="new" title="Monad (functional programming) (الصفحة غير موجودة)">Comonad</a></li>
<li><a href="/w/index.php?title=Monad_(functional_programming)&action=edit&redlink=1" class="new" title="Monad (functional programming) (الصفحة غير موجودة)">Free monad</a></li>
<li><a href="/w/index.php?title=Higher-order_function&action=edit&redlink=1" class="new" title="Higher-order function (الصفحة غير موجودة)">HOF</a></li>
<li><a href="/w/index.php?title=Currying&action=edit&redlink=1" class="new" title="Currying (الصفحة غير موجودة)">Currying</a></li>
<li><a href="/w/index.php?title=Function_composition_(computer_science)&action=edit&redlink=1" class="new" title="Function composition (computer science) (الصفحة غير موجودة)">Function composition</a></li>
<li><a href="/w/index.php?title=Closure_(computer_programming)&action=edit&redlink=1" class="new" title="Closure (computer programming) (الصفحة غير موجودة)">Closure</a></li>
<li><a href="/wiki/%D9%85%D9%88%D9%84%D8%AF_(%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="مولد (برمجة)">المولد</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">متزامن (Concurrency)</th><td class="navbox-list navbox-odd hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/w/index.php?title=Active_object&action=edit&redlink=1" class="new" title="Active object (الصفحة غير موجودة)">Active object</a></li>
<li><a href="/w/index.php?title=Actor_model&action=edit&redlink=1" class="new" title="Actor model (الصفحة غير موجودة)">Actor</a></li>
<li><a href="/w/index.php?title=Balking_pattern&action=edit&redlink=1" class="new" title="Balking pattern (الصفحة غير موجودة)">Balking</a></li>
<li><a href="/wiki/%D8%AD%D8%A7%D8%AC%D8%B2_(%D8%AD%D9%88%D8%B3%D8%A8%D8%A9)" title="حاجز (حوسبة)">حاجز (حوسبة)</a></li>
<li><a href="/w/index.php?title=Binding_properties_pattern&action=edit&redlink=1" class="new" title="Binding properties pattern (الصفحة غير موجودة)">Binding properties</a></li>
<li><a href="/w/index.php?title=Coroutine&action=edit&redlink=1" class="new" title="Coroutine (الصفحة غير موجودة)">Coroutine</a></li>
<li><a href="/w/index.php?title=Compute_kernel&action=edit&redlink=1" class="new" title="Compute kernel (الصفحة غير موجودة)">Compute kernel</a></li>
<li><a href="/w/index.php?title=Double-checked_locking&action=edit&redlink=1" class="new" title="Double-checked locking (الصفحة غير موجودة)">Double-checked locking</a></li>
<li><a href="/w/index.php?title=Asynchronous_method_invocation&action=edit&redlink=1" class="new" title="Asynchronous method invocation (الصفحة غير موجودة)">Event-based asynchronous</a></li>
<li><a href="/wiki/%D9%84%D9%8A%D9%81_(%D8%AD%D9%88%D8%B3%D8%A8%D8%A9)" title="ليف (حوسبة)">ليف</a></li>
<li><a href="/w/index.php?title=Futex&action=edit&redlink=1" class="new" title="Futex (الصفحة غير موجودة)">Futex</a></li>
<li><a href="/w/index.php?title=Futures_and_promises&action=edit&redlink=1" class="new" title="Futures and promises (الصفحة غير موجودة)">Futures and promises</a></li>
<li><a href="/w/index.php?title=Guarded_suspension&action=edit&redlink=1" class="new" title="Guarded suspension (الصفحة غير موجودة)">Guarded suspension</a></li>
<li><a href="/w/index.php?title=Immutable_object&action=edit&redlink=1" class="new" title="Immutable object (الصفحة غير موجودة)">Immutable object</a></li>
<li><a href="/w/index.php?title=Join-pattern&action=edit&redlink=1" class="new" title="Join-pattern (الصفحة غير موجودة)">Join</a></li>
<li><a href="/wiki/%D9%82%D9%81%D9%84_(%D8%AD%D9%88%D8%B3%D8%A8%D8%A9)" title="قفل (حوسبة)">Lock</a></li>
<li><a href="/wiki/%D8%B5%D9%8A%D8%BA%D8%A9_%D8%A7%D9%84%D8%AA%D8%B1%D8%A7%D8%B3%D9%84" title="صيغة التراسل">صيغة التراسل</a></li>
<li><a href="/w/index.php?title=Monitor_(synchronization)&action=edit&redlink=1" class="new" title="Monitor (synchronization) (الصفحة غير موجودة)">Monitor</a></li>
<li><a href="/w/index.php?title=Nuclear_computation&action=edit&redlink=1" class="new" title="Nuclear computation (الصفحة غير موجودة)">Nuclear</a></li>
<li><a href="/w/index.php?title=Proactor_pattern&action=edit&redlink=1" class="new" title="Proactor pattern (الصفحة غير موجودة)">Proactor</a></li>
<li><a href="/w/index.php?title=Reactor_pattern&action=edit&redlink=1" class="new" title="Reactor pattern (الصفحة غير موجودة)">Reactor</a></li>
<li><a href="/w/index.php?title=Readers%E2%80%93writer_lock&action=edit&redlink=1" class="new" title="Readers–writer lock (الصفحة غير موجودة)">Read write lock</a></li>
<li><a href="/wiki/%D8%AC%D8%AF%D9%88%D9%84%D8%A9_(%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="جدولة (حاسوب)">Scheduler</a></li>
<li><a href="/w/index.php?title=Software_transactional_memory&action=edit&redlink=1" class="new" title="Software transactional memory (الصفحة غير موجودة)">STM</a></li>
<li><a href="/wiki/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9_%D8%A7%D9%84%D8%AE%D9%8A%D9%88%D8%B7_(%D8%A3%D9%86%D9%85%D8%A7%D8%B7_%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA)" title="تجميع الخيوط (أنماط تصميم البرمجيات)">Thread pool</a></li>
<li><a href="/w/index.php?title=Thread-local_storage&action=edit&redlink=1" class="new" title="Thread-local storage (الصفحة غير موجودة)">Thread-local storage</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">معماري (Architectural)</th><td class="navbox-list navbox-even hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li>* <a href="/w/index.php?title=Action%E2%80%93domain%E2%80%93responder&action=edit&redlink=1" class="new" title="Action–domain–responder (الصفحة غير موجودة)">ADR</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%A7%D9%84%D8%AA%D8%B3%D8%AC%D9%8A%D9%84_%D8%A7%D9%84%D9%86%D8%B4%D8%B7" title="نمط التسجيل النشط">نمط التسجيل النشط</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D8%A7%D9%84%D9%88%D8%B3%D9%8A%D8%B7" title="نمط الوسيط">نمط الوسيط</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85_%D9%88%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84" title="نموذج الخادم والعميل">نموذج الخادم والعميل</a></li>
<li><a href="/wiki/%D9%87%D9%86%D8%AF%D8%B3%D8%A9_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA_%D8%A8%D8%A7%D9%84%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA" title="هندسة البرمجيات بالمكونات">هندسة البرمجيات بالمكونات</a></li>
<li><a href="/w/index.php?title=Data_access_object&action=edit&redlink=1" class="new" title="Data access object (الصفحة غير موجودة)">DAO</a></li>
<li><a href="/wiki/%D9%83%D8%A7%D8%A6%D9%86_%D9%86%D9%82%D9%84_%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA" title="كائن نقل البيانات">كائن نقل البيانات</a></li>
<li><a href="/wiki/%D8%AA%D8%B5%D9%85%D9%8A%D9%85_%D9%85%D9%82%D8%A7%D8%AF_%D8%A8%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82" title="تصميم مقاد بالنطاق">تصميم موجه بالمجال</a></li>
<li><a href="/w/index.php?title=Entity-control-boundary&action=edit&redlink=1" class="new" title="Entity-control-boundary (الصفحة غير موجودة)">ECB</a></li>
<li><a href="/w/index.php?title=Entity%E2%80%93component%E2%80%93system&action=edit&redlink=1" class="new" title="Entity–component–system (الصفحة غير موجودة)">ECS</a></li>
<li><a href="/w/index.php?title=Event-driven_architecture&action=edit&redlink=1" class="new" title="Event-driven architecture (الصفحة غير موجودة)">EDA</a></li>
<li><a href="/w/index.php?title=Front_controller&action=edit&redlink=1" class="new" title="Front controller (الصفحة غير موجودة)">Front controller</a></li>
<li><a href="/w/index.php?title=Identity_map_pattern&action=edit&redlink=1" class="new" title="Identity map pattern (الصفحة غير موجودة)">Identity map</a></li>
<li><a href="/w/index.php?title=Interceptor_pattern&action=edit&redlink=1" class="new" title="Interceptor pattern (الصفحة غير موجودة)">Interceptor</a></li>
<li><a href="/w/index.php?title=Implicit_invocation&action=edit&redlink=1" class="new" title="Implicit invocation (الصفحة غير موجودة)">Implicit invocation</a></li>
<li><a class="mw-selflink selflink">عكس التحكم</a></li>
<li><a href="/w/index.php?title=JSP_model_2_architecture&action=edit&redlink=1" class="new" title="JSP model 2 architecture (الصفحة غير موجودة)">Model 2</a></li>
<li><a href="/w/index.php?title=Message-oriented_middleware&action=edit&redlink=1" class="new" title="Message-oriented middleware (الصفحة غير موجودة)">MOM</a></li>
<li><a href="/w/index.php?title=Microservices&action=edit&redlink=1" class="new" title="Microservices (الصفحة غير موجودة)">Microservices</a></li>
<li><a href="/w/index.php?title=Model%E2%80%93view%E2%80%93adapter&action=edit&redlink=1" class="new" title="Model–view–adapter (الصفحة غير موجودة)">MVA</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D9%88%D8%B9%D8%B1%D8%B6_%D9%88%D9%85%D8%AA%D8%AD%D9%83%D9%85" title="نمط وعرض ومتحكم">نمط وعرض ومتحكم</a></li>
<li><a href="/w/index.php?title=Model%E2%80%93view%E2%80%93presenter&action=edit&redlink=1" class="new" title="Model–view–presenter (الصفحة غير موجودة)">MVP</a></li>
<li><a href="/w/index.php?title=Model%E2%80%93view%E2%80%93viewmodel&action=edit&redlink=1" class="new" title="Model–view–viewmodel (الصفحة غير موجودة)">MVVM</a></li>
<li><a href="/w/index.php?title=Monolithic_application&action=edit&redlink=1" class="new" title="Monolithic application (الصفحة غير موجودة)">Monolithic</a></li>
<li><a href="/wiki/%D8%B9%D9%85%D8%A7%D8%B1%D8%A9_%D9%85%D8%AA%D8%B9%D8%AF%D8%AF%D8%A9_%D8%A7%D9%84%D8%B7%D8%A8%D9%82%D8%A7%D8%AA" title="عمارة متعددة الطبقات">عمارة متعددة الطبقات</a></li>
<li><a href="/w/index.php?title=Naked_objects&action=edit&redlink=1" class="new" title="Naked objects (الصفحة غير موجودة)">Naked objects</a></li>
<li><a href="/w/index.php?title=Object_request_broker&action=edit&redlink=1" class="new" title="Object request broker (الصفحة غير موجودة)">ORB</a></li>
<li><a href="/wiki/%D9%86%D8%AF_%D9%84%D9%86%D8%AF" title="ند لند">ند لند</a></li>
<li><a href="/w/index.php?title=Publish%E2%80%93subscribe_pattern&action=edit&redlink=1" class="new" title="Publish–subscribe pattern (الصفحة غير موجودة)">Publish–subscribe</a></li>
<li><a href="/w/index.php?title=Presentation%E2%80%93abstraction%E2%80%93control&action=edit&redlink=1" class="new" title="Presentation–abstraction–control (الصفحة غير موجودة)">PAC</a></li>
<li><a href="/wiki/%D8%B1%D8%B3%D8%AA_(%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA)" title="رست (إنترنت)">رست</a></li>
<li><a href="/wiki/%D8%A8%D9%86%D9%8A%D8%A9_%D8%AE%D8%AF%D9%85%D9%8A%D8%A9" title="بنية خدمية">بنية خدمية</a></li>
<li><a href="/wiki/%D9%86%D9%85%D8%B7_%D9%85%D8%AD%D8%AF%D8%AF_%D9%85%D9%88%D9%82%D8%B9_%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A9" title="نمط محدد موقع الخدمة">نمط محدد موقع الخدمة</a></li>
<li><a href="/w/index.php?title=Shared-nothing_architecture&action=edit&redlink=1" class="new" title="Shared-nothing architecture (الصفحة غير موجودة)">SN</a></li>
<li><a href="/w/index.php?title=Space-based_architecture&action=edit&redlink=1" class="new" title="Space-based architecture (الصفحة غير موجودة)">SBA</a></li>
<li><a href="/w/index.php?title=Specification_pattern&action=edit&redlink=1" class="new" title="Specification pattern (الصفحة غير موجودة)">Specification</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">توزيع سحابي (Cloud Distributed)</th><td class="navbox-list navbox-odd hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/w/index.php?title=Ambassador_pattern&action=edit&redlink=1" class="new" title="Ambassador pattern (الصفحة غير موجودة)">Ambassador</a></li>
<li><a href="/w/index.php?title=Anti-Corruption_Layer_pattern&action=edit&redlink=1" class="new" title="Anti-Corruption Layer pattern (الصفحة غير موجودة)">Anti-Corruption Layer</a></li>
<li><a href="/w/index.php?title=Bulkhead_pattern&action=edit&redlink=1" class="new" title="Bulkhead pattern (الصفحة غير موجودة)">Bulkhead</a></li>
<li><a href="/w/index.php?title=Cache-Aside_pattern&action=edit&redlink=1" class="new" title="Cache-Aside pattern (الصفحة غير موجودة)">Cache-Aside</a></li>
<li><a href="/w/index.php?title=Circuit_breaker_design_pattern&action=edit&redlink=1" class="new" title="Circuit breaker design pattern (الصفحة غير موجودة)">Circuit Breaker</a></li>
<li><a href="/w/index.php?title=Command%E2%80%93query_separation&action=edit&redlink=1" class="new" title="Command–query separation (الصفحة غير موجودة)">CQRS</a></li>
<li><a href="/w/index.php?title=Compensating_transaction&action=edit&redlink=1" class="new" title="Compensating transaction (الصفحة غير موجودة)">Compensating Transaction</a></li>
<li><a href="/w/index.php?title=Competing_Consumers_pattern&action=edit&redlink=1" class="new" title="Competing Consumers pattern (الصفحة غير موجودة)">Competing Consumers</a></li>
<li><a href="/w/index.php?title=Compute_Resource_Consolidation_pattern&action=edit&redlink=1" class="new" title="Compute Resource Consolidation pattern (الصفحة غير موجودة)">Compute Resource Consolidation</a></li>
<li><a href="/w/index.php?title=Event_Sourcing_pattern&action=edit&redlink=1" class="new" title="Event Sourcing pattern (الصفحة غير موجودة)">Event Sourcing</a></li>
<li><a href="/w/index.php?title=External_Configuration_Store_pattern&action=edit&redlink=1" class="new" title="External Configuration Store pattern (الصفحة غير موجودة)">External Configuration Store</a></li>
<li><a href="/w/index.php?title=Federated_Identity_pattern&action=edit&redlink=1" class="new" title="Federated Identity pattern (الصفحة غير موجودة)">Federated Identity</a></li>
<li><a href="/w/index.php?title=Gatekeeper_pattern&action=edit&redlink=1" class="new" title="Gatekeeper pattern (الصفحة غير موجودة)">Gatekeeper</a></li>
<li><a href="/wiki/%D9%81%D9%87%D8%B1%D8%B3_%D9%82%D8%A7%D8%B9%D8%AF%D8%A9_%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA" title="فهرس قاعدة بيانات">فهرس قاعدة بيانات</a></li>
<li><a href="/w/index.php?title=Leader_election&action=edit&redlink=1" class="new" title="Leader election (الصفحة غير موجودة)">Leader Election</a></li>
<li><a href="/wiki/%D9%86%D9%85%D9%88%D8%B0%D8%AC_%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9_%D9%88%D8%A7%D9%84%D8%AA%D8%AC%D9%85%D9%8A%D8%B9" title="نموذج الهيكلة والتجميع">نموذج الهيكلة والتجميع</a></li>
<li><a href="/w/index.php?title=Materialized_view&action=edit&redlink=1" class="new" title="Materialized view (الصفحة غير موجودة)">Materialized View</a></li>
<li><a href="/w/index.php?title=Pipeline_(software)&action=edit&redlink=1" class="new" title="Pipeline (software) (الصفحة غير موجودة)">Pipes</a></li>
<li><a href="/w/index.php?title=Filter_(software)&action=edit&redlink=1" class="new" title="Filter (software) (الصفحة غير موجودة)">Filters</a></li>
<li><a href="/w/index.php?title=Priority_Queue_pattern&action=edit&redlink=1" class="new" title="Priority Queue pattern (الصفحة غير موجودة)">Priority Queue</a></li>
<li><a href="/w/index.php?title=Publish%E2%80%93subscribe_pattern&action=edit&redlink=1" class="new" title="Publish–subscribe pattern (الصفحة غير موجودة)">Publisher-Subscriber</a></li>
<li><a href="/w/index.php?title=Queue-Based_Load_Leveling_pattern&action=edit&redlink=1" class="new" title="Queue-Based Load Leveling pattern (الصفحة غير موجودة)">Queue-Based Load Leveling</a></li>
<li><a href="/w/index.php?title=Retry_pattern&action=edit&redlink=1" class="new" title="Retry pattern (الصفحة غير موجودة)">Retry</a></li>
<li><a href="/w/index.php?title=Scheduler_Agent_Supervisor_pattern&action=edit&redlink=1" class="new" title="Scheduler Agent Supervisor pattern (الصفحة غير موجودة)">Scheduler Agent Supervisor</a></li>
<li><a href="/w/index.php?title=Shard_(database_architecture)&action=edit&redlink=1" class="new" title="Shard (database architecture) (الصفحة غير موجودة)">Sharding</a></li>
<li><a href="/w/index.php?title=Sidecar_pattern&action=edit&redlink=1" class="new" title="Sidecar pattern (الصفحة غير موجودة)">Sidecar</a></li>
<li><a href="/w/index.php?title=Strangler_pattern&action=edit&redlink=1" class="new" title="Strangler pattern (الصفحة غير موجودة)">Strangler</a></li>
<li><a href="/w/index.php?title=Throttling_process_(computing)&action=edit&redlink=1" class="new" title="Throttling process (computing) (الصفحة غير موجودة)">Throttling</a></li>
<li><a href="/w/index.php?title=Valet_Key_pattern&action=edit&redlink=1" class="new" title="Valet Key pattern (الصفحة غير موجودة)">Valet Key</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">أخرى</th><td class="navbox-list navbox-even hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/w/index.php?title=Business_delegate_pattern&action=edit&redlink=1" class="new" title="Business delegate pattern (الصفحة غير موجودة)">Business delegate</a></li>
<li><a href="/w/index.php?title=Composite_entity_pattern&action=edit&redlink=1" class="new" title="Composite entity pattern (الصفحة غير موجودة)">Composite entity</a></li>
<li><a href="/w/index.php?title=Intercepting_filter_pattern&action=edit&redlink=1" class="new" title="Intercepting filter pattern (الصفحة غير موجودة)">Intercepting filter</a></li>
<li><a href="/w/index.php?title=Lazy_loading&action=edit&redlink=1" class="new" title="Lazy loading (الصفحة غير موجودة)">Lazy loading</a></li>
<li><a href="/w/index.php?title=Mangler_pattern&action=edit&redlink=1" class="new" title="Mangler pattern (الصفحة غير موجودة)">Mangler</a></li>
<li><a href="/wiki/%D8%BA%D8%B1%D8%B6_%D9%85%D9%82%D9%84%D8%AF" title="غرض مقلد">غرض مقلد</a></li>
<li><a href="/w/index.php?title=Type_Tunnel_pattern&action=edit&redlink=1" class="new" title="Type Tunnel pattern (الصفحة غير موجودة)">Type tunnel</a></li>
<li><a href="/w/index.php?title=Method_chaining&action=edit&redlink=1" class="new" title="Method chaining (الصفحة غير موجودة)">Method chaining</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">كتب</th><td class="navbox-list navbox-odd hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><i><a href="/wiki/%D9%86%D9%85%D8%A7%D8%B0%D8%AC_%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85_(%D9%87%D9%86%D8%AF%D8%B3%D8%A9_%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA)" title="نماذج التصميم (هندسة البرمجيات)">خطط التصميم</a></i></li>
<li><i><a href="/w/index.php?title=Enterprise_Integration_Patterns&action=edit&redlink=1" class="new" title="Enterprise Integration Patterns (الصفحة غير موجودة)">Enterprise Integration Patterns</a></i></li>
<li><i><a href="/w/index.php?title=Code_Complete&action=edit&redlink=1" class="new" title="Code Complete (الصفحة غير موجودة)">Code Complete</a></i></li>
<li><i><a href="/w/index.php?title=Pattern-Oriented_Software_Architecture&action=edit&redlink=1" class="new" title="Pattern-Oriented Software Architecture (الصفحة غير موجودة)">POSA</a></i></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">أشخاص</th><td class="navbox-list navbox-even hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/wiki/%D9%83%D8%B1%D9%8A%D8%B3%D8%AA%D9%88%D9%81%D8%B1_%D8%A7%D9%84%D9%83%D8%B3%D9%86%D8%AF%D8%B1" title="كريستوفر الكسندر">كريستوفر الكسندر</a></li>
<li><a href="/wiki/%D8%A5%D8%B1%D9%8A%D9%83_%D8%AC%D8%A7%D9%85%D8%A7" title="إريك جاما">إريك جاما</a></li>
<li><a href="/wiki/%D8%B1%D8%A7%D9%84%D9%81_%D8%AC%D9%88%D9%86%D8%B3%D9%86" title="رالف جونسن">رالف جونسن</a></li>
<li><a href="/w/index.php?title=John_Vlissides&action=edit&redlink=1" class="new" title="John Vlissides (الصفحة غير موجودة)">John Vlissides</a></li>
<li><a href="/w/index.php?title=Grady_Booch&action=edit&redlink=1" class="new" title="Grady Booch (الصفحة غير موجودة)">Grady Booch</a></li>
<li><a href="/wiki/%D9%83%D9%8A%D9%86%D8%AA_%D8%A8%D9%8A%D9%83" title="كينت بيك">كينت بيك</a></li>
<li><a href="/wiki/%D9%88%D9%88%D8%B1%D8%AF_%D9%83%D8%A7%D9%86%D9%8A%D9%86%D8%BA%D9%87%D8%A7%D9%85" title="وورد كانينغهام">وورد كانينغهام</a></li>
<li><a href="/wiki/%D9%85%D8%A7%D8%B1%D8%AA%D9%86_%D9%81%D8%A7%D9%88%D9%84%D8%B1" title="مارتن فاولر">مارتن فاولر</a></li>
<li><a href="/wiki/%D8%B1%D9%88%D8%A8%D8%B1%D8%AA_%D8%B3%D9%8A%D8%B3%D9%8A%D9%84_%D9%85%D8%A7%D8%B1%D8%AA%D9%86" title="روبرت سيسيل مارتن">روبرت سيسيل مارتن</a></li>
<li><a href="/w/index.php?title=Jim_Coplien&action=edit&redlink=1" class="new" title="Jim Coplien (الصفحة غير موجودة)">Jim Coplien</a></li>
<li><a href="/wiki/%D8%AF%D9%88%D8%BA%D9%84%D8%A7%D8%B3_%D8%B3._%D8%B4%D9%85%D9%8A%D8%AA" title="دوغلاس س. شميت">دوغلاس س. شميت</a></li>
<li><a href="/w/index.php?title=Linda_Rising&action=edit&redlink=1" class="new" title="Linda Rising (الصفحة غير موجودة)">Linda Rising</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">مجتمعات (Communities)</th><td class="navbox-list navbox-odd hlist" style="text-align:right;border-right-width:2px;border-right-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><a href="/w/index.php?title=The_Hillside_Group&action=edit&redlink=1" class="new" title="The Hillside Group (الصفحة غير موجودة)">The Hillside Group</a></li>
<li><a href="/w/index.php?title=Portland_Pattern_Repository&action=edit&redlink=1" class="new" title="Portland Pattern Repository (الصفحة غير موجودة)">The Portland Pattern Repository</a></li></ul>
</div></td></tr></tbody></table></div>
<ul class="bandeau-portail إعلام" id="bandeau-portail">
<li class="bandeau-portail-element"><span class="bandeau-portail-icone" style="margin-right:1em"><a href="/wiki/%D8%A8%D9%88%D8%A7%D8%A8%D8%A9:%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" title="بوابة:برمجة الحاسوب"><img alt="أيقونة بوابة" src="//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Octicons-terminal.svg/24px-Octicons-terminal.svg.png" decoding="async" width="24" height="28" class="noviewer" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Octicons-terminal.svg/37px-Octicons-terminal.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Octicons-terminal.svg/49px-Octicons-terminal.svg.png 2x" data-file-width="896" data-file-height="1024" /></a></span><span class="bandeau-portail-texte"><a href="/wiki/%D8%A8%D9%88%D8%A7%D8%A8%D8%A9:%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" title="بوابة:برمجة الحاسوب">بوابة برمجة الحاسوب</a></span></li>
<li class="bandeau-portail-element"><span class="bandeau-portail-icone" style="margin-right:1em"><a href="/wiki/%D8%A8%D9%88%D8%A7%D8%A8%D8%A9:%D8%B9%D9%84%D9%85_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" title="بوابة:علم الحاسوب"><img alt="أيقونة بوابة" src="//upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Desktop_computer_clipart_-_Yellow_theme.svg/32px-Desktop_computer_clipart_-_Yellow_theme.svg.png" decoding="async" width="32" height="23" class="noviewer" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Desktop_computer_clipart_-_Yellow_theme.svg/48px-Desktop_computer_clipart_-_Yellow_theme.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Desktop_computer_clipart_-_Yellow_theme.svg/64px-Desktop_computer_clipart_-_Yellow_theme.svg.png 2x" data-file-width="281" data-file-height="203" /></a></span><span class="bandeau-portail-texte"><a href="/wiki/%D8%A8%D9%88%D8%A7%D8%A8%D8%A9:%D8%B9%D9%84%D9%85_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8" title="بوابة:علم الحاسوب">بوابة علم الحاسوب</a></span></li></ul></li></ul></div>' |
ما إذا كان التعديل قد تم عمله من خلال عقدة خروج تور (tor_exit_node ) | false |
طابع زمن التغيير ليونكس (timestamp ) | 1648424139 |