معظم نماذج البرمجة التي نستخدمها اليوم تمت دراستها رياضياً لأول مرة في ثلاثينيات القرن العشرين باستخدام أفكار حساب التفاضل والتكامل لامدا وآلة تورينج ، وهي متغيرات لنموذج الحوسبة العالمي (هذه أنظمة رسمية يمكنها إجراء حسابات للأغراض العامة). أظهرت أطروحة الكنيسة-تورنج أن حساب التفاضل والتكامل لامدا وآلات تورينج متكافئة وظيفياً. وبالتحديد ، نتحدث عن حقيقة أن كل ما يمكن حسابه باستخدام آلة تورينج يمكن أيضًا حسابه باستخدام حساب التفاضل والتكامل لامدا ، والعكس بالعكس.

هناك اعتقاد خاطئ بأن آلات تورينج يمكنها حساب كل ما يمكن حسابه. هناك فئات من المشاكل (على سبيل المثال ،
مشكلة التوقف ) التي يمكن حسابها باستخدام آلات تورينج لبعض الحالات فقط. عندما يتم استخدام كلمة "محوسب" في هذا النص ، فهذا يعني "محسوبًا بواسطة آلة تورينج".
يوضح حساب التفاضل والتكامل لامدا نهج تطبيق الوظائف على الحسابات من أعلى إلى أسفل. تعد آلة شريط Turing طريقة حتمية (خطوة بخطوة) للحوسبة ، يتم تنفيذها على أساس من الأسفل إلى الأعلى.
ظهرت لغات برمجة منخفضة المستوى ، مثل رمز الآلة أو المجمع ، في أربعينيات القرن العشرين ، وبحلول نهاية الخمسينيات ، نشأت أول لغات شعبية عالية المستوى نفذت كل من النهج الوظيفية والضرورية. لذلك ، لا تزال لهجات لغة Lisp مستخدمة على نطاق واسع ، من بينها Clojure و Scheme و AutoLisp وما إلى ذلك. في الخمسينيات ، ظهرت لغات مثل FORTRAN و COBOL. إنها أمثلة على اللغات الحتمية عالية المستوى التي لا تزال حية. على الرغم من أنه يجب ملاحظة أن لغات عائلة C ، في معظم المناطق ، حلت محل كل من COBOL و FORTRAN.
تكمن جذور البرمجة الحتمية والوظيفية في الرياضيات الرسمية للحوسبة ، فقد ظهرت أمام أجهزة الكمبيوتر الرقمية. البرمجة الكينونية (OOP) ، جاءت لاحقًا ، نشأت في ثورة البرمجة الهيكلية ، التي حدثت في الستينيات والسبعينيات من القرن الماضي.
أول شيء عرفته تم استخدامه بواسطة إيفان ساذرلاند في تطبيقه المشؤوم Sketchpad ، الذي تم إنشاؤه بين عامي 1961 و 1962 ، والذي وصفه في
هذا العمل في عام 1963. كانت الأجسام عبارة عن أحرف رسومية معروضة على شاشة الذبذبات (ربما تكون هذه هي المرة الأولى في تاريخ استخدام شاشة الكمبيوتر الرسومية) التي تدعم الميراث من خلال المندوبين الديناميكيين ، والتي أطلق عليها إيفان ساذرلاند "الماجستير" في عمله. يمكن لأي كائن أن يصبح كائنًا رئيسيًا ، وتسمى مثيلات إضافية من الكائن "التكرارات". وقد جعل هذا نظام Sketchpad مالك أول لغات البرمجة الشهيرة التي طبقت الوراثة النموذجية.
كانت لغة البرمجة الأولى ، والمعروفة باسم "الكينونية" ، لغة سيمولا ، التي تم تطوير مواصفاتها عام 1965. مثل Sketchpad ، قدمت Silmula للعمل مع الكائنات ، ولكنها تضمنت أيضًا فئات ووراثة قائمة على الفئات وفئات فرعية وطرق افتراضية.
الطريقة الافتراضية هي طريقة تم تعريفها في فئة مصممة لإعادة تعريفها بواسطة الفئات الفرعية. تسمح الطرق الافتراضية للبرامج باستدعاء الأساليب التي قد لا تكون موجودة في الوقت الذي يتم فيه تجميع التعليمات البرمجية ، وذلك باستخدام الإرسال الديناميكي لتحديد الطريقة المحددة التي يجب استدعاؤها أثناء تنفيذ البرنامج. تحتوي جافا سكريبت على أنواع ديناميكية وتستخدم سلسلة تفويض لتحديد الطريقة التي يتم استدعاءها. ونتيجة لذلك ، لا تحتاج هذه اللغة إلى تقديم مفهوم الأساليب الافتراضية للمبرمجين. بمعنى آخر ، تستخدم جميع الطرق في JavaScript الإرسال في وقت التشغيل ؛ ونتيجة لذلك ، لا يلزم تعريف الطرق في JavaScript بأنها "افتراضية" لدعم هذه الميزة.رأي والد OOP حول OOP
"لقد ابتكرت مصطلح" كائني التوجه "، ويمكنني القول أنني لم أقصد لغة C ++." آلان كاي ، مؤتمر OOPSLA ، 1997.صاغ ألان كاي مصطلح "البرمجة الموجهة للكائنات" ، في إشارة إلى لغة البرمجة Smalltalk (1972). تم تطوير هذه اللغة من قبل Alan Kay و Dan Ingles وموظفين آخرين في مركز أبحاث Xerox PARC كجزء من مشروع جهاز Dynabook. كان Smalltalk أكثر توجهاً إلى الكائن من Simula. في Smalltalk ، كل شيء هو كائن ، بما في ذلك الفئات والأعداد الصحيحة والكتل (الإغلاق). لم يكن التطبيق الأولي للغة ، Smalltalk-72 ، لديه القدرة على الفئة الفرعية. ظهرت هذه الميزة في Smalltalk-76.
في حين دعم Smalltalk الفئات ، ونتيجة لذلك ، التصنيف الفرعي ، لم يضع Smalltalk هذه الأفكار في المقدمة. كانت لغة وظيفية أثرت فيها ليسب بقدر تأثير سيمولا. وفقًا لـ Alan Kay ، يعتبر التعامل مع الطبقات كآلية لإعادة استخدام التعليمات البرمجية خطأً. تولي صناعة البرمجة اهتمامًا كبيرًا لإنشاء الفئات الفرعية ، وتشتت الانتباه عن المزايا الحقيقية للبرمجة الموجهة للكائنات.
تشترك JavaScript و Smalltalk في الكثير من الأشياء. أود أن أقول أن JavaScript هو انتقام Smalltalk للعالم بسبب سوء فهم مفاهيم OOP. تدعم كلتا هاتين اللغتين الميزات التالية:
- كائنات
- وظائف وإغلاق من الدرجة الأولى.
- أنواع ديناميكية.
- الربط المتأخر (يمكن استبدال الوظائف والأساليب أثناء تنفيذ البرنامج).
- OOP بدون نظام الوراثة الطبقي.
"يؤسفني أنني توصلت إلى مصطلح" كائنات "لهذه الظاهرة منذ فترة طويلة ، لأن استخدامها يؤدي إلى حقيقة أن العديد من الناس يعطيون أهمية أساسية لفكرة ليست بنفس أهمية الفكرة الرئيسية. الفكرة الرئيسية هي المراسلة ". آلان كايفي
مراسلات بالبريد الإلكتروني عام 2003 ، أوضح ألان كاي ما كان يدور في خلده عندما سمى سمول توك "لغة موجهة للكائنات".
"بالنسبة لي ، OOP تعني فقط المراسلة والتخزين المحلي والحماية والاختباء والربط المتأخر جدًا." آلان كايوبعبارة أخرى ، تماشيا مع أفكار آلان كاي ، فإن أهم مكونات OOP هي التالية:
- المراسلة
- التغليف.
- ربط ديناميكي.
من المهم أن نلاحظ أن آلان كاي ، الرجل الذي اخترع مصطلح "OOP" وأدخله إلى الجماهير ، لم يعتبر أن الميراث وتعدد الأشكال هما أهم مكونات OOP.
جوهر OOP
يخدم مزيج المراسلة والتغليف عدة أغراض مهمة:
- تجنب الحالة المشتركة القابلة للتغيير لكائن عن طريق تغليف الحالة وعزل الكائنات الأخرى من التغييرات المحلية في حالته. الطريقة الوحيدة للتأثير على حالة كائن آخر هي أن تطلب منه (بدلاً من إصدار أمر) تغييره عن طريق إرسال رسالة إليه. تتم مراقبة تغييرات الحالة على المستوى الخلوي المحلي ، ولا تتوفر الحالة لأشياء أخرى.
- فصل الأشياء عن بعضها البعض. يتم إرفاق مرسل الرسالة بشكل فضفاض مع المستلم من خلال واجهة برمجة تطبيقات المراسلة.
- القدرة على التكيف ومقاومة التغييرات أثناء تنفيذ البرنامج من خلال الربط المتأخر. يوفر التكيف مع التغييرات أثناء تنفيذ البرنامج العديد من المزايا المهمة ، والتي اعتبرها آلان كاي مهمة جدًا لـ OOP.
مصادر الإلهام لألان كاي ، الذي عبر عن هذه الأفكار ، كانت معرفته بعلم الأحياء ، وما كان يعرفه عن ARPANET (هذه نسخة مبكرة من الإنترنت). وبالتحديد ، نتحدث عن الخلايا البيولوجية وعن أجهزة الكمبيوتر الفردية المتصلة بالشبكة. حتى ذلك الحين ، تخيل آلان كاي كيف تعمل البرامج على أجهزة كمبيوتر ضخمة وموزعة (الإنترنت) ، بينما تعمل أجهزة الكمبيوتر الفردية مثل الخلايا البيولوجية ، وتعمل بشكل مستقل مع حالتها المعزولة الخاصة بها وتبادل البيانات مع أجهزة الكمبيوتر الأخرى عن طريق إرسال الرسائل.
"أدركت أن استعارة خلية أو كمبيوتر سيساعد على التخلص من البيانات [...]." آلان كايقال "ألان كاي" بالطبع ، "ساعد في التخلص من البيانات" ، كان على دراية بالمشكلات التي تسببها الحالة المشتركة القابلة للتغيير ، والاتصال القوي الناجم عن مشاركة البيانات. اليوم ، يتم الاستماع إلى هذه المواضيع على نطاق واسع. ولكن في أواخر الستينيات ، كان مبرمجو ARPANET غير راضين عن الحاجة إلى اختيار تمثيل نموذج البيانات لبرامجهم قبل تطوير البرامج. أراد المطورون الابتعاد عن هذه الممارسة ، نظرًا لأنهم دفعوا أنفسهم إلى الإطار المحدد بواسطة عرض البيانات ، فمن الصعب تغيير شيء ما في المستقبل.
كانت المشكلة في طرق مختلفة لتقديم البيانات المطلوبة ، للوصول إليها ، رمز مختلف وبناء مختلف في لغات البرمجة المستخدمة في وقت ما. ستكون الكأس المقدسة هنا طريقة عالمية للوصول إلى البيانات وإدارتها. إذا كانت جميع البيانات ستبدو متشابهة بالنسبة للبرنامج ، فإن هذا سيحل العديد من مشاكل المطورين فيما يتعلق بتطوير البرامج وصيانتها.
حاول آلان كاي "التخلص" من الفكرة ، والتي بموجبها كانت البيانات والبرامج ، إلى حد ما ، كيانات مستقلة. لا تعتبر على هذا النحو في القائمة أو في Smalltalk. لا يوجد فصل بين ما يمكن عمله بالبيانات (بالقيم والمتغيرات وهياكل البيانات وما إلى ذلك) وبنى البرمجيات مثل الوظائف. المهام هي "مواطنين من الدرجة الأولى" ، ويسمح للبرامج بالتغيير أثناء تنفيذها. بعبارة أخرى ، ليس لدى Smalltalk علاقة خاصة ومميزة بالبيانات.
علاوة على ذلك ، اعتبر آلان كاي الأشياء كإنشاءات جبرية ، والتي أعطت ضمانات محددة يمكن إثباتها رياضيًا لسلوكها.
"سمحت لي خلفيتي الرياضية بفهم أن كل كائن يمكن أن يكون له العديد من النماذج الجبرية المرتبطة به ، وأنه يمكن أن تكون هناك مجموعات كاملة من النماذج المماثلة ، ويمكن أن تكون مفيدة جدًا جدًا." آلان كايثبت أن الأمر كذلك ، وشكل ذلك أساسًا للأشياء ، مثل الوعود والعدسات ، علاوة على ذلك ، تأثرت نظرية الفئات بكليهما.
الطبيعة الجبرية لكيفية رؤية آلان كاي للأشياء ستسمح للأشياء بتقديم التحقق الرسمي ، والسلوك الحتمي ، وتحسين القابلية للاختبار ، لأن النماذج الجبرية هي ، في جوهرها ، عمليات تمتثل لعدة قواعد في شكل معادلات.
في لغة المبرمجين ، "النماذج الجبرية" هي ملخصات تم إنشاؤها من وظائف (عمليات) مصحوبة بقواعد معينة ، تفرضها اختبارات الوحدة التي يجب أن تمر بها هذه الوظائف (البديهيات ، المعادلات).
لقد تم نسيان هذه الأفكار لعقود في معظم اللغات الموجهة للكائنات في عائلة C ، بما في ذلك C ++ و Java و C # ، وما إلى ذلك. لكن هذه الأفكار تبدأ البحث عن رحلة العودة ، في الإصدارات الحديثة من أكثر اللغات الموجهة للكائنات استخدامًا.
في هذه المناسبة ، يمكن لشخص ما أن يقول إن عالم البرمجة يعيد اكتشاف فوائد البرمجة الوظيفية ، ويقدم الحجج العقلانية في سياق اللغات الشيئية.
مثل جافا سكريبت و Smalltalk في وقت سابق ، أصبحت معظم اللغات الحديثة الموجهة للكائنات أكثر فأكثر "نموذج متعدد". لا يوجد سبب للاختيار بين البرمجة الوظيفية و OOP. عندما ننظر إلى الجوهر التاريخي لكل من هذه الأساليب ، فإنها لا تبدو متوافقة فقط ، ولكن أيضًا كأفكار تكميلية.
ما هو الأكثر أهمية في منظمة التحرير الفلسطينية ، وفقًا لأفكار آلان كاي؟
- التغليف.
- المراسلة
- الربط الديناميكي (قدرة البرامج على التطوير والتكيف مع التغييرات أثناء تنفيذها).
ما هو ضئيل في OOP؟
- فصول.
- الميراث الطبقي.
- علاقة خاصة بالكائنات أو الوظائف أو البيانات.
- كلمة رئيسية
new
. - تعدد الأشكال.
- الكتابة الساكنة.
- الموقف من الفصول بأنها "أنواع".
إذا كنت تعرف Java أو C # ، فقد تعتقد أن الكتابة الثابتة أو تعدد الأشكال هي أهم مكونات OOP ، لكن Alan Kay يفضل التعامل مع أنماط السلوك العالمية في الشكل الجبرية. هنا مثال مكتوب في هاسكل:
fmap :: (a -> b) -> fa -> fb
هذا هو توقيع ممول
map
العالمي ، الذي يعمل مع النوعين غير المحددين
a
و
b
، وتطبيق الوظيفة من
a
إلى
b
في سياق المعلق
a
أجل إنشاء fun fun
b
. "Functor" هي كلمة من المصطلحات الرياضية ، يتم تقليل معناها إلى "دعم عملية العرض". إذا كنت معتادًا على طريقة
[].map()
في جافا سكريبت ، فأنت تعرف بالفعل ما يعنيه هذا.
فيما يلي بعض الأمثلة على JavaScript:
// isEven = Number => Boolean const isEven = n => n % 2 === 0; const nums = [1, 2, 3, 4, 5, 6]; // map `a => b` `a` ( `this`) // `b` // `a` `Number`, `b` `Boolean` const results = nums.map(isEven); console.log(results); // [false, true, false, true, false, true]
تعد طريقة
.map()
عالمية ، بمعنى أن
a
و
b
يمكن أن يكونا من أي نوع ، وتتوافق هذه الطريقة مع موقف مشابه بدون مشاكل ، حيث أن المصفوفات عبارة عن هياكل بيانات تنفذ القوانين الجبرية للمزارعين. لا يهم أنواع
.map()
، حيث لا تحاول هذه الطريقة العمل مع القيم المقابلة مباشرةً. بدلاً من ذلك ، يستخدم دالة تتوقع قيم الأنواع المقابلة وتعيدها والتي تكون صحيحة من وجهة نظر التطبيق.
// matches = a => Boolean // `a` , const matches = control => input => input === control; const strings = ['foo', 'bar', 'baz']; const results = strings.map(matches('bar')); console.log(results); // [false, true, false]
يمكن أن يكون من الصعب التعبير عن علاقة الأنواع العالمية بشكل صحيح وبشكل كامل بلغات مثل TypeScript ، ولكن من السهل جدًا القيام بذلك في نظام نوع Hindley-Milner المستخدم في Haskell ، والذي يدعم الأنواع الأعلى (أنواع الأنواع).
تفرض معظم أنظمة الكتابة قيودًا شديدة القوة للسماح بالتعبير الحر للأفكار الديناميكية والوظيفية ، مثل تكوين الوظائف ، والتكوين الحر للكائنات ، وتوسيع الكائنات أثناء تنفيذ البرنامج ، واستخدام المجمعات ، والعدسات ، وما إلى ذلك. بكلمات أخرى؟ غالبًا ما تجعل الأنواع الثابتة من الصعب كتابة البرامج باستخدام طرق الإنشاء.
إذا كان نظام الكتابة الخاص بك يحتوي على قيود كثيرة جدًا (كما هو الحال في TypeScript أو Java) ، إذن ، لتحقيق نفس الأهداف ، يجب عليك كتابة رمز أكثر تعقيدًا من استخدام لغات ذات نهج أكثر حرية في الكتابة. هذا لا يعني أن استخدام أنواع ثابتة فكرة سيئة ، أو أن جميع تطبيقات الأنواع الثابتة لها نفس القيود. على سبيل المثال ، واجهت مشاكل أقل بكثير في العمل مع نظام نوع هاسكل.
إذا كنت من محبي الأنواع الثابتة ولا تعارض القيود ، أتمنى لك سبعة أقدام تحت العارضة. ولكن إذا وجدت أن بعض الأفكار التي تم التعبير عنها هنا يصعب تنفيذها نظرًا لأنه ليس من السهل كتابة الدالات التي تم الحصول عليها عن طريق إنشاء وظائف أخرى وهياكل جبرية مركبة ، فقم بإلقاء اللوم على نظام النوع وليس الفكرة. السائقون مثل وسائل الراحة التي توفرها لهم سيارات الدفع الرباعي بإطار ، لكن لا أحد يشكو من أنها لا تطير. للطيران ، أنت بحاجة إلى سيارة تتمتع بدرجة أكبر من الحرية.
إذا كانت القيود تجعل كودك أبسط - رائع! ولكن إذا كانت القيود تفرض عليك كتابة رمز أكثر تعقيدًا ، فربما يكون هناك خطأ في هذه القيود.
ما هو "الشيء"؟
اكتسبت كلمة "شيء" بمرور الوقت دلالات ثانوية للمعنى. ما نسميه "كائنات" في جافا سكريبت هي ببساطة أنواع بيانات مركبة ، دون أي تلميح لأي من البرمجة القائمة على الفصل ، أو أفكار تمرير رسالة ألان كاي.
في JavaScript ، يمكن أن تدعم هذه الكائنات ، غالبًا ، التغليف ، وتمرير الرسائل ، وفصل السلوك من خلال الأساليب ، وحتى تعدد الأشكال باستخدام الفئات الفرعية (وإن كان ذلك باستخدام سلسلة تفويض بدلاً من الإرسال المعتمد على النوع).
أراد آلان كاي التخلص من الفرق بين البرنامج وبياناته. تحقق جافا سكريبت ، إلى حد ما ، هذا الهدف من خلال وضع طرق الكائن في نفس مكان الخصائص التي تخزن البيانات. يمكن تعيين أي وظيفة ، على سبيل المثال ، أي وظيفة. يمكنك بناء سلوك الكائن ديناميكيًا وتغيير المحتوى الدلالي للكائن أثناء تنفيذ البرنامج.
الكائن هو مجرد بنية بيانات مركبة ، ولا يحتاج إلى أي شيء خاص ليتم اعتباره كائنًا. ومع ذلك ، فإن البرمجة باستخدام الكائنات لا تؤدي إلى حقيقة أن مثل هذا الكود يتبين أنه "موجه للكائنات" ، تمامًا كما أن استخدام الوظائف لا يجعل الكود "يعمل".
OOP لم يعد OOP حقيقي
نظرًا لأن مفهوم "الكائن" في لغات البرمجة الحديثة يعني أقل بكثير مما يعنيه آلان كاي ، فإنني أستخدم كلمة "مكون" بدلاً من كلمة "كائن" لوصف قواعد هذا OOP. العديد من الكائنات مملوكة ومدارة بشكل مباشر بواسطة كود JavaScript من طرف ثالث ، ولكن يجب أن تغلف المكونات حالتها الخاصة وتتحكم فيها.
هنا ما هو OOP الحقيقي:
- البرمجة باستخدام المكونات (يطلق عليها آلان كاي اسم "الأشياء").
- يجب تغليف حالة المكون.
- للتواصل بين الكيانات ، يتم استخدام الرسائل.
- يمكن إضافة المكونات وتعديلها واستبدالها في وقت التشغيل.
يمكن تعريف معظم سلوكيات الكائنات بطريقة عامة باستخدام هياكل البيانات الجبرية. ليست هناك حاجة للميراث. يمكن للمكونات إعادة استخدام السلوكيات من الوظائف العامة واستيراد الوحدات النمطية ، دون الحاجة إلى جعل بياناتها عامة.
لا يعني التعامل مع الكائنات في JavaScript أو استخدام الوراثة القائمة على الفئة أن شخصًا ما متورط في برمجة OOP. لكن استخدام المكونات بهذه الطرق - الوسائل. ولكن من الصعب جدًا التخلص من المفاهيم الراسخة للمصطلحات ، لذلك ربما يجب أن نترك مصطلح "OOP" ونطلق على ما يسمى "المكونات" المذكورة أعلاه باسم "البرمجة الموجهة للرسائل (MOP)"؟ سنستخدم مصطلح "MOP" أدناه للتحدث عن البرمجة الموجهة للرسائل.
بالصدفة ، تُترجم الكلمة الإنجليزية "mop" إلى "mop" ، وكما تعلم ، يتم استخدامها لاستعادة النظام.
كيف يبدو MOP الجيد؟
تحتوي معظم البرامج الحديثة على واجهة مستخدم (واجهة المستخدم ، واجهة المستخدم) مسؤولة عن التفاعل مع المستخدم ، وبعض التعليمات البرمجية التي تدير حالة التطبيق (بيانات المستخدم) ، والرمز الذي يعمل مع النظام أو المسؤول عن تبادل البيانات مع الشبكة.
لدعم تشغيل كل من هذه الأنظمة ، قد تكون هناك حاجة لعمليات طويلة الأمد ، مثل مستمعي الأحداث. هنا ستحتاج إلى حالة التطبيق - لتخزين شيء مثل المعلومات حول اتصالات الشبكة ، وحول الحالة مع عناصر التحكم في الواجهة والتطبيق نفسه.
يعني MOP الجيد أنه بدلاً من أن يكون لجميع هذه الأنظمة إمكانية الوصول إلى حالة بعضها البعض والقدرة على التحكم فيها بشكل مباشر ، فإنها تتفاعل مع بعضها البعض من خلال الرسائل. عندما ينقر المستخدم على زر "حفظ" ، يمكن إرسال رسالة
"SAVE"
. يمكن لمكون تطبيق إدارة الحالة تفسير هذه الرسالة وإعادة توجيهها إلى المعالج المسؤول عن التحديث من الحالة (مثل وظيفة المخفض الخالص). ربما بعد تحديث الحالة ، يرسل المكون المسؤول عن إدارة الحالة الرسالة
"STATE_UPDATED"
مكون واجهة المستخدم ، والذي بدوره يفسر الحالة ، ويقرر أي أجزاء من الواجهة تحتاج إلى تحديث ، ويمرر الحالة المحدثة إلى المكونات الفرعية المسؤولة عن العمل مع عناصر واجهة محددة.
وفي الوقت نفسه ، يمكن للمكون المسؤول عن اتصالات الشبكة مراقبة اتصال المستخدم بكمبيوتر آخر على الشبكة ، والاستماع إلى الرسائل ، وإرسال طريقة عرض محدثة للحالة لحفظها على الجهاز البعيد. مثل هذا المكون مسؤول عن العمل مع آليات الشبكة ، ويعرف ما إذا كان الاتصال يعمل أم لا ، وما إلى ذلك.
يجب ألا تعرف أنظمة التطبيقات المماثلة تفاصيل أجزائها الأخرى. يجب أن يهتموا فقط بحل مشاكلهم الخاصة. يمكن تفكيك وتجميع مكونات النظام كمنشئ. ينفذون واجهات موحدة ، مما يعني أنه يمكنهم التفاعل مع بعضهم البعض. طالما تم استيفاء المتطلبات المعروفة جيدًا لواجهة المكونات ، يمكن استبدال هذه المكونات بأخرى ، مع نفس الواجهات ، ولكن القيام بنفس الشيء بشكل مختلف ، أو القيام ، أو تلقي الرسائل نفسها ، شيء مختلف تمامًا. يمكنك تغيير مكون إلى آخر حتى أثناء تنفيذ البرنامج - وهذا لن يكسر عمله.
لا يجب أن تكون مكونات نظام البرامج على نفس جهاز الكمبيوتر. يمكن أن يكون النظام لامركزي. يمكن لتخزين الشبكة وضع البيانات في نظام تخزين لامركزي مثل
IPFS ، ونتيجة لذلك ، يكون المستخدم مستقلاً عن صحة جهاز معين ، مما يضمن سلامة بياناته. مع هذا النهج ، يتم تخزين البيانات بشكل موثوق وحمايتها من الدخلاء.
تعرضت منظمة التحرير الفلسطينية ، جزئياً ، لتأثير أفكار ARPANET ، وكان أحد أهداف هذا المشروع إنشاء شبكة لامركزية من شأنها مقاومة هجمات مثل الضربة النووية.
يمكن أن يتميز نظام MOP الجيد بمستوى مماثل من الاستقرار باستخدام المكونات التي تدعم التبديل السريع أثناء تشغيل التطبيق. سيكون قادرًا على الاستمرار في العمل إذا كان المستخدم يعمل معه من هاتف محمول ويكون خارج نطاق تغطية الشبكة نظرًا لحقيقة دخوله النفق. إذا قطع إعصار التيار الكهربائي لأحد مراكز البيانات التي توجد فيها خوادمه ، فسيستمر أيضًا في العمل.
حان الوقت لعالم البرمجيات لتحرير نفسه من تجربة الميراث الفاشلة القائمة على الطبقة وتبني المبادئ الرياضية والعلمية التي كانت في طليعة OOP.
حان الوقت لنا كمطورين لإنشاء برامج أكثر مرونة واستقرارًا وجمالًا باستخدام مزيج متناغم من MOP والبرمجة الوظيفية.
بالمناسبة ، الاسم المختصر "MOP" قيد الاستخدام بالفعل ، يصف "مراقبة البرمجة الموجهة" ، ولكن هذا المفهوم ، على عكس OOP ، سيختفي بهدوء.
لذلك ، لا تثبط عزيمتك إذا كان مصطلح "MOP" لا يبدو وكأنه كلمة من مصطلحات المبرمجين. قم فقط بتنظيم OOP الخاص بك مع مبادئ MOP المذكورة أعلاه.
