طريقة (برمجة الحاسوب)

في البرمجة الكائنية التوجه (OOP)، تُعرَّف الطريقة بأنها إجراء مرتبط بكائن ، وعادةً ما تكون مرتبطة برسالة أيضًا . يتكون الكائن من بيانات الحالة والسلوك ؛ وتشكل هذه البيانات والسلوك واجهةً تحدد كيفية استخدام الكائن. أما الطريقة فهي سلوك للكائن يتم تحديده بواسطة المستخدم.

تُمثَّل البيانات كخصائص للكائن، بينما تُمثَّل السلوكيات كطرق. على سبيل المثال، Windowقد يحتوي الكائن على طرق مثل open`and` و`and` close، في حين أن حالته (سواء كان مفتوحًا أو مغلقًا في أي لحظة معينة) ستكون خاصية.

في البرمجة القائمة على الأصناف ، تُعرَّف الدوال داخل الصنف ، وتُمثِّل الكائنات نسخًا من ذلك الصنف. من أهمّ ميزات الدالة إمكانية إعادة تعريفها ، حيث يُمكن استخدام الاسم نفسه (مثلاً، area) لأنواع مختلفة من الأصناف. يسمح هذا للكائنات المُرسِلة باستدعاء سلوكيات معينة وتفويض تنفيذها إلى الكائن المُستقبِل. في لغة جافا، تُحدِّد الدالة سلوك كائن الصنف. على سبيل المثال، يُمكن لكائن إرسال رسالة إلى كائن آخر ، areaويتم استدعاء الصيغة المناسبة بغض النظر عن نوع الكائن المُستقبِل Rectangle.CircleTriangle

توفر الطرق أيضًا الواجهة التي تستخدمها الفئات الأخرى للوصول إلى خصائص الكائن وتعديلها؛ وهذا ما يُعرف بالتغليف . يُعد التغليف والتجاوز السمتين الرئيسيتين اللتين تميزان الطرق عن استدعاءات الإجراءات. [ 1 ]

التجاوز والتحميل الزائد

يُعدّ كلٌّ من إعادة تعريف الأساليب وتحميلها الزائد من أبرز الطرق التي تُميّز الأسلوب عن الإجراء أو استدعاء الدالة التقليدي. تشير إعادة التعريف إلى قيام فئة فرعية بإعادة تعريف تنفيذ أسلوب من الفئة الأصلية. على سبيل المثال، findAreaقد يكون هناك أسلوب مُعرّف في فئة شكل، [ 2 ]Triangle ، إلخ، حيث يُعرّف كلٌّ منها الصيغة المناسبة لحساب مساحته. الفكرة هي النظر إلى الكائنات على أنها "صناديق سوداء" بحيث يُمكن إجراء تغييرات على مكوناتها الداخلية بأقل تأثير على الكائنات الأخرى التي تستخدمها. يُعرف هذا بالتغليف، ويهدف إلى تسهيل صيانة الكود وإعادة استخدامه.

أما تحميل الدوال، فيشير إلى تمييز الشيفرة المستخدمة لمعالجة رسالة ما بناءً على معلمات الدالة. فإذا اعتبرنا الكائن المُستقبِل هو المعلمة الأولى في أي دالة، فإن إعادة تعريف الدالة هي حالة خاصة من التحميل حيث يعتمد الاختيار على الوسيطة الأولى فقط.

طرق الوصول والتعديل والإدارة

تُستخدم دوال الوصول لقراءة قيم بيانات الكائن. وتُستخدم دوال التعديل لتعديل بيانات الكائن. أما دوال الإدارة فتُستخدم لتهيئة وتدمير كائنات الفئة، مثل الدوال البانية والمدمرة.

توفر هذه الأساليب طبقة تجريدية تُسهّل التغليف والنمطية . على سبيل المثال، إذا وفّر صنف حساب مصرفي getBalance()دالة وصول لاسترجاع الرصيد الحالي (بدلاً من الوصول المباشر إلى حقول بيانات الرصيد)، فيمكن للمراجعات اللاحقة لنفس الكود تطبيق آلية أكثر تعقيدًا لاسترجاع الرصيد (مثل جلب البيانات من قاعدة البيانات )، دون الحاجة إلى تغيير الكود التابع. لا تقتصر مفاهيم التغليف والنمطية على البرمجة كائنية التوجه. في الواقع، يُعدّ النهج كائني التوجه، من نواحٍ عديدة، امتدادًا منطقيًا لنماذج سابقة مثل أنواع البيانات المجردة والبرمجة الهيكلية . [ 3 ]

المُنشئون

المُنشئ هو دالة تُستدعى في بداية دورة حياة الكائن لإنشائه وتهيئته، وهي عملية تُسمى الإنشاء (أو التكوين ). قد تتضمن التهيئة الحصول على الموارد. قد تحتوي المُنشئات على مُعاملات ، ولكنها عادةً لا تُرجع قيمًا في معظم لغات البرمجة. انظر المثال التالي في جافا:

public class Person { private String name ; private int age ;// دالة البناء العامة Person ( String name , int age ) { this . name = name ; this . age = age ; } }

المدمر

المُدمِّر هو دالة تُستدعى تلقائيًا عند انتهاء دورة حياة الكائن، وهي عملية تُسمى التدمير . في معظم لغات البرمجة ، لا يسمح التدمير بتمرير وسائط أو إرجاع قيم. يمكن برمجة المُدمِّرات لتنفيذ مهام التنظيف وغيرها من المهام عند تدمير الكائن.

المتأهلون للتصفيات النهائية

في لغات البرمجة التي تعتمد على جمع البيانات المهملة ، مثل جافا [ 4 ] : ​​26، 29، وسي شارب [5]: 208-209، وبايثون ، تُعرف الدوال المدمرة باسم الدوال النهائية . ولها غرض ووظيفة مشابهة للدوال المدمرة، ولكن نظرًا للاختلافات بين اللغات التي تستخدم جمع البيانات المهملة واللغات التي تعتمد على إدارة الذاكرة اليدوية ، فإن ترتيب استدعائها يختلف.

الأساليب المجردة

الأسلوب المجرد هو أسلوب له توقيع فقط دون أي تفاصيل تنفيذية . ويُستخدم غالبًا لتحديد أن الصنف الفرعي يجب أن يوفر تنفيذًا لهذا الأسلوب، كما هو الحال في الصنف المجرد . تُستخدم الأساليب المجردة لتحديد الواجهات في بعض لغات البرمجة. [ 6 ]

مثال

يوضح كود جافا التالي فئة مجردة تحتاج إلى توسيع:

فئة مجردة Shape { // توقيع الدالة المجردة abstract int area ( int height , int width ); }

الفئة الفرعية التالية ترث من الفئة الرئيسية:

public class Rectangle extends Shape { @Override int area ( int height , int width ) { return height * width ; } }

إعادة التجريد

إذا وفرت فئة فرعية تطبيقًا لطريقة مجردة، فيمكن لفئة فرعية أخرى جعلها مجردة مرة أخرى. وهذا ما يسمى إعادة التجريد .

في الواقع، نادراً ما يتم استخدام هذا.

مثال

في لغة C#، يمكن إعادة تعريف دالة افتراضية بدالة مجردة. (ينطبق هذا أيضًا على لغة Java، حيث تكون جميع الدوال غير الخاصة افتراضية).

class IA { public virtual void M () { // ... } }فئة مجردة IB : IA { // مسموح بتجاوز عام مجرد void M (); }

يمكن أيضًا إعادة تجريد الطرق الافتراضية للواجهات، مما يتطلب من الفئات الفرعية تنفيذها. (ينطبق هذا أيضًا على لغة جافا).

interface IA { void M () { // ... } }interface IB : IA { abstract void IA . M (); }// خطأ: الفئة 'C' لا تُنفذ واجهة 'IA.M'. class C : IB { // ... }

أساليب الفئة

أساليب الأصناف هي أساليب تُستدعى على الصنف نفسه وليس على نسخة منه. تُستخدم عادةً كجزء من نموذج بيانات الكائنات . أي أنه لكل صنف مُعرَّف، تُنشأ نسخة من كائن الصنف في نموذج البيانات. تسمح بروتوكولات نموذج البيانات بإنشاء الأصناف وحذفها. وبهذا المعنى، فهي تُوفر نفس وظائف المُنشئات والمُدمِّرات المذكورة سابقًا. ولكن في بعض اللغات، مثل نظام كائنات Common Lisp (CLOS)، يسمح نموذج البيانات للمطور بتعديل نموذج الكائنات ديناميكيًا أثناء التشغيل: على سبيل المثال، لإنشاء أصناف جديدة، أو إعادة تعريف تسلسل الأصناف، أو تعديل الخصائص، وما إلى ذلك.

أساليب خاصة

تختلف الدوال الخاصة باختلاف لغات البرمجة، وقد لا تدعم اللغة أيًا منها، أو تدعم بعضها، أو جميعها. قد يقوم مُصرّف اللغة بإنشاء دوال خاصة افتراضية تلقائيًا، أو قد يُسمح للمبرمج بتعريف دوال خاصة اختياريًا. لا يمكن استدعاء معظم الدوال الخاصة مباشرةً، بل يقوم المُصرّف بإنشاء شيفرة لاستدعائها في الأوقات المناسبة.

الأساليب الثابتة

تُصمَّم الدوال الثابتة لتكون ذات صلة بجميع نسخ الصنف، وليس بنسخة محددة. وهي تُشبه المتغيرات الثابتة في هذا الجانب. على سبيل المثال، يمكن استخدام دالة ثابتة لجمع قيم جميع متغيرات كل نسخة من الصنف. كذلك، إذا كان لدينا Productصنف، فقد يحتوي على دالة ثابتة لحساب متوسط ​​سعر جميع المنتجات.

يمكن استدعاء دالة ثابتة حتى في حال عدم وجود أي نسخة من الصنف. تُسمى الدوال الثابتة بهذا الاسم لأنها تُحدد في وقت الترجمة بناءً على الصنف الذي تُستدعى عليه، وليس ديناميكيًا كما هو الحال مع دوال النسخ، التي تُحدد بشكل متعدد الأشكال بناءً على نوع الكائن في وقت التشغيل.

أمثلة

في لغة جافا

في لغة جافا، الطريقة الثابتة الشائعة الاستخدام هي Math.max().

// يتم استدعاؤها كالتالي: Math.max ( a , b );// تم تعريفها كالتالي: public class Math { // ...public static double max ( double a , double b ) { return ( a < b ) ? b : a ; } }

لا يمتلك هذا الأسلوب الثابت كائنًا ولا يعمل على نسخة منه. ويتلقى جميع المعلومات من وسائطه. [ 2 ]

عوامل النسخ والتخصيص

تحدد عوامل النسخ والتعيين الإجراءات التي يقوم بها المترجم عند تعيين كائن فئة إلى كائن فئة من نفس النوع.

أساليب المشغل

تُعرّف دوال المعاملات أو تُعيد تعريف رموز المعاملات ، وتُحدد العمليات التي تُجرى باستخدام الرمز ومعاملات الدالة المرتبطة به. مثال بلغة C++:

استيراد std ؛باستخدام std :: string ;class Person { private : string name ; int age ; public : bool operator < ( const Person & other ) const { return age < other.age ; }bool operator == ( const Person & other ) const { return name == other . name && age == other . age ; } };

الدوال الأعضاء في لغة C++

تم توسيع بعض لغات البرمجة الإجرائية لتشمل إمكانيات البرمجة الكائنية للاستفادة من المهارات الواسعة والبرمجيات القديمة لتلك اللغات، مع الحفاظ على مزايا التطوير الكائني. ولعلّ أشهر مثال على ذلك هو لغة C++ ، وهي امتداد كائني للغة البرمجة C. ونظرًا لمتطلبات التصميم لإضافة نموذج البرمجة الكائنية إلى لغة إجرائية موجودة، فإنّ تمرير الرسائل في C++ يتميّز ببعض الخصائص والمصطلحات الفريدة. فعلى سبيل المثال، يُعرف الأسلوب في C++ باسم دالة العضو . كما تتضمن C++ مفهوم الدوال الافتراضية ، وهي دوال أعضاء يمكن إعادة تعريفها في الفئات المشتقة ، مما يسمح بالتوزيع الديناميكي .

الوظائف الافتراضية

الدوال الافتراضية هي الوسيلة التي تُمكّن فئة C++ من تحقيق سلوك متعدد الأشكال. أما الدوال غير الافتراضية ، أو الطرق العادية ، فهي تلك التي لا تشارك في تعدد الأشكال .

مثال بلغة C++:

استيراد std ؛باستخدام std :: unique_ptr ؛class Base { public : virtual ~ Base () = default ;virtual void getMessage () { std :: println ( "أنا الفئة الفائقة!" ); } };class Derived : public Base { public : void getMessage () override { std :: println ( "أنا الفئة الفرعية!"); } };int main () { unique_ptr < Base > base = std :: make_unique < Base > (); unique_ptr < Base > derived = std :: make_unique < Derived > ();base- > getMessage (); // يستدعي Base::getMessage(). derived- > getMessage (); // يستدعي Derived::getMessage(). }

انظر أيضاً

ملحوظات

  1. "ما هو الكائن؟" . oracle.com . شركة أوراكل . تم الاطلاع عليه بتاريخ 13 ديسمبر 2013 .
  2. 1 2 مارتن، روبرت سي. (2009). الكود النظيف: دليل لحرفية تطوير البرمجيات الرشيقة . برنتيس هول. ص 296. ISBN  978-0-13-235088-4.
  3. ماير، برتراند (1988). بناء البرمجيات الموجهة للكائنات . كامبريدج: سلسلة برنتيس هول الدولية في علوم الحاسوب. الصفحات 52-54 . ISBN  0-13-629049-3.
  4. بلوخ، جوشوا (2018). "جافا الفعّالة: دليل لغة البرمجة" ( الطبعة الثالثة). أديسون-ويسلي. ISBN  978-0134685991.
  5. البحاري، يوسف. C#10 باختصار . أورايلي. رقم ISBN 978-1-098-12195-2.
  6. "الأساليب والفئات المجردة" . oracle.com . وثائق أوراكل جافا . تم الاطلاع عليه بتاريخ 11 ديسمبر 2014 .

مراجع