طريقة (Method) في البرمجة الكائنية (OOP) هي إجراء مرتبط (associated) برسالة وكائن. يتكون الكائن من البيانات والسلوك. تشتمل البيانات والسلوك على واجهة (interface)، تحدد كيفية استخدام الكائن من قبل أي من المستهلكين المختلفين [1] للكائن.
يتم تمثيل البيانات على أنها خصائص الكائن (properties of the object) ويتم تمثيل السلوكيات كطرق للكائن (methods of the object). على سبيل المثال، يمكن أن يحتوي كائن النافذة Window
على طرق مثل افتح open
و أغلق close
، في حين أن حالته (state) (سواء تم فتحه أو إغلاقه في أي نقطة زمنية) ستكون خاصية.
في البرمجة القائمة على الصنف (class-based programming)، يتم تعريف (defined) الطرق في صنف (class)، والكائنات هي أمثلة (instances) لصنف معين. أحد أهم القدرات التي توفرها الطريقة هي تجاوز الطريقة (method overriding). يمكن استخدام نفس الاسم (على سبيل المثال، المساحة area
) لأنواع متعددة من الأصناف المختلفة (multiple different kinds of classes). يسمح هذا للكائنات المرسلة باستدعاء السلوكيات وتفويض تنفيذ هذه السلوكيات ( delegate the implementation of those behaviors) إلى الكائن المتلقي. تعيّن الطريقة في برمجة جافا سلوك كائن صنف (behavior of a class object). على سبيل المثال، يمكن للكائن إرسال رسالة مساحة area
إلى كائن آخر ويتم استدعاء الصيغة المناسبة سواء كان الكائن المستلم مستطيل rectangle
أو دائرة circle
أومثلث triangle
، إلخ.
توفر الطرق أيضًا الواجهة التي تستخدمها الأصناف الأخرى (the interface that other classes use) للوصول (access) إلى خصائص بيانات الكائن وتعديلها. يُعرف هذا بالتغليف (encapsulation). التغليف والتجاوز (Encapsulation and overriding) هما السمتان المميزتان الأساسيتان بين الطرق (methods) واستدعاءات الإجراءات (procedure calls).[2]
التجاوز والتحميل الزائد
يعد تجاوز الطريقة (Method overriding) و التحميل الزائد (overloading) من أهم الطرق التي تختلف بها الطريقة عن الإجراء التقليدي (conventional procedure) أو استدعاء الدالة (function call). يشير تجاوز الطريقة إلى صنف ابن (subclass) يعيد تعريف تنفيذ (redefining the implementation) طريقة الصنف الأب (superclass) الخاصة بها. على سبيل المثال، قد يكون أوجد-المساحة findArea
طريقة معرفة في صنف الشكل (shape class). الأصناف الفرعية المختلفة: rectangle
مستطيل، circle
دائرة، مثلث triangle
، إلخ، ستعرّف كل منها الصيغة الرياضية المناسبة (the appropriate formula) لحساب مساحتها. والفكرة هي النظر إلى الكائنات على أنها "صناديق سوداء ("black boxes")" بحيث يمكن إجراء التغييرات على الأجزاء الداخلية للكائن بأقل تأثير على الكائنات الأخرى التي تستخدمها. يُعرف هذا بالتغليف (encapsulation) ويهدف إلى تسهيل صيانة الكود وإعادة استخدامه.
من ناحية أخرى، يشير التحميل الزائد للطريقة (Method overloading) إلى التمييز بين الكود المستخدم للتعامل مع رسالة بناءً على معلمات الطريقة (parameters of the method). إذا نظر المرء إلى الكائن الاستلام (If one views the receiving object) كمعلمة أولى (as the first parameter) في أي طريقة، فإن تجاوز الطريقة هو مجرد حالة خاصة من التحميل الزائد حيث يعتمد التحديد فقط على القيمة الأولى (first argument). [3] يوضح مثال جافا البسيط التالي الاختلاف: [4]
class Class1 { int f(int x) { return x + 3; } } class Class2 extends Class1 { @Override int f(int x) { // overriding return x * x; } int f(int x, int y) { // overloading return x * y; } }
طرق الموصّل والمحور و المدير (Accessor, mutator and manager methods)
يتم استخدام طرق الموصّل (Accessor methods) لقراءة قيم بيانات الكائن. يتم استخدام طرق (الحوّر) (Mutator methods) لتعديل بيانات كائن. تُستخدم أساليب المدير (Manager methods) لتهيئة (initialize) وتدمير (destroy) كائنات من صنف، مثل المُنشِّئين والمدمِّرين (constructors and destructors).
توفر هذه الطرق (methods) طبقة تجريد (abstraction layer) تسهل التغليف (encapsulation) والنمطية (modularity). على سبيل المثال، إذا كانت صنف الحساب المصرفي (bank-account class) يزود طريقة (احصل على الموازنة)()getBalance
لاسترداد الرصيد الحالي (بدلاً من الوصول مباشرةً إلى حقول بيانات الرصيد) (rather than directly accessing the balance data fields)، عندئذٍ يمكن للمراجعات (revisions) اللاحقة لنفس الكود تنفيذ آلية أكثر تعقيدًا لاسترداد الرصيد (على سبيل المثال، إحضار قاعدة البيانات)، دون الحاجة إلى تغيير الكود التابع. ليست مفاهيم التغليف والنمطية فريدة (unique) بالنسبة للبرمجة الكائنية. في الواقع، من نواح عديدة، فإن النهج الموجه للكائنات هو ببساطة الامتداد المنطقي للنماذج السابقة (the logical extension of previous paradigm) مثل أنواع البيانات المجردة (abstract data types) والبرمجة الهيكلية (structured programming).[5]
المُنشئون
المنشئ (constructor) هو طريقة يتم استدعاؤها في بداية عمر الكائن (beginning of an object's lifetime) لإنشاء (create) الكائن وتهيئته (initialize)، وهي عملية تسمى الإنشاء (أو إنشاء مثيل (instantiation)). قد تتضمن التهيئة (Initialization) الحصول على الموارد (acquisition of resources.). قد يكون للمُنشئين معلمات (Constructors may have parameters) ولكن لا تُرجع عادةً قيم ( do not return values) في معظم اللغات. انظر المثال التالي في جافا:
public class Main { String name; int roll; Main(String _name, int _roll) { //constructor method this.name = _name; this.roll = _roll; } }
المدمرات
المدمر (destructor) هو طريقة (method) يتم استدعاؤها تلقائيًا (called automatically) في نهاية عمر الكائن (at the end of an object's lifetime)، وهي عملية تسمى التدمير (destruction). التدمير في معظم اللغات لا يسمح بقيم لطريقة التدمير أو قيم للإرجاع (does not allow destructor method arguments nor return values). يمكن تنفيذ التدمير من أجل القيام بأعمال التنظيف (perform cleanup chores) والمهام الأخرى عند تدمير الكائن.
المُنهيون (Finalizers)
في اللغات التي يتم جمع القمامة بها ( garbage-collected)، مثل Java و C # و Python، تُعرف المدمرات بأنها المُنهيين (أدوات الإنهاء (finalizers)). لديهم نفس الغرض والوظيفة للمدمرات، ولكن بسبب الاختلافات بين اللغات التي تستخدم جمع القمامة (utilize garbage-collection) واللغات مع إدارة الذاكرة اليدوية (anguages with manual memory management)، فإن التسلسل (the sequence) الذي يطلقون عليه مختلف.
طرق مجردة
الطريقة المجردة (abstract method) هي طريقة ذات توقيع (signature) فقط وليس لها جسم تنفيذ (implementation body). غالبًا ما يتم استخدامه لتحديد أنه يجب على الصنف الفرعي (subclass) توفير تنفيذ الطريقة ( provide an implementation of the method). تُستخدم الطرق المجردة لتحديد الواجهات في بعض لغات البرمجة. [6]
يعرض كود جافا (Java) التالي صنف مجرد يحتاج إلى توسيع:
يمدد (extends) الصنف الفرعي (subclass) التالي الصنف الرئيسي(main class):
public class Rectangle extends Shape { @Override int area(int h, int w) { return h * w; } }
طرق الصنف
طرق الصنف (Class methods) هي طرق يتم استدعاؤها في صنف (on a class) بدلاً من مثيل (instance). وعادة ما يتم استخدامها كجزء من نموذج تعريف كائن ( object meta-model). أي لكل صنف، يعرّف مثيل كائن من صنف فهو مُنشأ في نموذج التعريف (meta-model) (I.e, for each class, defined an instance of the class object in the meta-model is created). تسمح بروتوكولات نموذج التعريف (Meta-model protocols) بإنشاء الأصناف وحذفها. وبهذا المعنى، فإنها توفر نفس الوظائف مثل المُنشئين والمدمرين الموصوفين أعلاه. ولكن في بعض اللغات مثل نظام كائن Lisp العام (CLOS) (Common Lisp Object System (CLOS))، يسمح النموذج التعريفي (meta-model) للمطور بتغيير نموذج الكائن ديناميكيًا (dynamically alter the object model) في وقت التشغيل (at run time): على سبيل المثال، لإنشاء أصناف جديدة ( to create new classes)، وإعادة تعريف التسلسل الهرمي للصنف (redefine the class hierarchy)، وتعديل الخصائص (, modify properties)، وما إلى ذلك.
طرق خاصة
الطرق الخاصة (Special methods) هي لغة محددة للغاية ( very language-specific) وقد لا تدعم اللغة أيًا أو بعضًا أو كل الطرق الخاصة المحددة هنا (may support none, some, or all of the special methods defined here). قد يقوم مجمع اللغة (A language's compiler) تلقائيًا بإنشاء طرق خاصة افتراضية (automatically generate default special methods) أو قد يُسمح للمبرمج بتعريف طرق خاصة بشكل اختياري (optionally define special methods). لا يمكن استدعاء معظم الطرق الخاصة مباشرة، بل يقوم المجمّع _(compiler) بإنشاء كود لاستدعائها في الأوقات المناسبة.
طرق ثابتة
يُقصد من الطرق الثابتة (Static methods) أن تكون ذات صلة بجميع مثيلات الصنف (relevant to all the instances of a class) بدلاً من أي مثيل محدد (rather than to any specific instance). وهي تشبه المتغيرات الثابتة (static variables) بهذا المعنى. كمثال على ذلك ؛طريقة ثابتة (static method) لجميع قيم جميع المتغيرات في كل مثيل صنف (sum the values of all the variables of every instance of a class). على سبيل المثال، إذا كانت هناك صنف (المنتج) Product
، فقد يكون لديه طريقة ثابتة ( static method) لحساب متوسط سعر جميع المنتجات.
في جافا، يوجد طريقة ثابتة شائعة الاستخدام وهي.
Math.max(double a, double b)Math.max(double a, double b)
لا تمتلك هذه الطريقة الثابتة كائن خاص (This static method has no owning object) ولا تقوم بتشغيل مثيل (does not run on an instance). يتلقى جميع المعلومات من القيم الخاصة به (It receives all information from its arguments). [7]
يمكن استدعاء الطريقة الثابتة حتى ولو لم يوجد أمثال للصنف حتى الآن. تسمى الطرق الثابتة "ثابتة"("static") لأنها يتم حلها في وقت التجميع بناءً على الصنف الذي استدعاها وليس بشكل ديناميكي كما هو الحال مع طرق المثيل (instance methods)، والتي يتم حلها بشكل متعدد الأشكال (polymorphically) استنادًا إلى نوع وقت تشغيل الكائن (based on the runtime type of the object).
عوامل تعيين النسخ
عوامل تعيين النسخ (Copy-assignment operators) تعرّف الإجراءات (define actions) التي يتعين على المجمّع (compiler) تنفيذها عندما يتم تعيين كائن صنف ( a class object is assigned) لكائن صنف من نفس النوع ( to a class object of the same type).
طرق عامل التشغيل
طرق العامل Operator methods تعرّف أو تعيد تعريق طرق رموز العامل (define or redefine operator symbols)، كما تحدد العمليات التي سيتم إجراؤها (define the operations to be performed) باستخدام الرمز (symbol) ومعلمات الطريقة المصاحبة(associated method parameters). مثال C ++:
#include <string> class Data { public: bool operator<(const Data& data) const { return roll_ < data.roll_; } bool operator==(const Data& data) const { return name_ == data.name_ && roll_ == data.roll_; } private: std::string name_; int roll_; };
دوال عضوية في سي++
تم توسيع (extended) بعض اللغات الإجرائية (procedural languages) بقدرات موجهة للكائنات للاستفادة من مجموعات المهارات الكبيرة والكود القديم لتلك اللغات ولكنها لا تزال توفر مزايا التطوير الكائني. ولعل المثال الأكثر شهرة هو C ++، وهو امتداد كائني التوجه ( an object-oriented extension) للغة البرمجة C. نظرًا لمتطلبات التصميم لإضافة النموذج الموجه للكائنات ( object-oriented paradigm) إلى لغة إجرائية موجودة ( to an existing procedural language)، فإن تمرير الرسائل (message passing) في ++C لديه بعض القدرات والمصطلحات الفريدة (unique capabilities and terminologies). على سبيل المثال، في ++C تُعرف الطريقة بدالة عضو ( member function). تحتوي ++C أيضًا على مفهوم الدوال الافتراضية ( virtual functions) وهي دوال عضوية (member functions) التي يمكن تجاوزها (overridden) في الأصناف المشتقة (derived classes) وتسمح بالإرسال الديناميكي (dynamic dispatch).
دوال افتراضية
الدوال الافتراضية Virtual functions هي الوسيلة التي يمكن من خلالها لصنف سي++ تحقيق سلوك متعدد الأشكال (polymorphic behavior).الدوال العضوية غير الافتراضية (virtual member functions)، أو الطرق العادية (regular methods)، هي تلك التي لا تشارك في تعدد الأشكال (do not participate in polymorphism.).
مثال ++C :
#include <iostream> #include <memory> class Super { public: virtual ~Super() = default; virtual void IAm() { std::cout << "I'm the super class!\n"; } }; class Sub : public Super { public: void IAm() override { std::cout << "I'm the subclass!\n"; } }; int main() { std::unique_ptr<Super> inst1 = std::make_unique<Super>(); std::unique_ptr<Super> inst2 = std::make_unique<Sub>(); inst1->IAm(); // Calls |Super::IAm|. inst2->IAm(); // Calls |Sub::IAm|. }
مقالات ذات صلة
ملاحظات
- Consumers of an object may consist of various kinds of elements, such as other programs, remote computer systems, or computer programmers who wish to utilize the object as part of their own programs.
- "What is an Object?". oracle.com. Oracle Corporation. مؤرشف من الأصل في 10 مايو 202013 ديسمبر 2013.
- http://www.codeproject.com/Articles/16407/METHOD-Overload-Vs-Overriding - تصفح: نسخة محفوظة 2016-03-04 على موقع واي باك مشين.
- John Suzuki (2000-02-18). "What is an overloaded method?". j Guru. مؤرشف من الأصل في 01 يونيو 202012 أغسطس 2011.
Overloaded methods are multiple methods in the same class that shares the same name but have different parameter lists. Overloaded methods cannot have the same parameter lists with different return types.
- Meyer, Bertrand (1988). Object-Oriented Software Construction. Cambridge: Prentice Hall International Series in Computer Science. صفحات 52–54. .
- "Abstract Methods and Classes". oracle.com. Oracle Java Documentation. مؤرشف من الأصل في 01 يونيو 202011 ديسمبر 2014.
- Martin, Robert C. (2009). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. صفحة 296. .
مراجع
- JANA, DEBASISH (1 January 2005). C++ AND OBJECT-ORIENTED PROGRAMMING PARADIGM. PHI Learning Pvt. Ltd. . مؤرشف من الأصل في 03 مايو 2017.
- Sengupta, Probal (1 August 2004). Object-Oriented Programming: Fundamentals And Applications. PHI Learning Pvt. Ltd. . مؤرشف من الأصل في 03 مايو 2017.
- Svenk, Goran (2003). Object-oriented Programming: Using C++ for Engineering and Technology. Cengage Learning. . مؤرشف من الأصل في 01 يونيو 2020.
- Balagurusamy (2013). Object Oriented Programming with C++. Tata McGraw-Hill Education. . مؤرشف من الأصل في 03 مايو 2017.
- Kirch-Prinz, Ulla; Prinz, Peter (2002). A Complete Guide to Programming in C++. Jones & Bartlett Learning. . مؤرشف من الأصل في 03 مايو 2017.
- Conger, David (2006). Creating Games in C++: A Step-by-step Guide. New Riders. . مؤرشف من الأصل في 03 مايو 2017.
- Skinner, M. T. (1992). The Advanced C++ Book. Silicon Press. . مؤرشف من الأصل في 03 مايو 2017.
- Love (1 September 2005). Linux Kernel Development. Pearson Education. . مؤرشف من الأصل في 01 يونيو 2020.
- DEHURI, SATCHIDANANDA; JAGADEV, ALOK KUMAR; RATH, AMIYA KUMAR (8 May 2007). OBJECT-ORIENTED PROGRAMMING USING C++. PHI Learning Pvt. Ltd. . مؤرشف من الأصل في 03 مايو 2017.