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

الطريقة (Method) أو النهج في البرمجة الكائنية (OOP) هي إجراء مرتبط برسالة وكائن. يتكون الكائن من البيانات والسلوك. تشتمل البيانات والسلوك على واجهة بينية، تحدد كيفية استخدام الكائن من قبل أي من المستهلكين المختلفين [1] للكائن.

تمثَّل البيانات على أنها خصائص الكائن ويتم تمثيل السلوكيات كطرق للكائن. على سبيل المثال، يمكن أن يحتوي كائن النافذة Window على طرق مثل افتح openو أغلق close، في حين أن حالته (سواء تم فتحه أو إغلاقه في أي نقطة زمنية) ستكون خاصية.

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

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

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

يعد تجاوز الطريقة والتحميل الزائد من أهم الطرق التي تختلف بها الطريقة عن الإجراء التقليدي أو استدعاء الدالة. يشير تجاوز الطريقة إلى صنف فرعي يعيد تعريف تنفيذ طريقة الصنف الأصل الخاصة بها. على سبيل المثال، قد يكون أوجد-المساحة findArea طريقة معرفة في صنف الشكل shape class. الأصناف الفرعية المختلفة: rectangleمستطيل، circleدائرة، مثلث triangle، إلخ، ستعرّف كل منها الصيغة الرياضية المناسبة لحساب مساحتها. والفكرة هي النظر إلى الكائنات على أنها «صناديق سوداء (»black boxes")" بحيث يمكن إجراء التغييرات على الأجزاء الداخلية للكائن بأقل تأثير على الكائنات الأخرى التي تستخدمها. يُعرف هذا بالتغليف ويهدف إلى تسهيل صيانة الكود وإعادة استخدامه.

من ناحية أخرى، يشير التحميل الزائد للطريقة إلى التمييز بين الكود المستخدم للتعامل مع رسالة بناءً على معلمات الطريقة. إذا نظر المرء إلى كائن الاستلام كمعلمة أولى في أي طريقة، فإن تجاوز الطريقة هو مجرد حالة خاصة من التحميل الزائد حيث يعتمد التحديد فقط على القيمة الأولى.[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;
	}
}

طرق الموصّل والمحوّر والمدير

يتم استخدام طرق الموصّل لقراءة قيم بيانات الكائن. يتم استخدام طرق (الحوّر) لتعديل بيانات كائن. تُستخدم أساليب المدير لتهيئة وتدمير كائنات من صنف، مثل المُنشِّئين والمدمِّرين.

توفر هذه الطرق طبقة تجريد تسهل التغليف والنمطية. على سبيل المثال، إذا كانت صنف الحساب المصرفي bank-account class يقدم طريقة (احصل على الموازنة)()getBalance لاسترداد الرصيد الحالي (بدلاً من الوصول مباشرةً إلى حقول بيانات الرصيد)، عندئذٍ يمكن للمراجعات اللاحقة لنفس الكود تنفيذ آلية أكثر تعقيدًا لاسترداد الرصيد (على سبيل المثال، إحضار قاعدة البيانات)، دون الحاجة إلى تغيير الكود التابع. ليست مفاهيم التغليف والنمطية فريدة بالنسبة للبرمجة الكائنية. في الواقع، من نواح عديدة، فإن النهج الموجه للكائنات هو ببساطة الامتداد المنطقي للنماذج السابقة مثل أنواع البيانات المجردة والبرمجة الهيكلية.[5]

المُنشئون

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

public class Main {
	String name;
	int roll;
	Main(String _name, int _roll) { //constructor method طريقة المُنشئ
		this.name = _name;
		this.roll = _roll;
	}

}

المدمرات

المدمرة (destructor) هي طريقة يتم استدعاؤها تلقائيًا في نهاية عمر الكائن، وهي عملية تسمى التدمير. التدمير في معظم اللغات لا يُسمح بقيم للمعلمات في طريقة التدمير أو قيم للإرجاع. يمكن تنفيذ التدمير من أجل القيام بأعمال التنظيف والمهام الأخرى عند تدمير الكائن.

المُنهيات

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

طرق مجردة

الطريقة المجردة (abstract method) هي طريقة ذات توقيع فقط وليس لها جسم تنفيذ. غالبًا ما تُستخدم للإشارة إلى أن الصنف الفرعي يجب أن يوفر تنفيذ الطريقة. تُستخدم الطرق المجردة لتحديد الواجهات في بعض لغات البرمجة.[6]

مثال

يعرض كود جافا التالي صنفًا مجردًا يحتاج إلى توسيع:

abstract class Shape {
    abstract int area(int h, int w); //   طريقة مساحة مجردة (توقيع طريقة مجردة)   
}

يوسّع (extends) الصنف الفرعي التالي الصنف الرئيسي:

public class Rectangle extends Shape { // يوسّع صنف المستطيل صنف الشكل (صنف الشكل هو الصنف الأصل و المستطيل هو الصنف الفرع)
  @Override 
  int area(int h, int w) { // { }  تعريف طريقة المساحة المجردة (تتمة المثال السابق) بإضافة الكود و الكتلة البرمجية داخل الأقواس
     return h * w;
  }
}

طرق الصنف

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

طرق خاصة

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

طرق ثابتة

يُقصد بالطرق الثابتة (Static methods) أن تكون ذات صلة بجميع مثيلات الصنف بدلاً من أي مثيل محدد. وهي تشبه المتغيرات الثابتة بهذا المعنى. كمثال على ذلك؛ طريقة ثابتة لجمع قيم كل المتغيرات في كل مثيل صنف. على سبيل المثال، إذا كانت هناك صنف (المنتج) Product، فقد يكون لديه طريقة ثابتة لحساب متوسط سعر جميع المنتجات.

في جافا، يوجد طريقة ثابتة شائعة الاستخدام وهي.

Math.max(double a, double b)

لا تمتلك هذه الطريقة الثابتة كائن خاص بها ولا تُشغّل على مثيل. تتلقى جميع المعلومات من القيم الخاصة بها.[7]

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

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

عوامل تعيين النسخ (Copy-assignment operators) تعرّف الإجراءات التي يتعين على المجمّع تنفيذها عندما يعيَن كائن صنف لكائن صنف آخر من نفس النوع.

طرق العامل

طرق العامل Operator methods تُعرّف أو تعيد تعريف رموز العامل، كما تعرّف العمليات التي سيتم إجراؤها باستخدام الرمز ومعلمات الطريقة المرتبطة. مثال بلغة سي ++:

#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_;
};

دوال عضوية في سي++

وُسعت بعض اللغات الإجرائية بقدرات موجهة للكائنات للاستفادة من مجموعات المهارات الكبيرة والكود القديم لتلك اللغات وأيضاً توفير مزايا التطوير كائني التوجه. ولعل المثال الأكثر شهرة هو سي++، وهو امتداد كائني التوجه للغة البرمجة سي نظرًا لمتطلبات التصميم لإضافة النموذج الموجه للكائنات إلى لغة إجرائية موجودة مسبقاً، فإن تمرير الرسائل في سي++ لديه بعض القدرات والمصطلحات الفريدة. على سبيل المثال، في سي++ تُعرف الطريقة بدالة عضو (member function). تحتوي سي++ أيضًا على مفهوم الدوال الافتراضية (virtual functions) وهي دوال عضوية التي يمكن تجاوزها في الأصناف المشتقة وتسمح بالإرسال الديناميكي.

دوال افتراضية

الدوال الافتراضية Virtual functions هي الوسيلة التي يمكن من خلالها لصنف سي++ تحقيق سلوك متعدد الأشكال. الدوال العضوية غير الافتراضية، أو الطرق العادية، هي تلك التي لا تشارك في تعدد الأشكال.

مثال سي++ :

#include <iostream>
#include <memory>
   
class Super {
 public:
 virtual ~Super() = default;

 virtual void IAm() { std::cout << "أنا الصنف الأصل\n"; }
};

class Sub : public Super {
 public:
 void IAm() override { std::cout << "أنا الصنف الفرع\n"; }
};

int main() {
 std::unique_ptr<Super> inst1 = std::make_unique<Super>();
 std::unique_ptr<Super> inst2 = std::make_unique<Sub>();

 inst1->IAm(); // تستدعي |Super::IAm|.
 inst2->IAm(); // تستدعي |Sub::IAm|.
}

انظر أيضًا

ملحق: مسرد المصطلحات الإنجليزية

مَسرد المفردات وفق أقسام المقالة
المقدمة
مرتبط associated
خصائص الكائن properties of the object
السلوكيات كطرق للكائن methods of the object
حالته state
البرمجة القائمة على الصنف class-based programming
تعريف defined
صنف class
أمثال instances
تجاوز الطريقة method overriding
تفويض تنفيذ delegate the implementation
للوصول access
بالتغليف encapsulation
واستدعاء الإجراءات procedure calls
التجاوز والتحميل الزائد
التحميل الزائد overloading
الإجراء التقليدي conventional procedure
استدعاء الدالة function call
صنف فرعي subclass
يعيد تعريف تنفيذ redefining the implementation
الصنف الأصل superclass
الصيغة الرياضية المناسبة the appropriate formula
معلمات الطريقة parameters of the method
كائن الاستلام receiving object
القيمة الأولى first argument
طرق الموصّل والمحور والمدير
طريقة الموصّل Accessor method
طريقة المحوّر mutator method
طريقة المدير manager method
لتهيئة initialize
تدمير destroy
المُنشِّئين constructors
والمدمِّرين destructors
طبقة تجريد abstraction layer
والنمطية modularity
للمراجعات revisions
النمطية فريدة unique
للنماذج السابقة previous paradigm
أنواع البيانات المجردة abstract data types
البرمجة الهيكلية structured programming
المنشئون
المنشئ constructor
عمر الكائن object's lifetime
إنشاء create
تهيئته initialize
إنشاء مثيل instantiation
الحصول على الموارد acquisition of resources
لا تُرجع عادةً قيم do not return values
المدمرات
استدعاؤها تلقائيًا called automatically
نهاية عمر الكائن an object's lifetime
التدمير destruction
قيم للمعلمات في طريقة التدمير destructor method arguments
قيم للإرجاع return values
القيام بأعمال التنظيف perform cleanup chores
المنهيات
المُنهيات Finalizers
جمع القمامة بها garbage-collected
أدوات الإنهاء finalizers
اللغات ذي الذاكرة يدوية الإدارة anguages with manual memory management
تسلسل sequence
طرق مجردة
الطريقة المجردة abstract method
توقيع signature
جسم تنفيذ implementation body
يوسّع extends
الصنف الرئيسي main class
طرق الصنف
طرق الصنف Class methods
على صنف on a class
نموذج تعريف كائن object meta-model
نموذج الوصف meta-model
مثيل كائن من صنف an instance of the class object
بروتوكولات نموذج التعريف Meta-model protocols
نظام كائن ليسب العام Common Lisp Object System (CLOS)
بتغيير نموذج الكائن ديناميكيًا dynamically alter the object model
وقت التشغيل at run time
لإنشاء أصناف جديدة to create new classes
إعادة تعريف التسلسل الهرمي للصنف redefine the class hierarchy
تعديل الخصائص modify properties
طرق خاصة
الطرق الخاصة Special methods
خاصة جداً باللغة المستخدمة very language-specific
مجمع اللغة A language's compiler
طرق خاصة افتراضية default special methods
الطرق الثابتة
الطرق الثابتة Static methods
مثيل محدد specific instance
المتغيرات الثابتة static variables
كائن خاص بها owning object
لا تُشغل على مثيل does not run on an instance
القيم الخاصة بها from its arguments
طرق المثيل instance methods
متعدد الأشكال polymorphically
نوع وقت تشغيل الكائن the runtime type of the object
عوامل تعيين النسخ
عوامل تعيين النسخ Copy-assignment operators
تعرّف الإجراءات define actions
يتم تعيين كائن صنف a class object is assigned
نفس النوع same type
طرق العامل
طرق العامل Operator methods
تُعرّف أو تعيد تعريف رموز العامل define or redefine operator symbols
تعرّف العمليات التي سيتم إجراؤها define the operations to be performed
الرمز symbol
معلمات الطريقة المرتبطة associated method parameters
دوال عضوية في سي ++
دوال عضوية Member functions
للغات الإجرائية procedural languages
امتداد كائني التوجه an object-oriented extension
النموذج الموجه للكائنات object-oriented paradigm
تمرير الرسائل message passing
بعض القدرات والمصطلحات الفريدة unique capabilities and terminologies
الدوال الافتراضية virtual functions
الأصناف المشتقة derived classes
بالإرسال الديناميكي dynamic dispatch
الدوال العضوية غير الافتراضية Non-virtual member functions
الطرق العادية regular methods

ملاحظات

  1. ^ 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.
  2. ^ "What is an Object?". oracle.com. Oracle Corporation. مؤرشف من الأصل في 2020-05-10. اطلع عليه بتاريخ 2013-12-13.
  3. ^ http://www.codeproject.com/Articles/16407/METHOD-Overload-Vs-Overriding نسخة محفوظة 2016-03-04 على موقع واي باك مشين.
  4. ^ John Suzuki (18 فبراير 2000). "What is an overloaded method?". j Guru. مؤرشف من الأصل في 2020-06-01. اطلع عليه بتاريخ 2011-08-12. 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.
  5. ^ Meyer، Bertrand (1988). Object-Oriented Software Construction. Cambridge: Prentice Hall International Series in Computer Science. ص. 52–54. ISBN:0-13-629049-3.
  6. ^ "Abstract Methods and Classes". oracle.com. Oracle Java Documentation. مؤرشف من الأصل في 2020-06-01. اطلع عليه بتاريخ 2014-12-11.
  7. ^ Martin، Robert C. (2009). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. ص. 296. ISBN:978-0-13-235088-4.

مقالة من صنف ب ب