مفهوم الـ
Generics في ++C
The concept of Generics in C
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاتة
هلا سهلا مدونه العنود للمعلومات
نقدم لكم يوم مفهوم الـ Generics في ++C
♧■المحتويات المقال♧■
☆مفهوم الـ Generics في ++C
☆فائدة الـ Generics
ما أهمية استخدام أسلوب الـ Generics في لغة البرمجة ++C؟
☆مصطلحات تقينةGenerics
☆الأحرف المستخدمةGenerics في الـ Generics في ++C
☆كيفية تعريف نوع غير محدد في++C
♧■مفهوم الـ Generics في ++C؟
الـ (Generics) في لغة البرمجة (++C): هو عبارة عن أسلوب يُستخدم في عملية كتابة الكود البرمجي ويجعل المستخدم قادراً على بناء كود برمجي واحد يلائم أكثر من نوع بيانات، وعند الحاجة إلى استخدام هذا الكود فإنه بإمكان المستخدم من استخدامه كما هو أو تحديد نوع البيانات التي يريدها.
♧■فائدة الـ Generics
أنت لست مجبر على استخدام أسلوب الـ Generics, لكن تعلمه سيفيدك كثيراً في تطوير الكود الخاص فيك, و جعل حجمه أصغر و أسهل في حالة التعديل.
فمثلاً, يمكنك بناء دالة يمكنك أن تمرر لها مصفوفة من أي نوع كان فتقوم بطباعة قيم العناصر الموجودة فيها.
♧■ما أهمية استخدام أسلوب الـ Generics في لغة البرمجة ++C؟
إن استخدام أسلوب الـ (Generics) في لغة البرمجة (++C) يساعد بشكل كبير في تطوير الكود البرمجي (code) وجعل حجمه أصغر و أسهل في حالة التعديل، حيث أن هذا الأسلوب يُمكن المستخدم من بناء دالة وأن يمرر لها مصفوفة من أي نوع كان فتقوم بطباعة جميع قيم العناصر الموجودة فيها، كما وأن هذا الأسلوب يساعد المبرمج في إكتشاف الأخطاء النوعية أثناء كتابة الكود البرمجي، وبشكل عام يتم استخدام الـ (Generics) لبناء كود يتوافق مع أي نوع بيانات وعند الحاجة إلى هذا الكود نقوم بتحديد نوع البيانات التي سنتعامل معها.
♧■مصطلحات تقينة
1/
Generic Function: تعني تعريف دالة تتعامل مع أكثر من نوع بيانات.
2/
Generic Class: تعني تعريف كلاس يتعامل مع أكثر من نوع بيانات.
3/
Bounded Type Parameters: تعني تعريف كلاس أو دالة يتعاملان مع نوع محدد بالإضافة إلى جميع الأنواع المشتقة منه, أي التي ترث منه.
■الأحرف المستخدمة في الـ Generics في ++C
الأحرف المتعارف عليها بين المبرمجين عند التعامل مع الـ Generics.
¤الأحرف المتعارف عليها
في الـ Generics
T
إختصار للكلمة Type, يقصد منه أي نوع كان.
نستخدمه في العادة عند بناء كود يتعامل مع أي نوع بيانات.
N
إختصار للكلمة Number, يقصد منه أي نوع من الأنواع التي تستخدم لتخزين الأرقام.
نستخدمه في العادة عند بناء كود يتعامل مع الأرقام من أي نوع كانت مثل ( int - float - double إلخ.. ).
E
إختصار للكلمة Element, يقصد منه عنصر ليس له نوع محدد.
نستخدمه في العادة عند بناء كود يتعامل مع عناصر المصفوفة من أي نوع كانت.
K
إختصار للكلمة Key, يقصد منه مفتاح ليس له نوع محدد.
نستخدمه في العادة عند بناء كود يتعامل مع مفاتيح كائن يخزن البيانات بشكل key / valuy
V
إختصار للكلمة Value, يقصد منه قيمة ليس لها نوع محدد.
نستخدمه في العادة عند بناء كود يتعامل مع قيم كائن يخزن البيانات بشكل key / value.
☆ملاحظة: جميع الأحرف المذكورة في الجدول ليس لها أي تأثير على الكود و يمكنك وضع أي حرف أو كلمة مكانهم, لكننا ننصحك باعتمادهم.
♧■كيفية تعريف نوع غير محدد في ++C
☆أي حرف ستستخدمه في دالة أو كلاس للإشارة إلى أن نوعه غير محدد, يجب تعريفه قبل تعريف الدالة أو الكلاس مباشرةً لأنه يعتبر خاص بما تعرّفه بعده فقط.
☆الشكل العام لتعريف نوع غير محدد هو كالتالي مع الإشارة إلى أنك تستطيع وضع أي حرف أو إسم تريد بدل الحرف T.
template <typename T>
☆في حال كنت تريد تعريف أكثر من نوع غير محدد, يجب أن تضع فاصلة بينهما كالتالي.
template <typename T1, typename T2>
☆في المثال التالي قمنا بتعريف دالة تقوم بطباعة قيمة أي متغير نمرره لها مهما كان نوعه.
بعدها قمنا باستدعائها ثلاث مرات مع تمرير قيمة مختلفة لها في كل مرة.
مثال
main.cpp
1/#include <iostream>
2/using namespace std;
3/
4/
هنا قمنا بتعريف نوع بيانات غير محدد قمنا بتسميته بعده Eو هو خاص بالدالة التي سنقوم بتعريفه//
5/template <typename E>
6/
7/
هنا قمنا بتعريف دالة إسمهاprintVarعند استدعائها نمرر
لها قيمة من أي نوع كانت مكان الباراميترx
فتقوم بطباعتها//
8/void printVar(E x)
9/{
10/cout << x << endl;
11.}
12.
13.// main() هنا قمنا بتعريف الدالة
15.{
16.
,int هنا قمنا بتعريف متغير نوعه
// string و متغير نوعه float متغير نوعه
20.
21.
هنا قمنا باستدعاء الدالةprintVar() ثلاث مرات مع تمرير قيمة لها نوع مختلف في كل مرة//
26.
25.
28.}
•سنحصل على النتيجة التالية عند التشغيل.
☆سنحصل على النتيجة التالية عند التشغيل
10
75
Mhamad
النوع الذي تقوم بتعريفه قبل أي شيء يمكنك جعله ملاصق لها عند تعريفه و لكننا لم نفعل ذلك حتى نستطيع كتابة شرح واضح لك.
☆إذاً الدالة printVar() كان بإمكاننا تعريفها كالتالي و الأفضل أن نعرّفها كالتالي أيضاً.
1/template <typename E>
2/void printVar(E x)
3/{
cout << x << endl;
4/}
☆عند استدعاء الدالة printVar() يمكنك تحديد نوع البيانات - التي تريد وضعها بنفسك مكان أي نوع غير محدد فيها - بدل جعل المترجم يفعل ذلك و هذا الأمر من شأنه جعل برنامجك أسرع في التنفيذ.
إذاً كان من المستحسن تحديد نوع القيمة التي سنمررلها للدالة printVar() عند استدعائها كالتالي.
1/
printVar<int>(x); // int
بشكل مباشر بالنوع
printVar()
في الدالة E هنا سيقوم المترجم بتديل الحرف.
2/
printVar<float>(y); // float
بشكل مباشر بالنوع
printVar()
في الدالة E هنا سيقوم المترجم بتديل الحرف.
3/
printVar<string>(name); // string بشكل مباشر بالنوع
printVar()
في الدالة E هنا سيقوم المترجم بتديل الحرف.
■تنبيه■
عند إنشاء كائن من Generic Class تكون مجبر على تحديد كل أنواع البيانات الغير محددة فيه أو سيظهر لك خطأ Missing template arguments.
■بالتوفيق للجميع■
■ مدونه العنودللمعلومات ■
■ تابوعنا على رابط القناه ■
تيليجرام
. ■ ( إِنَّ اللَّهَ وَمَلائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ
يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ
وَسَلِّمُوا تَسْلِيمًا )