#شرح تكملة لل vararage :
في المنشور السابق ذكرنا انه يمكن تمرير اكثر من وسيط الى الدالة من نفس النوع فقط ؛ ولكن هل يمكن تمرير وسائط مختلفة الانواع ؟
الاجابة هي لا ، ولا يمكن ايضاً تمرير اكثر من vararage في نفس الوقت الكود التالي غير صحيح :
static void vara(int ...v1, String ...v2){}
إذا لا يمكن تمرير اكثر من vararage في وقت واحد ، لكن ماذا عن دالة printf التي تحدثنا عنها ، فهي تستقبل في البداية نصاً(String) ثم تستقبل انواع مختلفة قد تكون ارقاماً او نصوصاً ؟!
دعني اوضح لك الاجابة على قسمين ، القسم الاول هو كيف اجعلها تستقبل في البداية نصاً اجبارياً والمثال التالي يوضح ذلك :
static void myPrintf(String first, int ... vara){}
لاحظ اننا قمنا بارسال وسيط ثابت (ليس vararage ) قبل ارسال ال vararage وهذا مقبول في جافا ، والكود سيعمل بدون مشاكل .
حللنا الجزء الاول من المشكلة ، تبقى كيف نرسل انواع مختلفة من البيانات في ال vararage ، الامر بسيط جدا ، فلغة جافا هي كائينية التوجه وكل فئاتها (classes) ترث من الفئة الام وهي Object ، لذلك تعديل الكود السابق سيكون كالتالي :
static void myPrintf(String first, Object ... vara){}
هذا الكود يشبه بالضبط كود تعريف دالة
System.out.printf();
ملاحظة اخيرة عن vararage :
اذا كان لدينا دالة تستقبل vararage كالتالي :
static int sum(int ... nums){
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
return sum;
}
فيمكن استخدامها بطريقتين ، الطريقة الاولى شرحتها في الموضوع السابق والطريقة الثانية هي بتمرير مصفوفة قيم جاهزة اليها كالتالي :
int[] array = new int[]{10, 20, 30, 50};
int total = sum(array);
في النهاية ، موضوع ال vararage موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .
في المنشور السابق ذكرنا انه يمكن تمرير اكثر من وسيط الى الدالة من نفس النوع فقط ؛ ولكن هل يمكن تمرير وسائط مختلفة الانواع ؟
الاجابة هي لا ، ولا يمكن ايضاً تمرير اكثر من vararage في نفس الوقت الكود التالي غير صحيح :
static void vara(int ...v1, String ...v2){}
إذا لا يمكن تمرير اكثر من vararage في وقت واحد ، لكن ماذا عن دالة printf التي تحدثنا عنها ، فهي تستقبل في البداية نصاً(String) ثم تستقبل انواع مختلفة قد تكون ارقاماً او نصوصاً ؟!
دعني اوضح لك الاجابة على قسمين ، القسم الاول هو كيف اجعلها تستقبل في البداية نصاً اجبارياً والمثال التالي يوضح ذلك :
static void myPrintf(String first, int ... vara){}
لاحظ اننا قمنا بارسال وسيط ثابت (ليس vararage ) قبل ارسال ال vararage وهذا مقبول في جافا ، والكود سيعمل بدون مشاكل .
حللنا الجزء الاول من المشكلة ، تبقى كيف نرسل انواع مختلفة من البيانات في ال vararage ، الامر بسيط جدا ، فلغة جافا هي كائينية التوجه وكل فئاتها (classes) ترث من الفئة الام وهي Object ، لذلك تعديل الكود السابق سيكون كالتالي :
static void myPrintf(String first, Object ... vara){}
هذا الكود يشبه بالضبط كود تعريف دالة
System.out.printf();
ملاحظة اخيرة عن vararage :
اذا كان لدينا دالة تستقبل vararage كالتالي :
static int sum(int ... nums){
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
return sum;
}
فيمكن استخدامها بطريقتين ، الطريقة الاولى شرحتها في الموضوع السابق والطريقة الثانية هي بتمرير مصفوفة قيم جاهزة اليها كالتالي :
int[] array = new int[]{10, 20, 30, 50};
int total = sum(array);
في النهاية ، موضوع ال vararage موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .
❤1👍1
#شرح الوصول الى الدوال :
public static void sleep1(){
System.out.print("zzz");
}
static void sleep2(){
System.out.print("zzz");
}
public void sleep3(){
System.out.print("zzz");
}
void sleep4(){
System.out.print("zzz");
}
ما الفرق بين الدوال الاربع السابقة ؟
في الحقيقة يمكن تعريف الدوال باي من الطرق السابقة ، لكن الفرق يكمن في امكانية الوصول اليها ، مثلا ، الدالة الاولى متاحة لجميع الدوال وجميع الفئات في اي مكان حرفياً - مادام تم استدعائها عبر import - .
الدالة الثانية يمكن الوصول اليها من جميع الدوال في نفس الفئة او يمكن استدعائها عبر import من نفس الحزمة package فقط ، ولا يمكن الوصول اليها من خارج الحزمة ابداً .
الدالة الثالثة تختلف عن سابقاتها بانها ليست static ، ما هي static بالضبط ، ساعطيكم مثالين .
دالة الاخراج ودالة الادخال .
Scanner in = new Scanner(System.in);
System.out.print ("");
in.next();
هلا لاحظت الفرق بين دالة print() و دالة next() ؟
الفرق ان print() استطعنا الوصول اليها مباشرة عبر مسارها System.out لكن next() لم نستطع الوصول اليها عبر مسارها مباشرة كالتالي
Scanner.next();
لذلك اضطررنا الى انشاء كائن من Scanner للوصول اليها ، والسبب في ذلك ان الدالة print() هي دالة static والدالة next() هي دالة ليست static وتسمى non-static وهذا الفرق بينهما ، وايضا لا يمكن في نفس الفئة (class ) ان تستدعي الدوال non-static من داخل الدالة الرئيسية كالتالي
public static void main(String[] args) {
sleep3();
}
فالكود السابق يسبب خطا ، لان الدالة sleep3() لا يمكن استدعائها الا بانشاء كائن من الفئة الاب لها ، والمثال التالي يوضح طريقة استدعائها
الكود بالكامل :
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.sleep3();
}
public void sleep3(){
System.out.print("zzz");
}
}
بالتاكيد الكود مفهوم ، فنحن قد سبق وأن تعاملنا مع الكائنات ، ولان الدالة sleep3 () عبارة عن public فيمكن الوصول اليها من اي مكان ! سيخطر على بالك سؤال ، الم تقل انه عندما نريد الوصول اليها نعرف كائن من الفئة الاب لها ؟
الاجابة نعم ، لكن الدالة الرابعة ان قمت بتعريف كائن خارج الحزمة package فلن تستطيع الوصول اليها لانها ليست public ، وهذا موضوع آخر Access Modifiers وهو معدلات الوصول .
public static void sleep1(){
System.out.print("zzz");
}
static void sleep2(){
System.out.print("zzz");
}
public void sleep3(){
System.out.print("zzz");
}
void sleep4(){
System.out.print("zzz");
}
ما الفرق بين الدوال الاربع السابقة ؟
في الحقيقة يمكن تعريف الدوال باي من الطرق السابقة ، لكن الفرق يكمن في امكانية الوصول اليها ، مثلا ، الدالة الاولى متاحة لجميع الدوال وجميع الفئات في اي مكان حرفياً - مادام تم استدعائها عبر import - .
الدالة الثانية يمكن الوصول اليها من جميع الدوال في نفس الفئة او يمكن استدعائها عبر import من نفس الحزمة package فقط ، ولا يمكن الوصول اليها من خارج الحزمة ابداً .
الدالة الثالثة تختلف عن سابقاتها بانها ليست static ، ما هي static بالضبط ، ساعطيكم مثالين .
دالة الاخراج ودالة الادخال .
Scanner in = new Scanner(System.in);
System.out.print ("");
in.next();
هلا لاحظت الفرق بين دالة print() و دالة next() ؟
الفرق ان print() استطعنا الوصول اليها مباشرة عبر مسارها System.out لكن next() لم نستطع الوصول اليها عبر مسارها مباشرة كالتالي
Scanner.next();
لذلك اضطررنا الى انشاء كائن من Scanner للوصول اليها ، والسبب في ذلك ان الدالة print() هي دالة static والدالة next() هي دالة ليست static وتسمى non-static وهذا الفرق بينهما ، وايضا لا يمكن في نفس الفئة (class ) ان تستدعي الدوال non-static من داخل الدالة الرئيسية كالتالي
public static void main(String[] args) {
sleep3();
}
فالكود السابق يسبب خطا ، لان الدالة sleep3() لا يمكن استدعائها الا بانشاء كائن من الفئة الاب لها ، والمثال التالي يوضح طريقة استدعائها
الكود بالكامل :
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.sleep3();
}
public void sleep3(){
System.out.print("zzz");
}
}
بالتاكيد الكود مفهوم ، فنحن قد سبق وأن تعاملنا مع الكائنات ، ولان الدالة sleep3 () عبارة عن public فيمكن الوصول اليها من اي مكان ! سيخطر على بالك سؤال ، الم تقل انه عندما نريد الوصول اليها نعرف كائن من الفئة الاب لها ؟
الاجابة نعم ، لكن الدالة الرابعة ان قمت بتعريف كائن خارج الحزمة package فلن تستطيع الوصول اليها لانها ليست public ، وهذا موضوع آخر Access Modifiers وهو معدلات الوصول .
👍1
#شرح الانظمة المختلفة للارقام
في جافا وعدة لغات اخرى مثل c++ و c# و python يتم التعامل مع الارقام بانظمة مختلفة وفقاً لسابقات محددة توضع قبل الرقم .
مثلا ، نحن نعلم ان الحرف f يمثل الرقم 15 في النظام السادس عشر ، لكن كيف نقوم بطباعته ؟
اذا قمنا بطباعته كالتالي
System.out.print(f);
// OR
System.out.print ("f");
في الدالة الاولى سيظهر لنا خطا لانه يتوقع ان يكون f اسماً لمتغير غير معرف ، اما في الدالة الثانية فسيطبعه كما هو f بدون تغيير .
لذلك لتفادي التضارب بين الارقام والنصوص وأسماء المتغيرات يتم عمل سابقة مخصصه لكل نظام .
|---|---|---|
| 16 | 8 | 2 |
|---|---|---|
| 0x | 0 | 0b |
|---|---|---|
الجدول السابق يوضح سابقات كل نظام ، ستلاحظ امرا غريباً في النظام الثماني ، وهو انه يبدا ب 0 فقط لذلك لا يمكننا طباعة الرقم التالي 09 او 08 لانه لا يوجد رقم 9 او 8 في هذا النظام ، ولا تتوقع ان يعتبره عدداً عشرياً فيطبعه 9 او 8 .
public class Main {
public static void main(String[] args) {
// Binary
System.out.println(0b1010);
// Octal
System.out.println(07);
// Decimal
System.out.println(10);
// Hex
System.out.println(0xf);
}
}
الآن بما أنك فهمت الانظمة العددية ، عليك البحث عن سبب مخرج الكود التالي :
System.out.println(123_456_78e-5);
في جافا وعدة لغات اخرى مثل c++ و c# و python يتم التعامل مع الارقام بانظمة مختلفة وفقاً لسابقات محددة توضع قبل الرقم .
مثلا ، نحن نعلم ان الحرف f يمثل الرقم 15 في النظام السادس عشر ، لكن كيف نقوم بطباعته ؟
اذا قمنا بطباعته كالتالي
System.out.print(f);
// OR
System.out.print ("f");
في الدالة الاولى سيظهر لنا خطا لانه يتوقع ان يكون f اسماً لمتغير غير معرف ، اما في الدالة الثانية فسيطبعه كما هو f بدون تغيير .
لذلك لتفادي التضارب بين الارقام والنصوص وأسماء المتغيرات يتم عمل سابقة مخصصه لكل نظام .
|---|---|---|
| 16 | 8 | 2 |
|---|---|---|
| 0x | 0 | 0b |
|---|---|---|
الجدول السابق يوضح سابقات كل نظام ، ستلاحظ امرا غريباً في النظام الثماني ، وهو انه يبدا ب 0 فقط لذلك لا يمكننا طباعة الرقم التالي 09 او 08 لانه لا يوجد رقم 9 او 8 في هذا النظام ، ولا تتوقع ان يعتبره عدداً عشرياً فيطبعه 9 او 8 .
public class Main {
public static void main(String[] args) {
// Binary
System.out.println(0b1010);
// Octal
System.out.println(07);
// Decimal
System.out.println(10);
// Hex
System.out.println(0xf);
}
}
الآن بما أنك فهمت الانظمة العددية ، عليك البحث عن سبب مخرج الكود التالي :
System.out.println(123_456_78e-5);
👍1
من افضل مصادر المحتوى البرمجي باللغة العربية ، موقع يشرح بالتفصيل ويوفر مراجع ودروساً في مختلف لغات البرمجة .
https://harmash.com
#روابط
https://harmash.com
#روابط
موقع هرمش
أفضل موقع عربي للتعلم الذاتي
نوفر لك كل المعرفة و الأدوات التي تحتاجها للوصول إلى هدفك بشكل مجاني من دورات تفاعلية، كتب، مشاريع و نساعدك على تخطي أي مشكلة تواجهها أثناء التعلم.
اللهم ارحم شهداء فلسطين وشهداء غزة وأجعلهم من أهل الفردوس الأعلى، اللهم أجعل أطفال فلسطين الموتى شفعاء لأسرهم يوم القيامة.
❤1
المواقع على الانترنت مفيدة جداً ، ولكن برغم فائدتها تواجهنا مشكلة وهي بطئ الإنترنت.
حل المشكلة! قم بتحميل الموقع بالكامل الى جهازك (:
لتحميل موقع w3schools بالكامل ، يبلغ حجمة 32MB مضغوط، عند فك الضغط يكبر الى 1.46GB
حمل الملف من هنا ثم قم بفك الضغط وافتح ملف index على جهازك .
#روابط
حل المشكلة! قم بتحميل الموقع بالكامل الى جهازك (:
لتحميل موقع w3schools بالكامل ، يبلغ حجمة 32MB مضغوط، عند فك الضغط يكبر الى 1.46GB
حمل الملف من هنا ثم قم بفك الضغط وافتح ملف index على جهازك .
#روابط
🖥 فيما يلي قائمة بأحدث مجموعات التكنولوجيا الرائجة في عام 2024
1 ⁃ تطوير الواجهة الأمامية:
⁃ React.js:
⁃ الوصف : معروف بهندسته المعمارية القائمة على المكونات ودعم المجتمع القوي.
⁃ Vue.js:
⁃ الوصف : تقدر ببساطتها ومرونتها في بناء واجهات المستخدم.
⁃ Angular:
⁃ الوصف : لا تزال تستخدم على نطاق واسع ، وخاصة في تطبيقات المؤسسة.
2 ⁃ تطوير الواجهة الخلفية :
⁃ Node.js:
⁃ الوصف : شعبية لبناء تطبيقات شبكة قابلة للتطوير وسريعة باستخدام جافا سكريبت.
⁃ Django:
⁃ الوصف : يفضل لقدرات التطوير السريع وميزات الأمان القوية.
⁃ Spring Boot:
⁃ الوصف : تستخدم على نطاق واسع في التطبيقات المستندة إلى جافا لسهولة الاستخدام وقدرات التكامل.
3 ⁃ تطوير المحمول :
⁃ Flutter:
⁃ الوصف : معروف ببناء تطبيقات مجمعة أصلا للجوال والويب وسطح المكتب من قاعدة بيانات واحدة.
⁃ React Native :
⁃ الوصف : لا تزال شعبية لبناء تطبيقات عبر منصة With mother's abilities .
4 ⁃ الحوسبة السحابية و DevOps :
⁃ الوصف : AWS (خدمات أمازون ويب),Azure ، Google Cloud:
مقدمو الخدمات السحابية الرائدون الذين يقدمون خدمات واسعة النطاق للحوسبة والتخزين والشبكات.
⁃ Docker and Kubernetes:
⁃ الوصف : ضروري للحاويات وتزامن التطبيقات في بيئة سحابية أصلية.
⁃ Terraform:
⁃ الوصف : البنية التحتية كأداة رمز لإدارة وتوفير البنية التحتية السحابية.
5 ⁃ علم البيانات والتعلم الآلي :
⁃ Python:
⁃ الوصف : اللغة السائدة لعلوم البيانات والتعلم الآلي ، مع المكتبات مثل نومبي ، الباندا ، و سكيت-تعلم.
- تنسورفلو وبيتورش: الأطر الرائدة لبناء وتدريب نماذج التعلم الآلي.
⁃ Apache Spark:
⁃ الوصف : تستخدم لمعالجة البيانات الكبيرة والتحليلات.
6 ⁃ Cybersecurity:
⁃ الوصف : أدوات سيم (المعلومات الأمنية وإدارة الأحداث): مثل سبلونك و إلك ستاك ، حاسمة لرصد وإدارة الحوادث الأمنية.
⁃ Zero Trust Architecture:
⁃ الوصف : نموذج أمان يلغي فكرة الثقة بناء على موقع الشبكة.
7⁃ بلوكتشين والعملات المشفرة :
⁃ Ethereum:
⁃ الوصف : منصة بلوكتشين تدعم العقود الذكية والتطبيقات اللامركزية.
⁃ Hyperledger Fabric:
⁃ الوصف : إطار عمل لتطوير التطبيقات المسموح بها والقائمة على بلوكتشين.
8 ⁃ الذكاء الاصطناعي ومعالجة اللغة الطبيعية:
⁃ GPT (Generative Pre-trained Transformer) Models:
⁃ الوصف : مثل GPT-4 ، وتستخدم لمختلف المهام فهم اللغة الطبيعية.
⁃ Computer Vision:
⁃ الوصف : مثل أوبينكف لمهام معالجة الصور والفيديو.
9. الحوسبة المتطورة وإنترنت الأشياء (Internet of Things):
⁃ Edge Computing:
⁃ الوصف : التقنيات التي تجعل الحساب وتخزين البيانات أقرب إلى الموقع الذي تحتاج إليه.
⁃ IoT Platforms:
⁃ الوصف : مثل AWS تقنيات عمليات ، Azure تقنيات عمليات المحور ، وتقدم قدرات لإدارة وتأمين أجهزة تقنيات عمليات والبيانات.
1 ⁃ تطوير الواجهة الأمامية:
⁃ React.js:
⁃ الوصف : معروف بهندسته المعمارية القائمة على المكونات ودعم المجتمع القوي.
⁃ Vue.js:
⁃ الوصف : تقدر ببساطتها ومرونتها في بناء واجهات المستخدم.
⁃ Angular:
⁃ الوصف : لا تزال تستخدم على نطاق واسع ، وخاصة في تطبيقات المؤسسة.
2 ⁃ تطوير الواجهة الخلفية :
⁃ Node.js:
⁃ الوصف : شعبية لبناء تطبيقات شبكة قابلة للتطوير وسريعة باستخدام جافا سكريبت.
⁃ Django:
⁃ الوصف : يفضل لقدرات التطوير السريع وميزات الأمان القوية.
⁃ Spring Boot:
⁃ الوصف : تستخدم على نطاق واسع في التطبيقات المستندة إلى جافا لسهولة الاستخدام وقدرات التكامل.
3 ⁃ تطوير المحمول :
⁃ Flutter:
⁃ الوصف : معروف ببناء تطبيقات مجمعة أصلا للجوال والويب وسطح المكتب من قاعدة بيانات واحدة.
⁃ React Native :
⁃ الوصف : لا تزال شعبية لبناء تطبيقات عبر منصة With mother's abilities .
4 ⁃ الحوسبة السحابية و DevOps :
⁃ الوصف : AWS (خدمات أمازون ويب),Azure ، Google Cloud:
مقدمو الخدمات السحابية الرائدون الذين يقدمون خدمات واسعة النطاق للحوسبة والتخزين والشبكات.
⁃ Docker and Kubernetes:
⁃ الوصف : ضروري للحاويات وتزامن التطبيقات في بيئة سحابية أصلية.
⁃ Terraform:
⁃ الوصف : البنية التحتية كأداة رمز لإدارة وتوفير البنية التحتية السحابية.
5 ⁃ علم البيانات والتعلم الآلي :
⁃ Python:
⁃ الوصف : اللغة السائدة لعلوم البيانات والتعلم الآلي ، مع المكتبات مثل نومبي ، الباندا ، و سكيت-تعلم.
- تنسورفلو وبيتورش: الأطر الرائدة لبناء وتدريب نماذج التعلم الآلي.
⁃ Apache Spark:
⁃ الوصف : تستخدم لمعالجة البيانات الكبيرة والتحليلات.
6 ⁃ Cybersecurity:
⁃ الوصف : أدوات سيم (المعلومات الأمنية وإدارة الأحداث): مثل سبلونك و إلك ستاك ، حاسمة لرصد وإدارة الحوادث الأمنية.
⁃ Zero Trust Architecture:
⁃ الوصف : نموذج أمان يلغي فكرة الثقة بناء على موقع الشبكة.
7⁃ بلوكتشين والعملات المشفرة :
⁃ Ethereum:
⁃ الوصف : منصة بلوكتشين تدعم العقود الذكية والتطبيقات اللامركزية.
⁃ Hyperledger Fabric:
⁃ الوصف : إطار عمل لتطوير التطبيقات المسموح بها والقائمة على بلوكتشين.
8 ⁃ الذكاء الاصطناعي ومعالجة اللغة الطبيعية:
⁃ GPT (Generative Pre-trained Transformer) Models:
⁃ الوصف : مثل GPT-4 ، وتستخدم لمختلف المهام فهم اللغة الطبيعية.
⁃ Computer Vision:
⁃ الوصف : مثل أوبينكف لمهام معالجة الصور والفيديو.
9. الحوسبة المتطورة وإنترنت الأشياء (Internet of Things):
⁃ Edge Computing:
⁃ الوصف : التقنيات التي تجعل الحساب وتخزين البيانات أقرب إلى الموقع الذي تحتاج إليه.
⁃ IoT Platforms:
⁃ الوصف : مثل AWS تقنيات عمليات ، Azure تقنيات عمليات المحور ، وتقدم قدرات لإدارة وتأمين أجهزة تقنيات عمليات والبيانات.
نبذه قصيره
ماهو محرك Godot ؟
محرك Godot هو محرك تطوير ألعاب مفتوح المصدر يتيح للمطورين إنشاء ألعاب ثنائية وثلاثية الأبعاد. يتميز Godot بواجهة مرنة وسهلة الاستخدام، ويدعم العديد من اللغات البرمجية مثل GDScript (اللغة الخاصة بالمحرك)، وC#، وVisualScript. يوفر Godot مجموعة واسعة من الأدوات والميزات، بما في ذلك نظام مشاهد مرن، محرر مدمج، ودعماً للأجهزة المتعددة. يتميز أيضًا بالقدرة على تصدير الألعاب إلى منصات متعددة مثل Windows وmacOS وLinux وiOS وAndroid.
ماهو محرك Godot ؟
محرك Godot هو محرك تطوير ألعاب مفتوح المصدر يتيح للمطورين إنشاء ألعاب ثنائية وثلاثية الأبعاد. يتميز Godot بواجهة مرنة وسهلة الاستخدام، ويدعم العديد من اللغات البرمجية مثل GDScript (اللغة الخاصة بالمحرك)، وC#، وVisualScript. يوفر Godot مجموعة واسعة من الأدوات والميزات، بما في ذلك نظام مشاهد مرن، محرر مدمج، ودعماً للأجهزة المتعددة. يتميز أيضًا بالقدرة على تصدير الألعاب إلى منصات متعددة مثل Windows وmacOS وLinux وiOS وAndroid.
قبل أن لا ندخل في أقسام يجب معرفة ماهو مفهوم تقنية الـcallable وقابلية الاستدعاء في محرك Godot
مفهوم قابلية الاستدعاء-Callable في لغة GDScript وكيفية التعامل واستخدام الدوال بطرق متقدمة تُسهِّل عليك اختصار وتنظيم أكوادك بشكل سلس وتمنح منظورًا جديدًا في التعامل مع الدوال.
على سبيل المثال هل فكرت أن تخزن دالة معينة داخل متغير معين ؟
ثم تستخدم هذا المتغير لتمرره او ترسله لمكان آخر وتستدعي الدالة عن طريق هذا المتغير ؟
قد يكون الكلام غامضًا قليلًا لكن موضوعنا سيكون عن قابلية الاستدعاء وهو الذي يُساعد في هذه الأمور.
عناصر
ما هو الـ Callable
استدعاء الدالة من خلال الـ Callable
تمرير دالة داخل دالة أخرى
توضيح فكرة استخدام
- ما هو الـ Callable
قابلية الاستدعاء-Callable في لغة GDScript هو صنف مدمج (Built-in class) يمثل نوعًا خاصًا من البيانات، ويستخدم لتمثيل الدوال ككائنات. بمعنى أن قابلية الاستدعاء يمكن تمثيل الدوال و استدعائها واستخدامها بشكل مماثل لكيفية تعاملك مع البيانات والمتغيرات الأخرى في اللغة.
عندما أقول أن قابلية الاستدعاء هو نوع بيانات خاص بالدوال، فأنا أعني أنه بإمكانك استخدامه كنوع للمتغيرات لتخزين الدوال داخلها. بمعنى انه يمكنك ان تنشيء كائن من نوع Callable لتخزين الدوال بداخله ونتعامل مع الدالة من خلال هذا الكائن.
مثال
func sum(x, y):
return x + y
var f: Callable = sum
# or var f = Callable(self, "sum")
لاحظ هنا قمت بتعريف دالة الجمع sum التي تقوم بجمع قيمتين وإرجاع الناتج، ومن ثم عرفت كائن f من نوع Callable وتم تعيينه ليكون مساويًا للدالة الجمع، بعد هذه الخطوة، أصبح بإمكانك استخدام الكائن f لاستدعاء الدالة الجمع.
قد تظن الآن أن f أصبحت دالة مماثلة لدالة الجمع وتستطيع أن تستدعيها هكذا f(1, 2) مثل ما تستدعي دالة الجمع هكذا sum(1, 2) بشكل مباشر.
var f : Callable = sum
var result = f(1, 2) # Error!!
print(result)
لكن في حقيقة الأمر، هذا ليس صحيحًا. تذكر أنني قلت أن f في الواقع تكون كائنًا من نوع الصنف “قابل الاستدعاء” وليست دالة بحد ذاتها، لذا لا يمكننا معاملتها كدالة بشكل مباشر، بل نعاملها ككائن يحتفظ أو مرتبط بالدالة.
وهذا هو سبب الخطأ الذي ظهر في الكود عند محاولة استخدام f بهذا الشكل f(1, 2).
لكن في حقيقة الأمر، هذا ليس صحيحًا. تذكر أنني قلت أن f في الواقع تكون كائنًا من نوع الصنف “قابل الاستدعاء” وليست دالة بحد ذاتها، لذا لا يمكننا معاملتها كدالة بشكل مباشر، بل نعاملها ككائن يحتفظ أو مرتبط بالدالة.
وهذا هو سبب الخطأ الذي ظهر في الكود عند محاولة استخدام f بهذا الشكل f(1, 2).
استدعاء الدالة من خلال الـ Callable
تذكر في مقالة الاصناف ومقالة الـ class_name قلت أن كل كائن يحتوي بداخله على دوال وخواص خاصة بالصنف بالتالي لو كان لديك كائن من نوع “قابل للاستدعاء” لنسميهobj وأسندت له دالة الجمع،الكائن obj لديه الآن بداخله خواص ودوال خاصة بالصنف “قابل للاستدعاء” من ضمن تلك الدوال دالة تدعى call أي استدعاء.
الآن لكي أقوم باستدعاء دالة الجمع المتواجدة داخل obj سأستخدم هذه الدالة call
var obj : Callable = sum
var result = obj.call(1, 2)
print(result) # 3
هنا عندما استدعي obj.call(1, 2) فكأنني استدعى sum(1, 2)
تمرير دالة داخل دالة أخرى
من خلال استخدام قابلية الاستدعاء، يُمكنك الآن تمرير الدوال داخل دوال أخرى واستدعائها بسهولة.
func receive(obj : Callable):
var result = obj.call(10, 5)
print(result)
receive(sum) # 15
ستلاحظ أن دالة الاستقبال receive التى أنشأناها تستقبل المعامل obj الذي هو كائن من نوع callable، ثم تستدعيه وتعطيه قيم 5 و 10.
الآن، باستخدام هذه الدالة يمكنك إرسال دالة الجمع دون استدعاؤها، بهذا الشكل receive(sum) أرسلت فقط الدالة. ما الذي تتوقعه أنت أن يحدث الآن ؟ أريدك أن تتبع الدالة وترى.
عند تمرير الدالة الجمع داخل الدالة الاستقبال سيتم تخزين الدالة الجمع في المعامل obj الذي هو من نوع “قابل الاستدعاء”.
الآن أصبح لدينا كائن يدعى obj كمعامل داخل دالة الاستقبال يمثل دالة الجمع. هذا يعني أنك تستطيع تمرير دالة داخل دالة أخرى تمامًا كما ترسل المتغيرات داخل الدوال الأخرى.
داخل دالة الاستقبال لكي تستدعي sum عن طريق الكائن obj استخدم obj.call() وهكذا سيتم استدعاء الدالة التي يمثلها الكائن obj. عند استدعائها، يتوجب عليك أيضًا تزويدها بالقيم التى تحتاجها دالة الجمع.
فكما هو ملاحظ أن obj.call() هنا تحتاج لقيمتين، وذلك لأن دالة الجمع كانت تستقبل قيمتين عند استدعائها، لذا أرسلنا لـ obj.call() القيمتين x و y هكذا obj.call(5, 10).
مفهوم قابلية الاستدعاء-Callable في لغة GDScript وكيفية التعامل واستخدام الدوال بطرق متقدمة تُسهِّل عليك اختصار وتنظيم أكوادك بشكل سلس وتمنح منظورًا جديدًا في التعامل مع الدوال.
على سبيل المثال هل فكرت أن تخزن دالة معينة داخل متغير معين ؟
ثم تستخدم هذا المتغير لتمرره او ترسله لمكان آخر وتستدعي الدالة عن طريق هذا المتغير ؟
قد يكون الكلام غامضًا قليلًا لكن موضوعنا سيكون عن قابلية الاستدعاء وهو الذي يُساعد في هذه الأمور.
عناصر
ما هو الـ Callable
استدعاء الدالة من خلال الـ Callable
تمرير دالة داخل دالة أخرى
توضيح فكرة استخدام
- ما هو الـ Callable
قابلية الاستدعاء-Callable في لغة GDScript هو صنف مدمج (Built-in class) يمثل نوعًا خاصًا من البيانات، ويستخدم لتمثيل الدوال ككائنات. بمعنى أن قابلية الاستدعاء يمكن تمثيل الدوال و استدعائها واستخدامها بشكل مماثل لكيفية تعاملك مع البيانات والمتغيرات الأخرى في اللغة.
عندما أقول أن قابلية الاستدعاء هو نوع بيانات خاص بالدوال، فأنا أعني أنه بإمكانك استخدامه كنوع للمتغيرات لتخزين الدوال داخلها. بمعنى انه يمكنك ان تنشيء كائن من نوع Callable لتخزين الدوال بداخله ونتعامل مع الدالة من خلال هذا الكائن.
مثال
func sum(x, y):
return x + y
var f: Callable = sum
# or var f = Callable(self, "sum")
لاحظ هنا قمت بتعريف دالة الجمع sum التي تقوم بجمع قيمتين وإرجاع الناتج، ومن ثم عرفت كائن f من نوع Callable وتم تعيينه ليكون مساويًا للدالة الجمع، بعد هذه الخطوة، أصبح بإمكانك استخدام الكائن f لاستدعاء الدالة الجمع.
قد تظن الآن أن f أصبحت دالة مماثلة لدالة الجمع وتستطيع أن تستدعيها هكذا f(1, 2) مثل ما تستدعي دالة الجمع هكذا sum(1, 2) بشكل مباشر.
var f : Callable = sum
var result = f(1, 2) # Error!!
print(result)
لكن في حقيقة الأمر، هذا ليس صحيحًا. تذكر أنني قلت أن f في الواقع تكون كائنًا من نوع الصنف “قابل الاستدعاء” وليست دالة بحد ذاتها، لذا لا يمكننا معاملتها كدالة بشكل مباشر، بل نعاملها ككائن يحتفظ أو مرتبط بالدالة.
وهذا هو سبب الخطأ الذي ظهر في الكود عند محاولة استخدام f بهذا الشكل f(1, 2).
لكن في حقيقة الأمر، هذا ليس صحيحًا. تذكر أنني قلت أن f في الواقع تكون كائنًا من نوع الصنف “قابل الاستدعاء” وليست دالة بحد ذاتها، لذا لا يمكننا معاملتها كدالة بشكل مباشر، بل نعاملها ككائن يحتفظ أو مرتبط بالدالة.
وهذا هو سبب الخطأ الذي ظهر في الكود عند محاولة استخدام f بهذا الشكل f(1, 2).
استدعاء الدالة من خلال الـ Callable
تذكر في مقالة الاصناف ومقالة الـ class_name قلت أن كل كائن يحتوي بداخله على دوال وخواص خاصة بالصنف بالتالي لو كان لديك كائن من نوع “قابل للاستدعاء” لنسميهobj وأسندت له دالة الجمع،الكائن obj لديه الآن بداخله خواص ودوال خاصة بالصنف “قابل للاستدعاء” من ضمن تلك الدوال دالة تدعى call أي استدعاء.
الآن لكي أقوم باستدعاء دالة الجمع المتواجدة داخل obj سأستخدم هذه الدالة call
var obj : Callable = sum
var result = obj.call(1, 2)
print(result) # 3
هنا عندما استدعي obj.call(1, 2) فكأنني استدعى sum(1, 2)
تمرير دالة داخل دالة أخرى
من خلال استخدام قابلية الاستدعاء، يُمكنك الآن تمرير الدوال داخل دوال أخرى واستدعائها بسهولة.
func receive(obj : Callable):
var result = obj.call(10, 5)
print(result)
receive(sum) # 15
ستلاحظ أن دالة الاستقبال receive التى أنشأناها تستقبل المعامل obj الذي هو كائن من نوع callable، ثم تستدعيه وتعطيه قيم 5 و 10.
الآن، باستخدام هذه الدالة يمكنك إرسال دالة الجمع دون استدعاؤها، بهذا الشكل receive(sum) أرسلت فقط الدالة. ما الذي تتوقعه أنت أن يحدث الآن ؟ أريدك أن تتبع الدالة وترى.
عند تمرير الدالة الجمع داخل الدالة الاستقبال سيتم تخزين الدالة الجمع في المعامل obj الذي هو من نوع “قابل الاستدعاء”.
الآن أصبح لدينا كائن يدعى obj كمعامل داخل دالة الاستقبال يمثل دالة الجمع. هذا يعني أنك تستطيع تمرير دالة داخل دالة أخرى تمامًا كما ترسل المتغيرات داخل الدوال الأخرى.
داخل دالة الاستقبال لكي تستدعي sum عن طريق الكائن obj استخدم obj.call() وهكذا سيتم استدعاء الدالة التي يمثلها الكائن obj. عند استدعائها، يتوجب عليك أيضًا تزويدها بالقيم التى تحتاجها دالة الجمع.
فكما هو ملاحظ أن obj.call() هنا تحتاج لقيمتين، وذلك لأن دالة الجمع كانت تستقبل قيمتين عند استدعائها، لذا أرسلنا لـ obj.call() القيمتين x و y هكذا obj.call(5, 10).
وبهذا الشكل، أمكنَك استخدام واستدعاء دالة الجمع من خلال obj.call()، ثم تم استقبال الناتج في متغير النتيجة result والذي هو ناتج جمع القيمتين 15، هكذا var result = obj.call(5, 10) وأخيرًا تم طباعة النتيجة باستخدام print(result).
لاحظ كيف بسهولة استطعت أن تمرر دالة داخل دالة بفضل قابلية الاستدعاء.
من خلال المثال، يتضح لك الآن أنك لديك نوع بيانات يمثل الدوال ويُدعى قابلية الاستدعاء-Callable وتستطيع استخدامه لتمرير الدوال داخل دوال أخرى واستدعائها في أي وقت داخل تلك الدالة. هذا الأمر سيساعدك في حل المشاكل بشكل جديد وبافكار سلسة ويساهم في تنظيم الأكواد وجعلها أكثر قابلية لإعادة الاستخدام.
توضيح فكرة استخدام
في هذا الجزء، أطبق مثالًا أخيرًا لكي تفهم فكرة قابلية الاستدعاء بشكل نهائي.
func sum(x, y):
return x + y
func applyOperation(x, y, obj: Callable):
var result = obj.call(x, y)
return result
هنا توجد دالة applyOperation(x, y, obj) التي تستقبل القيم x ,y التي ستُرسل للمعامل obj الذي سيستدعى call ويرسل تلك القيم ثم ترجع الناتج ببساطة.
المثال بسيط لكن كيف ستستفيد من هذا ؟
var result = applyOperation(5, 10, sum)
print(result) # return 15
لاحظ انني ارسلت sum لدالة تنفيذ الإجراء-applyOperation ليستقبلها المعامل obj الذي يمثل كائن من صنف “قابل للاستدعاء” كما تعرف.
ثم داخل دالة applyOperation ستجد var result = obj.call(x, y) الكائن obj الآن يمثل دالة الجمع التي أرسلتها ودالة الجمع كانت تستقبل قيمتين لذا obj.call أصبحت كذلك.
هنا الكائن obj كما فهمت سيمثل كائن يحتفظ بالدالة الأصلية التي أُسندت لها وهي دالة الجمع sum،
و يجب أن تدرك أن الكائن obj يمثل أي دالة ترسلها، فالأمر لا يختصر على الجمع.
بمعنى أنني أستطيع الآن استخدام أكثر من دالة كـ “قابل للاستدعاء”، كيف ذلك ؟ ركز معي هنا جيدًا.
لنفترض أن لدينا دوالًا إضافية بجانب دالة الجمع.
func sum(x, y):
return x + y
func sub(x, y):
return x - y
func mul(x, y):
return x * y
func div(x, y):
return x / y
هنا لدي مجموعة من الدوال، والآن يمكنني أن أستخدم أي منها كـ قابلية استدعاء دالة تنفيذ الإجراء.
func applyOperation(x, y, obj):
var result = obj.call(x, y) # استدعاء الدالة التي مررتها
return result
# يمكنك الآن استدعاء دالة تنفيذ الإجراء مع تمرير دوال قابلية الاستدعاء متنوعة :
applyOperation(5, 10, sum); # 15
applyOperation(5, 10, sub); # -5
applyOperation(5, 10, mul); # 50
applyOperation(5, 10, div); # 0.5
هنا أُرسل دوالًا مختلفة قابلة للاستدعاء داخل دالة تنفيذ الأجراء في كل مرة.
ستجد أن دالة تنفيذ الاجراء تستقبل دوال قابلة للاستدعاء متنوعة بسهولة، وتُمثل الدوال المرسلة وتُستدعى بنفس الطريقة. يمكِنك الآن استخدام مجموعة متنوعة من الدوال بشكل قابل لاستدعاءها داخل دالة تنفيذ الإجراء والحصول على ناتج متنوعة بحسب وظيفة الدالة المرسلة بسهولة.
لاحظ كيف بسهولة استطعت أن تمرر دالة داخل دالة بفضل قابلية الاستدعاء.
من خلال المثال، يتضح لك الآن أنك لديك نوع بيانات يمثل الدوال ويُدعى قابلية الاستدعاء-Callable وتستطيع استخدامه لتمرير الدوال داخل دوال أخرى واستدعائها في أي وقت داخل تلك الدالة. هذا الأمر سيساعدك في حل المشاكل بشكل جديد وبافكار سلسة ويساهم في تنظيم الأكواد وجعلها أكثر قابلية لإعادة الاستخدام.
توضيح فكرة استخدام
في هذا الجزء، أطبق مثالًا أخيرًا لكي تفهم فكرة قابلية الاستدعاء بشكل نهائي.
func sum(x, y):
return x + y
func applyOperation(x, y, obj: Callable):
var result = obj.call(x, y)
return result
هنا توجد دالة applyOperation(x, y, obj) التي تستقبل القيم x ,y التي ستُرسل للمعامل obj الذي سيستدعى call ويرسل تلك القيم ثم ترجع الناتج ببساطة.
المثال بسيط لكن كيف ستستفيد من هذا ؟
var result = applyOperation(5, 10, sum)
print(result) # return 15
لاحظ انني ارسلت sum لدالة تنفيذ الإجراء-applyOperation ليستقبلها المعامل obj الذي يمثل كائن من صنف “قابل للاستدعاء” كما تعرف.
ثم داخل دالة applyOperation ستجد var result = obj.call(x, y) الكائن obj الآن يمثل دالة الجمع التي أرسلتها ودالة الجمع كانت تستقبل قيمتين لذا obj.call أصبحت كذلك.
هنا الكائن obj كما فهمت سيمثل كائن يحتفظ بالدالة الأصلية التي أُسندت لها وهي دالة الجمع sum،
و يجب أن تدرك أن الكائن obj يمثل أي دالة ترسلها، فالأمر لا يختصر على الجمع.
بمعنى أنني أستطيع الآن استخدام أكثر من دالة كـ “قابل للاستدعاء”، كيف ذلك ؟ ركز معي هنا جيدًا.
لنفترض أن لدينا دوالًا إضافية بجانب دالة الجمع.
func sum(x, y):
return x + y
func sub(x, y):
return x - y
func mul(x, y):
return x * y
func div(x, y):
return x / y
هنا لدي مجموعة من الدوال، والآن يمكنني أن أستخدم أي منها كـ قابلية استدعاء دالة تنفيذ الإجراء.
func applyOperation(x, y, obj):
var result = obj.call(x, y) # استدعاء الدالة التي مررتها
return result
# يمكنك الآن استدعاء دالة تنفيذ الإجراء مع تمرير دوال قابلية الاستدعاء متنوعة :
applyOperation(5, 10, sum); # 15
applyOperation(5, 10, sub); # -5
applyOperation(5, 10, mul); # 50
applyOperation(5, 10, div); # 0.5
هنا أُرسل دوالًا مختلفة قابلة للاستدعاء داخل دالة تنفيذ الأجراء في كل مرة.
ستجد أن دالة تنفيذ الاجراء تستقبل دوال قابلة للاستدعاء متنوعة بسهولة، وتُمثل الدوال المرسلة وتُستدعى بنفس الطريقة. يمكِنك الآن استخدام مجموعة متنوعة من الدوال بشكل قابل لاستدعاءها داخل دالة تنفيذ الإجراء والحصول على ناتج متنوعة بحسب وظيفة الدالة المرسلة بسهولة.
" اللهم كما سيّرت الجبال سيّر لي رزقي ونصيبي وأكرمني بكرمك وأعطني ما أتمنى."
يمكنك استخدام المواقع التالية للحصول على كتب مجانية:
1. Project Gutenberg: يحتوي على آلاف الكتب الأدبية المجانية.
- [projectgutenberg.org](https://www.gutenberg.org)
2. Open Library: يوفر مجموعة كبيرة من الكتب التي يمكنك قراءتها أو تحميلها.
- [openlibrary.org](https://openlibrary.org)
3. Google Books: يمكنك البحث عن كتب مجانية في مكتبتهم.
- [books.google.com](https://books.google.com)
4. LibriVox: يقدم كتب صوتية مجانية من كتب عامة.
- [librivox.org](https://librivox.org)
5. Internet Archive: مكتبة تضم مجموعة متنوعة من الكتب والأفلام والموسيقى المجانية.
- [archive.org](https://archive.org)
6. ManyBooks: يحتوي على مجموعة واسعة من الكتب التي يمكنك تحميلها مجانًا.
- [manybooks.net](https://manybooks.net)
يمكنك زيارة هذه المواقع والبحث عن الكتب التي تهمك.
1. Project Gutenberg: يحتوي على آلاف الكتب الأدبية المجانية.
- [projectgutenberg.org](https://www.gutenberg.org)
2. Open Library: يوفر مجموعة كبيرة من الكتب التي يمكنك قراءتها أو تحميلها.
- [openlibrary.org](https://openlibrary.org)
3. Google Books: يمكنك البحث عن كتب مجانية في مكتبتهم.
- [books.google.com](https://books.google.com)
4. LibriVox: يقدم كتب صوتية مجانية من كتب عامة.
- [librivox.org](https://librivox.org)
5. Internet Archive: مكتبة تضم مجموعة متنوعة من الكتب والأفلام والموسيقى المجانية.
- [archive.org](https://archive.org)
6. ManyBooks: يحتوي على مجموعة واسعة من الكتب التي يمكنك تحميلها مجانًا.
- [manybooks.net](https://manybooks.net)
يمكنك زيارة هذه المواقع والبحث عن الكتب التي تهمك.
Project Gutenberg
Project Gutenberg is a library of free eBooks.
👍1
يا رب تتبدل الأحوال وتتغير الناس وتبقى أنت وحدك الحي القيوم الذي لا يتبدل ولا يتغير.. اللهم اجعل وجهتنا لك ورؤيتنا لك وسعينا إليك
يا عبدي لو علمت كيف أدبر لك أمورك، لعلمت يقينًا أني أرحم بك من أمك وأبيك، ولذاب قلبكَ محبًة لي، فقُل الحمدلله..
@yahfsh
حسابي الخاص للي بده استفسار والا سؤال يتفضل عادي
حسابي الخاص للي بده استفسار والا سؤال يتفضل عادي
👍1
"إذا إستطعت أن تُحسن حياة إنسان واحد، أو تخفف ألمًا واحدًا، أو ترشد طائرًا إلى عشه، ما ذهب عمرك سدى."
@yahfsh
@yahfsh
في لغة C++، توفر المكتبات مجموعة من الدوال والميزات التي تسهل تطوير البرامج. المكتبة القياسية لـ C++ تُعرف بـ STL (Standard Template Library) وتحتوي على العديد من المكتبات الفرعية. فيما يلي قائمة شاملة لأهم المكتبات والدوال الشائعة في C++:
### 1. مكتبة الإدخال والإخراج (iostream)
- std::cout: لطباعة القيم إلى الشاشة.
- std::cin: لقراءة القيم من المستخدم.
- std::cerr: لطباعة رسائل الخطأ.
- std::clog: لطباعة رسائل السجل.
### 2. مكتبة الرياضيات (cmath)
- std::sqrt(x): لحساب الجذر التربيعي لـx.
- std::pow(x, y): لحساب x مرفوعًا إلى القوة y.
- std::sin(x): لحساب جيب الزاوية x.
- std::cos(x): لحساب جيب تمام الزاوية x.
- std::tan(x): لحساب ظل الزاوية x.
- std::log(x): لحساب اللوغاريتم الطبيعي لـx.
- std::exp(x): لحساب e مرفوعًا إلى القوة x.
### 3. مكتبة السلاسل النصية (string)
- std::string: فئة تمثيل السلسلة النصية.
- length(): للحصول على طول السلسلة.
- substr(start, length): للحصول على جزء من السلسلة.
- find(sub): للبحث عن سلسلة فرعية.
- replace(start, length, new_sub): لاستبدال جزء من السلسلة.
### 4. مكتبة الحاويات (vector, list, map, etc.)
- std::vector: حاوية تسمح بتخزين عناصر متجانسة.
- push_back(value): لإضافة قيمة في النهاية.
- at(index): للوصول إلى عنصر في متجه.
- std::list: قائمة مزدوجة الارتباط.
- push_front(value): لإضافة عنصر إلى البداية.
- push_back(value): لإضافة عنصر إلى النهاية.
- std::map: خريطة مرتبطة (مفتاح-قيمة).
- insert(pair): لإضافة عنصر.
- find(key): للعثور على قيمة باستخدام المفتاح.
### 5. مكتبة الوقت (ctime)
- std::time(nullptr): للحصول على الوقت الحالي.
- std::difftime(t1, t2): لحساب الفرق بين زمنين.
- std::ctime(&time): لتحويل الوقت إلى سلسلة نصية.
### 6. مكتبة الملفات (fstream)
- std::ifstream: لقراءة الملفات.
- std::ofstream: لكتابة الملفات.
- std::fstream: لقراءة وكتابة الملفات.
- open(filename): لفتح ملف.
- close(): لإغلاق الملف.
### 7. مكتبة <algorithm>
- std::sort(container.begin(), container.end()): لفرز العناصر في الحاوية.
- std::reverse(container.begin(), container.end()): لعكس ترتيب العناصر.
- std::find(container.begin(), container.end(), value): للعثور على قيمة في الحاوية.
### 8. مكتبة الاستثناءات (exception)
- std::exception: الفئة الأساسية للاستثناءات.
- std::runtime_error: لاستثناءات وقت التشغيل.
- throw: لإثارة استثناء جديد.
- try/catch: للتعامل مع الاستثناءات.
### 9. مكتبة الإشارات (signal)
- std::signal: لتعيين دالة لمعاملات معينة.
### 10. مكتبة التزامن (thread)
- std::thread: لإنشاء خيوط (Threads).
- std::mutex: للتهيئة والإغلاق للوصول المتزامن.
- std::lock_guard: لإدارة قفل الملقمات.
### الدوال الخاصة
تحتوي C++ أيضًا على دوال خاصة تعتمد على القوائم، الحلقات، والشروط، مثل:
- الدوال الرياضية: (add, subtract, multiply, divide)
- الدوال المنطقية: (and, or, not)
- دوال التحكم: مثل حلقة for (for loop) وwhile loop.
### الخاتمة
تعتبر C++ لغة غنية بالدوال والمكتبات مما يجعلها شائعة بين المبرمجين في مجالات متعددة مثل تطوير البرمجيات، الألعاب، والأنظمة. إذا كان لديك أسئلة حول دوال معينة أو تستخدم مكتبات محددة، فلا تتردد في طرحها!
### 1. مكتبة الإدخال والإخراج (iostream)
- std::cout: لطباعة القيم إلى الشاشة.
- std::cin: لقراءة القيم من المستخدم.
- std::cerr: لطباعة رسائل الخطأ.
- std::clog: لطباعة رسائل السجل.
### 2. مكتبة الرياضيات (cmath)
- std::sqrt(x): لحساب الجذر التربيعي لـx.
- std::pow(x, y): لحساب x مرفوعًا إلى القوة y.
- std::sin(x): لحساب جيب الزاوية x.
- std::cos(x): لحساب جيب تمام الزاوية x.
- std::tan(x): لحساب ظل الزاوية x.
- std::log(x): لحساب اللوغاريتم الطبيعي لـx.
- std::exp(x): لحساب e مرفوعًا إلى القوة x.
### 3. مكتبة السلاسل النصية (string)
- std::string: فئة تمثيل السلسلة النصية.
- length(): للحصول على طول السلسلة.
- substr(start, length): للحصول على جزء من السلسلة.
- find(sub): للبحث عن سلسلة فرعية.
- replace(start, length, new_sub): لاستبدال جزء من السلسلة.
### 4. مكتبة الحاويات (vector, list, map, etc.)
- std::vector: حاوية تسمح بتخزين عناصر متجانسة.
- push_back(value): لإضافة قيمة في النهاية.
- at(index): للوصول إلى عنصر في متجه.
- std::list: قائمة مزدوجة الارتباط.
- push_front(value): لإضافة عنصر إلى البداية.
- push_back(value): لإضافة عنصر إلى النهاية.
- std::map: خريطة مرتبطة (مفتاح-قيمة).
- insert(pair): لإضافة عنصر.
- find(key): للعثور على قيمة باستخدام المفتاح.
### 5. مكتبة الوقت (ctime)
- std::time(nullptr): للحصول على الوقت الحالي.
- std::difftime(t1, t2): لحساب الفرق بين زمنين.
- std::ctime(&time): لتحويل الوقت إلى سلسلة نصية.
### 6. مكتبة الملفات (fstream)
- std::ifstream: لقراءة الملفات.
- std::ofstream: لكتابة الملفات.
- std::fstream: لقراءة وكتابة الملفات.
- open(filename): لفتح ملف.
- close(): لإغلاق الملف.
### 7. مكتبة <algorithm>
- std::sort(container.begin(), container.end()): لفرز العناصر في الحاوية.
- std::reverse(container.begin(), container.end()): لعكس ترتيب العناصر.
- std::find(container.begin(), container.end(), value): للعثور على قيمة في الحاوية.
### 8. مكتبة الاستثناءات (exception)
- std::exception: الفئة الأساسية للاستثناءات.
- std::runtime_error: لاستثناءات وقت التشغيل.
- throw: لإثارة استثناء جديد.
- try/catch: للتعامل مع الاستثناءات.
### 9. مكتبة الإشارات (signal)
- std::signal: لتعيين دالة لمعاملات معينة.
### 10. مكتبة التزامن (thread)
- std::thread: لإنشاء خيوط (Threads).
- std::mutex: للتهيئة والإغلاق للوصول المتزامن.
- std::lock_guard: لإدارة قفل الملقمات.
### الدوال الخاصة
تحتوي C++ أيضًا على دوال خاصة تعتمد على القوائم، الحلقات، والشروط، مثل:
- الدوال الرياضية: (add, subtract, multiply, divide)
- الدوال المنطقية: (and, or, not)
- دوال التحكم: مثل حلقة for (for loop) وwhile loop.
### الخاتمة
تعتبر C++ لغة غنية بالدوال والمكتبات مما يجعلها شائعة بين المبرمجين في مجالات متعددة مثل تطوير البرمجيات، الألعاب، والأنظمة. إذا كان لديك أسئلة حول دوال معينة أو تستخدم مكتبات محددة، فلا تتردد في طرحها!
قواعد البيانات العلائقية (Relational Databases) هي أنظمة تُستخدم لتخزين المعلومات بشكل منظم بحيث يمكن الوصول إليها بسهولة. تعتمد هذه القواعد على نموذج البيانات العلائقية الذي يتضمن استخدام الجداول (Tables) لتخزين البيانات. إليك شرحًا كاملاً لقواعد البيانات العلائقية الحديثة:
### 1. ما هي قواعد البيانات العلائقية؟
قواعد البيانات العلائقية تُخزّن البيانات في جداول، حيث يتكوّن كل جدول من صفوف (Rows) وأعمدة (Columns). يحتوي كل صف على سجل محدد، بينما يصف كل عمود خاصية معينة من البيانات.
### 2. المبادئ الأساسية:
- المفاتيح الأساسية (Primary Keys): كل جدول يحتوي على مفتاح أساسي يميز كل سجل داخل الجدول بشكل فريد.
- المفاتيح الأجنبية (Foreign Keys): تُستخدم لربط الجداول ببعضها من خلال الإشارة إلى المفاتيح الأساسية في جداول أخرى.
- التطبيع (Normalization): هو عملية تنظيم البيانات في قواعد البيانات للتقليل من التكرار وتحسين الكفاءة.
### 3. الخصائص الرئيسية لقواعد البيانات العلائقية:
- الهيكلية: تعتمد على هيكل ثابت وجداول مع تعريفات مسبقة لكل عمود.
- الاستعلامات: تُستخدم لغة SQL (Structured Query Language) للاستعلام عن البيانات وإدراجها وتعديلها وحذفها.
- ACID: تُلتزم قواعد البيانات العلائقية بمعايير ACID (Atomicity, Consistency, Isolation, Durability) لضمان سلامة المعاملات.
### 4. قواعد بيانات علائقية حديثة:
- MySQL: واحدة من أكثر قواعد البيانات شعبية، مفتوحة المصدر، وتستخدم في مجموعة واسعة من التطبيقات.
- PostgreSQL: قاعدة بيانات قوية ومفتوحة المصدر تدعم أنواع بيانات متقدمة، مثل JSON، البرمجة الشيئية، والـ GIS.
- Microsoft SQL Server: نظام قواعد بيانات تجاري يوفر العديد من الميزات المتقدمة للأعمال، بما في ذلك أدوات التحليل والتقارير.
- Oracle Database: قاعدة بيانات تجارية معروفة بأدائها العالي ودعمها للعمليات المعقدة.
- MariaDB: مشروعة مفتوحة المصدر مشتقة من MySQL، يهدف لتكون قاعدة بيانات قوية وموثوقة.
### 5. فوائد استخدام قواعد البيانات العلائقية:
- سهولة الاستخدام: قواعد البيانات العلائقية وشائعة الاستخدام بفضل قدرتها على تنظيم البيانات بسهولة.
- دعم المعاملات: توفر التعاملات والمعالجة الآمنة للبيانات بفضل خصائص ACID.
- استعلامات معقدة: تتيح إجراء استعلامات معقدة للغاية باستخدام SQL.
- الأمان: توفر ميزات أمان متقدمة مثل التحكم في الوصول ومستويات الأمان المتعددة.
### 6. الحالات العملية لاستخدام قواعد البيانات العلائقية:
- تطبيقات الويب: تستخدم على نطاق واسع في تطوير تطبيقات الويب مثل أنظمة إدارة المحتوى (CMS) والمتاجر الإلكترونية.
- تحليل البيانات: تستخدم لتحليل البيانات والتقارير، حيث يمكن تخزين كميات كبيرة من البيانات وتحليلها بفعالية.
- أنظمة إدارة الأعمال: تُستخدم في تخزين بيانات العمل، مثل بيانات الموظفين، المخزون، والمعاملات المالية.
### 7. التوجهات الحديثة في قواعد البيانات العلائقية:
- التكامل مع الخدمات السحابية: تزايد استخدام قواعد البيانات العلائقية في بيئات السحاب، مما يمنح المرونة والتوسع.
- البيانات الكبيرة (Big Data): بعض قواعد البيانات العلائقية تدعم قواعد البيانات الضخمة وتقديم الأداء العالي للتعامل مع كميات كبيرة من البيانات.
- دعم المتطلبات العليا: تحسين الأداء من خلال التقنيات مثل التخزين المباشر وأداء قرص الصلب.
### 8. التحديات:
- Scalability: التوسع في قواعد البيانات العلائقية يمكن أن يكون تحديًا إذا تجاوزت أحجام البيانات حد معين.
- التعقيد: في بعض الأحيان، يمكن أن تصبح التصميمات المعقدة مرهقة وتتطلب إدارة دقيقة.
إذا كان لديك أي استفسارات إضافية حول قواعد البيانات العلائقية أو تريد تفاصيل معينة، فلا تتردد في طرحها!
### 1. ما هي قواعد البيانات العلائقية؟
قواعد البيانات العلائقية تُخزّن البيانات في جداول، حيث يتكوّن كل جدول من صفوف (Rows) وأعمدة (Columns). يحتوي كل صف على سجل محدد، بينما يصف كل عمود خاصية معينة من البيانات.
### 2. المبادئ الأساسية:
- المفاتيح الأساسية (Primary Keys): كل جدول يحتوي على مفتاح أساسي يميز كل سجل داخل الجدول بشكل فريد.
- المفاتيح الأجنبية (Foreign Keys): تُستخدم لربط الجداول ببعضها من خلال الإشارة إلى المفاتيح الأساسية في جداول أخرى.
- التطبيع (Normalization): هو عملية تنظيم البيانات في قواعد البيانات للتقليل من التكرار وتحسين الكفاءة.
### 3. الخصائص الرئيسية لقواعد البيانات العلائقية:
- الهيكلية: تعتمد على هيكل ثابت وجداول مع تعريفات مسبقة لكل عمود.
- الاستعلامات: تُستخدم لغة SQL (Structured Query Language) للاستعلام عن البيانات وإدراجها وتعديلها وحذفها.
- ACID: تُلتزم قواعد البيانات العلائقية بمعايير ACID (Atomicity, Consistency, Isolation, Durability) لضمان سلامة المعاملات.
### 4. قواعد بيانات علائقية حديثة:
- MySQL: واحدة من أكثر قواعد البيانات شعبية، مفتوحة المصدر، وتستخدم في مجموعة واسعة من التطبيقات.
- PostgreSQL: قاعدة بيانات قوية ومفتوحة المصدر تدعم أنواع بيانات متقدمة، مثل JSON، البرمجة الشيئية، والـ GIS.
- Microsoft SQL Server: نظام قواعد بيانات تجاري يوفر العديد من الميزات المتقدمة للأعمال، بما في ذلك أدوات التحليل والتقارير.
- Oracle Database: قاعدة بيانات تجارية معروفة بأدائها العالي ودعمها للعمليات المعقدة.
- MariaDB: مشروعة مفتوحة المصدر مشتقة من MySQL، يهدف لتكون قاعدة بيانات قوية وموثوقة.
### 5. فوائد استخدام قواعد البيانات العلائقية:
- سهولة الاستخدام: قواعد البيانات العلائقية وشائعة الاستخدام بفضل قدرتها على تنظيم البيانات بسهولة.
- دعم المعاملات: توفر التعاملات والمعالجة الآمنة للبيانات بفضل خصائص ACID.
- استعلامات معقدة: تتيح إجراء استعلامات معقدة للغاية باستخدام SQL.
- الأمان: توفر ميزات أمان متقدمة مثل التحكم في الوصول ومستويات الأمان المتعددة.
### 6. الحالات العملية لاستخدام قواعد البيانات العلائقية:
- تطبيقات الويب: تستخدم على نطاق واسع في تطوير تطبيقات الويب مثل أنظمة إدارة المحتوى (CMS) والمتاجر الإلكترونية.
- تحليل البيانات: تستخدم لتحليل البيانات والتقارير، حيث يمكن تخزين كميات كبيرة من البيانات وتحليلها بفعالية.
- أنظمة إدارة الأعمال: تُستخدم في تخزين بيانات العمل، مثل بيانات الموظفين، المخزون، والمعاملات المالية.
### 7. التوجهات الحديثة في قواعد البيانات العلائقية:
- التكامل مع الخدمات السحابية: تزايد استخدام قواعد البيانات العلائقية في بيئات السحاب، مما يمنح المرونة والتوسع.
- البيانات الكبيرة (Big Data): بعض قواعد البيانات العلائقية تدعم قواعد البيانات الضخمة وتقديم الأداء العالي للتعامل مع كميات كبيرة من البيانات.
- دعم المتطلبات العليا: تحسين الأداء من خلال التقنيات مثل التخزين المباشر وأداء قرص الصلب.
### 8. التحديات:
- Scalability: التوسع في قواعد البيانات العلائقية يمكن أن يكون تحديًا إذا تجاوزت أحجام البيانات حد معين.
- التعقيد: في بعض الأحيان، يمكن أن تصبح التصميمات المعقدة مرهقة وتتطلب إدارة دقيقة.
إذا كان لديك أي استفسارات إضافية حول قواعد البيانات العلائقية أو تريد تفاصيل معينة، فلا تتردد في طرحها!
👍1
قواعد البيانات السحابية تشير إلى نماذج لتخزين البيانات وإدارتها عبر الإنترنت، بدلاً من التخزين المحلي على الخوادم الفردية. تتيح هذه الأنظمة تخزين البيانات والوصول إليها عبر شبكة الإنترنت باستخدام الموارد السحابية. إليك بعض المعلومات الأساسية عن قواعد البيانات السحابية:
### 1. تعريف قواعد البيانات السحابية:
قواعد البيانات السحابية تكون مستضافة في بيئة سحابية (مثل Amazon Web Services، Google Cloud، أو Microsoft Azure)، مما يمكن المستخدمين من الوصول إليها من أي مكان يتوفر فيه اتصال بالإنترنت.
### 2. أنواع قواعد البيانات السحابية:
- قواعد البيانات العلائقية السحابية: مثل Amazon RDS (Relational Database Service) وGoogle Cloud SQL. تستخدم لتخزين البيانات في جداول مترابطة.
- قواعد البيانات غير العلائقية (NoSQL): مثل Amazon DynamoDB وMongoDB Atlas. مناسبة للمشاريع التي تتطلب تخزين بيانات غير هيكلية أو شبه هيكلية.
### 3. المزايا:
- المرونة: يمكن تعديل الموارد بسهولة حسب الحاجة، سواء كانت زيادة أو تقليل.
- التوافر العالي: معظم مقدمي خدمات السحابة يقدمون مستوى عالٍ من التوافر باستخدام مراكز بيانات متعددة.
- التكلفة: الدفع بناءً على الاستخدام، مما قد يقلل التكاليف مقارنة بالاستثمار في البنية التحتية المحلية.
- النسخ الاحتياطي والإستعادة: أدوات النسخ الاحتياطي والإستعادة غالبًا ما تكون مدمجة، مما يوفر الأمان.
### 4. التحديات:
- الأمان: تخزين البيانات في السحابة قد يثير مخاوف حول حماية البيانات والخصوصية.
- الاعتماد على الإنترنت: الوصول إلى البيانات يعتمد بشكل كامل على الاتصال بالإنترنت.
- التوافق مع الأنظمة التقليدية: قد توجد تحديات في دمج قواعد البيانات السحابية مع الأنظمة القائمة.
### 5. التطبيقات الشائعة:
- تحليل البيانات: قواعد البيانات السحابية توفر موارد قوية لمعالجة البيانات وتحليلها.
- التخزين المرن: مثالية للمشاريع التي تحتاج إلى تخزين بيانات كبيرة ومرنة، مثل تطبيقات الهواتف الذكية ومواقع الإنترنت.
- تطوير التطبيقات: المساعدة في تطوير التطبيقات السحابية التي تتطلب بيانات في زمن الحي.
إذا كنت بحاجة لمزيد من التفاصيل أو لديك أسئلة محددة حول قواعد البيانات السحابية، فلا تتردد في طرحها!
### 1. تعريف قواعد البيانات السحابية:
قواعد البيانات السحابية تكون مستضافة في بيئة سحابية (مثل Amazon Web Services، Google Cloud، أو Microsoft Azure)، مما يمكن المستخدمين من الوصول إليها من أي مكان يتوفر فيه اتصال بالإنترنت.
### 2. أنواع قواعد البيانات السحابية:
- قواعد البيانات العلائقية السحابية: مثل Amazon RDS (Relational Database Service) وGoogle Cloud SQL. تستخدم لتخزين البيانات في جداول مترابطة.
- قواعد البيانات غير العلائقية (NoSQL): مثل Amazon DynamoDB وMongoDB Atlas. مناسبة للمشاريع التي تتطلب تخزين بيانات غير هيكلية أو شبه هيكلية.
### 3. المزايا:
- المرونة: يمكن تعديل الموارد بسهولة حسب الحاجة، سواء كانت زيادة أو تقليل.
- التوافر العالي: معظم مقدمي خدمات السحابة يقدمون مستوى عالٍ من التوافر باستخدام مراكز بيانات متعددة.
- التكلفة: الدفع بناءً على الاستخدام، مما قد يقلل التكاليف مقارنة بالاستثمار في البنية التحتية المحلية.
- النسخ الاحتياطي والإستعادة: أدوات النسخ الاحتياطي والإستعادة غالبًا ما تكون مدمجة، مما يوفر الأمان.
### 4. التحديات:
- الأمان: تخزين البيانات في السحابة قد يثير مخاوف حول حماية البيانات والخصوصية.
- الاعتماد على الإنترنت: الوصول إلى البيانات يعتمد بشكل كامل على الاتصال بالإنترنت.
- التوافق مع الأنظمة التقليدية: قد توجد تحديات في دمج قواعد البيانات السحابية مع الأنظمة القائمة.
### 5. التطبيقات الشائعة:
- تحليل البيانات: قواعد البيانات السحابية توفر موارد قوية لمعالجة البيانات وتحليلها.
- التخزين المرن: مثالية للمشاريع التي تحتاج إلى تخزين بيانات كبيرة ومرنة، مثل تطبيقات الهواتف الذكية ومواقع الإنترنت.
- تطوير التطبيقات: المساعدة في تطوير التطبيقات السحابية التي تتطلب بيانات في زمن الحي.
إذا كنت بحاجة لمزيد من التفاصيل أو لديك أسئلة محددة حول قواعد البيانات السحابية، فلا تتردد في طرحها!