Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
102 - Telegram Web
Telegram Web
السلام عليكم ورحمة الله وبركاته

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

معمارية البرمجيات ، هي قرارات التصميم المتعلقة بهيكل النظام .

ماذا يعني ذلك ، كل مافي الامر ان معمارية البرمجيات تشير الى كيفية تنظيم الأشياء اثنا بناء النظام . وهي مجرد قرارات لكنها حاسمة لانتاج المشروع .
عندما تحدد كيف سيتم تنظيم ملفات الفئات class في مشروعك فانت تحدد الان نوع من انواع معمارية البرمجيات واهم الاشياء التي نحدد معماريتها هي :
- تفاصيل التنفيذ : اي الملفات البرمجية كما ذكرنا الفئات مثلاً وتنظيم الصور والخطوط وغيرها .
- قرارات تصميم التنفيذ : في هذا الجزء نحدد هل سنجعل النظام يعمل في جانب العميل ام في جانب الخادم ، ونعني بالعميل اي هل سيكون النظام على جهاز المستخدم مثل برنامج Word او على الخادم ونوصل اليه عبر الانترنت مثل Wikipedia . وهناك نوع افضل وهو نوع (الخادم و العميل) تكون فيه نسخة الواجهة في جهاز المستخدم و المنطق في الخادم مثل Telegram .
ايضاً نحدد ما نوع قاعدة البيانات التي سنستعملها هل علائقية ام غير علائقية .
- التقنيات المختارة : نحدد ما اللغة او اطار العمل الذي سنستعمله ، ما نوع قاعدة البيانات Mysql ام Oracle .
- قرارات تصميم النظام : هنا نحدد كيف سنبني النظام هل سنبنيه مرة واحدة ككتله واحدة monolith ام سنقسمه الى خدمات اصغر microservices ونبني كل جزء بشكل منفصل .
قرارات البنية التحتية : هنا نحدد اين سيعمل النظام ، او اين سيتم استضافته هل محلياً ام في خدمة سحابية .

الكثير والكثير من الاهمية لمعمارية البرمجيات ، وهي امر حاسم ويجب دراسة وفهم النظام الذي نريد ان نبنيه بشكل جيد لكي نستطيع اتخاذ القرار المناسب ، فالمعمارية تعتبر اصعب الامور القابلة للتغير فهي غير قابلة للتغير وقد يودي تغييرها الى اعادة بناء النظام من الصفر .
لك ان تتخيل انك شارفت على الانتها من بناء نظام بسيط بلغة Java استغرق منك اسبوعين ثم اكتشفت ان Java ليست الحل الامثل ويجب عليك ان تستخدم لغة Python ، قد يسعفك Chat GPT في هذه الحالة لكن عندما يكون لديك مشروع او نظام كبير فسيرفض مساعدتك .

تعرف على المزيد في هذا المقال .
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين .

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

بالتاكيد ، حيث تكمن قوة لغة Java بقوة قواعدها فلا يمكنك ارتكاب الاخطاء بسهولة من دون ان تنتبه ، فلغة Java تتحمل المسؤولية كثيراً .
اعتقد ان مطوري لغة جافا شعرو بالغيرة من اللغات الاخرى مثل Python و php و JavaScript حيث ان انواع البيانات فيها لا يتم احترامها ، فكما نعرف اننا نستطيع اسناد اي قيمة كالتالي
<?php

$x = "Asem";
$x = 100;

وكذا في Pyhton
x = "Asem"
x = 100

الامر افضل هكذا فلا حاجة لتحديد نوع البيانات في كل مرة انشئ بها متغيراً جديداً .
لكن دعنا نحكم بالمشاعر ، ما موقفك لو كنت انت المتغير x ؟ لا احد يحترمك !!

نحن نحب Java لانها تحترم انواع المتغيرات ولكن هناك متغيرات ليست محترمة لنفسها ، لذا ظهرت في الاصدار العاشر من لغة Java الكلمة المفتاحية var ويمكن استعمالها كالاتي
public class AsemNajeeVarKeyWord {
public static void main(String[] args) {
var x = "Asem";
var y = 100;
}
}

لاحظ ان النوع var يقبل اي نوع من البيانات ، هل تعتبر قفزة نوعية ؟
لا تفرح كثيرا فاذا حاولت تغيير قيمة المتغير x في Java من "Asem" الى 100 فسيظهر لك خطا . السبب ان اللغة تحدد نوع البيانات على حسب نوع اول قيمة يتم اسنادها الى المتغير . لذا فنوع المتغير x هو String ونوع المتغير y هو int .

الفائدة من var لا تقتصر على العبث بنوع البيانات فقط ، انظر المثال التالي الذي يشرح كيف يتم التعامل مع Anonymous class
public class AsemNajeeVarKeyWord {
public static void main(String[] args) {
CanDo cd = new CanDo(){
public void doIt(){
System.out.println("I will do it .");
}
public void doItLocaly(){
System.out.println("I will do it localy .");
}
};
cd.doIt();
}
}
interface CanDo{
public void doIt();
}

انظر المثال جيداً هللا تحاول استدعاء الدالة doItLocaly() !!
لن تستطيع ولكي تستطيع ان تستدعيها فقط حول نوع الكائن cd من CanDo الى var

في النهاية ، مهما حاولت لغة Java ان تقلد بقية اللغات وتتهرب من مسؤوليتها فلن تستطيع .
Asem Najee
السلام عليكم ورحمة الله وبركاته بعد الانقطاع طوال الفترة السابقة لانشغالي بامور اخرى سنفهم اليوم ماهي معمارية البرمجيات ، موضوع لطالما كان محبوكاً ولا يمكن فهمه ببساطة ليس لصعوبته فهو امر بسيط وستعرف ذلك في الاسطر التالية من هذا المنشور . معمارية البرمجيات…
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين .

ذكرنا في منشور سابق لمحة عن معمارية البرمجيات ، وذكرنا ان تنظيم الملفات يعتبر تحديد المعمارية الخاصة بتفاصيل التنفيذ ، اليوم سنتعرف على امثلة لاشهر انماط المعماريات وهو نمط معمارية MVC (Model , View , Controller) .

في معمارية MVC نقوم بتقسيم المشروع الى ثلاث وحدات ، لكن لماذا ؟

لنعد قليلاً ولا نستخدم MVC ، اذا اخبرتك ان تبني نظاماً بسيطاً لادارة الكتب ، دعنا نبسط الامور ونجعله يحتوي على كيان واحد فقط وهو الكتاب وفيه (اسم ، اسم المؤلف ، تاريخ الاضافة الى النظام ، عدد الصفحات) .
استطيع ان اتنبأ بما ستفعله ، ستقوم بعمل فئة Book فيه بضع وظائف (functions) وهي كالاتي :
addBook(name, auther,...)
getBook(id)
getBooks()
updateBook(id, name,...)
deleteBook(id)
ستكتب في addBook شروط تحقق من المدخلات و استعلام يُدخل البيانات الى قاعدة البيانات ، وفي updateBook كذلك . اما DeleteBook فسيكون لديك استعلام حذف كتاب من قاعدة البيانات . والدالتين getBook و getBooks فيهما استعلامان لجلب بيانات الكتب .
ملاحظة : مجموعة الدوال السابقة تسمى CRUD اختصاراً ل Create Read Update Delete . وذلك لانها تقوم باضافة وجلب وتعديل وحذف البيانات من قاعدة البيانات .
سيكون لديك ايضاً واجهة تظهر للمستخدم كي يدخل بيانات الكتاب .
ستكون معمارية مشروعك كالتالي :
📁 Project
     📄 Book.php
     📄 Index.php
  
حسنا لا يوجد ابسط من ذلك . ولن اذكر لك سيناريوهات اخرى ، لكن تستطيع ان تتخيل ان يكون لديك اكثر من كيان ولنقل 20 كيان بدون مبالغة باعتبار المشاريع الحقيقية .
ان كنت قد جربت ذلك فانت لا شك انك قد غصت في وحل لا مخرج منه ، فكتابة الاستعلامات في الشفرة يصعب عملية التعديل كثيراً . وهذا لا يختص بالاستعلامات فقط وانما كتابة اكثر من لغة في مكان واحد يعتبر تطبيقاً سيئاً لخبرتك .

دعني اجعل لك الامور ابسط بقليل .
اذا استخدمنا معمارية MVC وهي تقسيم المشروع الى ثلاث طبقات وهن كالاتي:
Model : طبقة او فئة بشكل ادق نكتب فيها الاستعلامات الخاصة بقاعدة البيانات .
View : هذه الطبقة نكتب فيها اكواد الواجهة الامامية .
Controller : هنا نكتب منطق التطبيق .

اسمعك تقول "ماذا!! ، لم افهم شيئاً " .
دعني اوضح لك قليلاً ، ما رأيك الان ان نبني نفس المشروع بالطريقة الجديدة انشئ ملف باسم Controllers/BookController .
قم بانشاء ملف آخر باسم Model/Book
في النهاية ستكون معمارية مشروعك :
📁 Project
     📁 Controllers
          📄 BookController.php
     📁 Models
          📄 Book.php
📁 Views
📄 Index.php

ملف index سيكون لعرض البيانات ، لن نتطرق لبقية الصفحات مثل تعديل او اضافة كتاب .

الان في Model/Book قم بعمل دوال CRUD التي تعلمناها لكن هذه المرة ستكتب فقط الاستعلامات فمثلا في دالة addBook اجعلها تستقبل بيانات الكتاب و تخزنها مباشرة بدون اي تحقق . وكذا دالة updateBook ، deleteBook .
وفي Controllers/BookController اضف دوال CRUD زفيها اكتب اكواد التحقق من صحة البيانات فمثلاً addBook تتحقق هل اسم الكتاب اكبر من 3 احرف ، وهل عدد صفحاته اكبر من 0 ثم تقوم باستدعا الدالة التي في Model/Book لتقوم بتخزين البيانات .
ماذا ان اكنت تريد تعديل شكل الصفحة التي تعرض الكتاب ، ستذهب الى Views/ وهكذا ... .

الامر غاية التنظيم ، صحيح لكن لماذا نكثر من الفئات هكذا ، هل هذا يعتبر ذكاءً ؟ ام انها مجرد فوضى .

دعني اكمل واحكم بما شئت ، اذا اردت ان تمنع ادخال تاريخ اضافة الكتاب الى النظام من قبل المستخدم لانه بطبيعة الحال سيكون تلقائيا . ماذا ستفعل ؟
نعم بالضبط ، ستذهب الى ملف Model/Book لكي تعدل عليه لانه هو من يتعامل مع قواعد البيانات .
ماذا ان اردت ان يتم جلب كل بيانات الكتاب ماعدا عدد الصفحات ؟ سيكون من ملف ال Model/Book ايضاً .
ماذا ان اردت ان تقيد اسم الكتاب فلا يقل عن 4 احرف ، فالحل هو من Controllers/BookController  .

هل هذا كل ما في الامر؟ في الانظمة الحقيقية يوجد الكثير من السيناريوهات . يمكنك حماية كلمات المرور وتشفيرها قبل ان تخزنها و يمكنك قفل التعديل على بعض الحقول مثل حقل ال ID ، والمزيد ... ، كما ان استعمال هذه المعمارية يجعل الكود سهل الصيانة ، قابل لاعادة الاستخدام ، قابل للقراءة ، والافضل من كل هذا انه يمكن تقسيم العمل على اعضاء الفريق بسهولة .

هذه التقنية ليست مرمية على الرف بل تستعملها افضل اطر العمل منها Laravel, Express, Spring MVC .
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين .

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

دعنا نذكر عيوب عدم تسمية المتغيرات باسماء معبرة ولنعتمد على ChatGPT لكي يسرد لنا هذه العيوب :
- صعوبة فهم الكود
- تقليل قابلية الصيانة
- زيادة احتمالية الأخطاء
- تعقيد عملية التتبع والتنقيح
- عدم وضوح وظيفة المتغير
- صعوبة التعاون داخل الفريق
- تقليل وضوح المنطق البرمجي
- تأثير سلبي على جودة التوثيق
- ضعف إمكانية إعادة استخدام الكود
- إعاقة التعلم للمبرمجين الجدد


من ميزات تسمية المتغيرات ان برنامج يصبح اكثر قابلية للقراءة وهذا يجعله اسهل اثناء الصيانة ، لكن كيف يتم التعبير عن اسماء المتغيرات ؟؟
قبل ان نذكر اسماء المتغيرات يجب ان ننوه الى قواعد التسمية حيث يوجد عدة قواعد اهمها
اولاً camelCase (الجمل) : حيث في هذه القاعدة نكتب اول كلمة بحروف صغيرة ثم نكتب اول حرف من كل كلمة بحالة كبيرة ، وهذه القاعدة مشهورة في تسمية الدوال في لغة جافا . كمثال thisExampleOfVariableName
ثانياً snace_case (الافعى) وفي هذه القاعدة نكتب كل الكلمات بحروف صغيرة ولا يسمح باستخدام حروف كبيرة ونفصل بين كل كلمة وكلمة بشرطة سفلية . مثال this_example_of_variable_name
ثالثاً PascalCase في هذه القاعدة نقوم بكتابة اول حرف من كل كلمة بحالة كبيرة . مثال ThisExampleOfVariableName ، هل يمكنك ان تفرق بينه وبين camelCase ؟
رابعاً UPPER_SNAKE_CASE (الافعى الكبيرة) : في هذه الحالة يتم الكتابة بالاحرف الكبيرة ويمنع استخدام الاحرف الصغيرة ويتم فصل الكلمات بشرطة سفلية .

هل عجبت من اسماء قواعد التسمية ، هذا غريب كانهم لم يجدو اسماء معبرة لقواعدهم !!
ملاحظة : يوجد قاعدة اسمها قاعدة الكباب ويتم فصل الكلمات بشرطة وتستخدم في html .

دعونا من الاسماء الغريبة فقد شعرت بالجوع بعد اسم القاعدة الاخيرة ، ولنعد الى سؤالنا وهو كيف نسمي المتغيرات والوظائف ؟
بكل بساطة الاجابة هي ان تسمي المتغير بما يدل عليه ، مثلاً متغير يخزن قيمة درجة الطالب الاول على مستوى جامعة تعز ، كيف ستسميه هل ستسميه x ؟!!
التسمية الصحيحة هي كالاتي ، المتغير يجب ان يدل على اسم لانه ليس فعل :( .
int degreeOfBestStudentInTaizUniversity;

هل هذا صعب؟ لا تختصر اسماء المتغيرات والدوال بل اجعلها تشرح نفسها بدلاً من كتابة تعليق بجانب اسم المتغير ، الكود التالي قد يسبب فصلك من العمل ...
// degree Of Best Student In Taiz University
int x;


هذا يسمى الكود النظيف ، اما الوظائف فاجعلها تدل على فعل كالاتي
int getDegreeOfBestStudentInTaizUniversity(){
return this.degreeOfBestStudentInTaizUniversity;
}

شرح بسيط عن قواعد التسمية ، ليس كافياً ليشمل كل شيء لكن القاعدة الذهبية هي ان لا تتحايل على نفسك وتسمي المتغيرات باسماء مختصرة او لا تدل على معناها .
ملاحظة : لا تستخدم الاسماء العامة مثل data , list , ... .

سؤال جانبي : ماذا تكتب في رسائل commit عند حفظ مشروعك في نظام التحكم بالاصدارات Git ؟ هل تكتب "final project" و "final project final" ؟؟!!
git commit -m "final project plz work"
git commit -m "final project works, dont touch"
يُقسم الخالق سبحانه على امر يخشاه اي مخلوق ، الخسارة ليست ما يحب الانسان ان يحصل عليه ، فالانسان طمَّاع ويحب الفوز دائماً .
الفوز في الدنيا نتذوق لذته ودائما نسعى لكي نفوز باي شيء ، فالشعور بلذة الفوز والانتصار امر رائع ، اما الخسارة فقد تجعلنا ننعزل عن  لبضع ايام خوفا او حياءً .

فما شعور الانسان بالخسارة في الاخرة . فهي اعظم خسارة ولا عوض بعدها بل عذاب اليم لا ينتهي الى ابد الآبدين .
فاحرص على ان تكون من الفائزين واحرص على من تحب واوصهم واجعلهم يفوزون بالاخرة حتى لو اضطرك ذلك الى ان تحمل من تحب على ظهرك الى ان تموت .
{يَا أَيُّهَا الَّذِينَ آمَنُوا قُوا أَنفُسَكُمْ وَأَهْلِيكُمْ نَارًا}
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين .

من اهم المواضيع التي يجب ان يحترفها مهندس البرمجيات هو موضوع العلاقات ، فالعلاقات موجودة في كل شيء ؛ والعلاقة تعني ارتباط شيء بشيء آخر لتحقيق غاية قد تكون صداقة او زواج او الافضل علاقة مصلحة ، اما في البرمجة العلاقات انواع سنتعرف عليها في هذا المنشور .

اولاً سنتحدث على العلاقات بين الجداول في قواعد البيانات ، ثم سنتطرق الى العلاقات بين الفئات في البرمجة الكائنية .

العلاقات في جداول البيانات يمكننا تصنيفها الى ثلاثة اصناف كالتالي :
علاقة واحد الى واحد : هذه العلاقة مميزة وتحدث بين كيانين حيث يرتبط الاول بالثاني ولا يمكن ان يرتبط بغيره والعكس صحيح ، فهذه علاقة ليس فيها خيانة فاما صديقي او لا أحد .

علاقة واحد الى متعدد : هذه العلاقة تعني ارتباط الكيان باكثر من كيان ، وهذه العلاقة تستخدم كثيراً ، اي انها موجودة في كثير من الاشياء مثل علاقة الدولة بالمحافظات ، علاقة الجامعة بالكليات ، الخ ... .

علاقة متعدد الى متعدد : هذا النوع من العلاقات يعني ان يرتبط الكيان بعدة كيانات والعكس صحيح ؟_- .
كم لديك اصدقاء ؟ كثير؟ بجاش ، محمد ، عبدالله ، ... . انت لديك عديد من الاصدقاء .
كم لديه صديقك بجاش من الاصدقاء ؟ كثير ؟ انت ، وحسن ، والكثير ... . لديه غيرك الكثير .
لديك علاقة مع عدة اصدقاء ، واصدقائك لديهم عدة اصدقاء غيرك ، هذه هي العلاقة المتعدد الى متعدد .

ما سبق كان شرحاً للعلاقات بين جداول قاعدة البيانات .
والان سنتطرق للعلاقات بين فئات البرمجة الكائنية .
العلاقات هنا بين كائنات لذا فهي قريبة من علاقات البشر مع بعضهم .
ملاحظة : علاقات المهندسين ايضاً هي مثل علاقات البشر :) .

اولاً ، الوراثة Inheritance : عندما نقول وراثة فنعني ان الابن ياخذ صفات ابوه ، كالصلع او الانف الكبير او السكر والضغط وغيرها .
وهذا ما يحدث في البرمجة حيث ترث الفئة الابن جميع الخصائص والوظائف(methods) من ابوها .
- في المخططات تمثل بخط ينطلق من الابن الى الاب ورأسه مثلث .
- نستعملها لجعل الابن يستطيع ان يفعل ما يستطيعه الاب .

ثانياً : التنفيذ (implementation) : تسمى علاقة التنفيذ ب Realization كمثال :
Man implements CanDo
هنا الفئة Man تتعهد وتُقسم بانها ستقوم بكل الوظائف الموجودة في CanDo . ونستفيد بذلك ان نكون متاكدين بان فئة معينة تستطيع فعل وظيفة ما .
مثلاً نبني واجهة interface باسم CanMakeSound فيها الدالة makeSound ، ثم نبني ثلاث فئات تنفذ الواجهة وهي Dog, Cat, Cow ولكن كل فئة سيكون اصدار الصوت لها مختلفاً , ونستفيد من ذلك كالاتي :
void sayHello(CanMakeSound obj){
    obj.makeSound();
}

هنا نستطيع ان نمرر Dog او Cat او Cow لانهم تعهدو بانهم سيقومون بالوظائف التي في CanMakeSound .
- في المخططات نمثل العلاقة بخط متقطع من الفئة الى الواجهة على رأسه سهم .

ثالثاً ، الاعتمادية (Depends) : هذه العلاقة هي علاقة مصلحة بحته "لا تجربها في المنزل"  ، فهذه العلاقة تجعل الكائن يستعمل الكائن الاخر وقت الحاجة اليه ثم يقتله ، تخيل ذلك ، ما شعورك .
اكبر مثال هو استخدامك لل Scanner يا قاتل الكائنات .
- في المخططات تمثل علاقة المصلحة بسهم متقطع ينطلق من الكائن المصلحي .

رابعاً ، التجميع (Aggregiation) : تُمثل هذه العلاقة عندما يكون لدينا كائن ينتمي اليه عدة كائنات ، مثلاً لدينا فئة Person وفئة الفريق Team  وفيها مصفوفة كائنات من نوع Person ، هنا الفريق يعتمد على الاشخاص الذين فيه .
- في المخططات تمثل بسهم ينطلق من الفئة الابن(Person) وعلى راسه معين مفرغ .

خامساً ، التركيب (Composition) : في العلاقة السابقة كان لدينا اعتماد خفيف ، فيمكن وجود اشخاص لا ينتمون الى اي فريق ، اي ان وجود الشخص ليس بالضرورة يعني وجود فريق .
اما هذه العلاقة الاكثر صرامة فتعني الاعتماد الكلي ، مثلاً :
لدينا فئة Room وفئة House فيها مصفوفة كائنات من نوع Room . هل يمكن(منطقياً) ان توجد غرفة بدون منزل؟ . (اذا هممت بان تجيب نعم غادر القناة) .
- في المخططات تُمثل بسهم ينطلق من الابن(الجزء) الى الاب(الكل) ، مع معين مطموس .

سادساً ، **** Association : سمها ما شئت لكن الاهم ان تعلم ماهي . هذه العلاقة مشابهة كثيراً لعلاقات قواعد البيانات من ناحية المفهوم .
- في المخططات بتم تمثيلها بخط عادي ، مع تحديد درجة التعدد (1, m, *)

هذه اهم العلاقات في البرمجة ، وعليك ان تفهمها جيداً ، وحاول شرحها لزميلك ان لم تفهمها بشكل ممتاز فقد يساعدك ذلك كثيراً .
العلاقات في البرمجة .
Asem Najee
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين . من اهم المواضيع التي يجب ان يحترفها مهندس البرمجيات هو موضوع العلاقات ، فالعلاقات موجودة في كل شيء ؛ والعلاقة تعني ارتباط شيء بشيء آخر لتحقيق غاية قد تكون صداقة او زواج او الافضل علاقة مصلحة ، اما…
علق احد الاخوة المصريين بالاتي :

عندك علاقة بين الاوبجكت نسخة من (الكلاس) اثناء بنائه وهدمه

الكلاس يتكون من:
١- خصائص(متغيرات).
٢- ميثود (فنكشن)

حتى تفهم وش العلاقات 
Composition
في داخل الكلاس في الكونستركتر تسوي new لكلاس ثاني ، وتحفظه في الخصائص اذا انهدم الكلاس فقدت الاوبجكت مباشرة

Aggregation
تمرر الاوبجكت من خلال الكونستركتر وتخزنه في الخصائص اذا انهدم الكلاس الاوبجكت باقي لانك الكلاس معتمد عليه في الكونستركتر ويتطلب انشائه قبله
Association
تستخدم الاوبجكت في دالة غير الكونستركتر سوا انشات الكلاس او لا لايتطلب وجود الاوبجكت الا عند حاجتك للدالة اذا انهدم الكلاس الاوبجكت موجود



مثال عملي مختصر🤷🏻‍♂️

مثال وهمي
class Example {
    public $composition;
    public $aggregation;

    public function __construct(Aggregation $aggregation) {
        $this->composition = new Composition();
        $this->aggregation = $aggregation;
    }

    public function useAssociation(Association $association) {
        $association->perform();
    }
}
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين .

اذا كنت من مبرمجي لغة Java "مبتدئ تحديداً" وتريد ان تتعلم ميزة جديدة فمنشور اليوم هو من اجلك .
سنتحدث اليوم عن الانواع العامة Generics ، مع امثلة متنوعة .
اولاً ما هي الانواع العامة Generics ؟
قبل ان نجيب على السؤال سنطرح سؤالاً آخر وهو ، لماذا نستعمل Generics وما المشاكل التي يحلها ؟
class Example{
public static void main(String[] args) {
System.out.print("Hello, world!");
}
}

هل تريد ان تختصر امر الطباعة مثل لغة python ؟ اليك الحل .
class Example{
public static void main(String[] args) {
print("Hello, world!");
}
public static void print(String text){
System.out.print(text);
}
}

الامر سهل لكن ماذا ان اردت ان اطبع الرقم 5 ؟ ساحتاج الى عمل override للوظيفة print كي تستقبل رقم !!
public static void print(int number){
System.out.print(number);
}

حللنا المشكلة :)
لكن ماذا ان اردت ان اطبع 5.6 او غيرها ؟ هل سابني وظيفة لكل نوع ؟ الامر مكلف للغاية .
الحل هنا هو استخدام الانواع العامة كالتالي .
class Example{
public static void main(String[] args) {
print("Hello, world!");
print(5);
print(5.5);
}
public static <T> void print(T value){
System.out.print(value);
}
}

باستخدامنا للنوع العام Generic جعلنا الدالة تقبل اي نوع من القيم . ليس مطلوب ان تفهم كل شيء المطلوب ان تبني الفكرة في هذا المثال .
قد يقول قائل لماذا لا نجعل الوظيفة تستقبل كائن من نوع Object فهو اب لكل الكائنات ، والاجابة عن السؤال ابحث عنها انت .
احد الاسباب ان كائن Object ليس موضوعنا في هذا المنشور.

دعنا نعتبر ما سبق عبارة عن مقدمة ولنبدا الشرح من البداية .
الانواع العامة Generics هي موضوع مهم في البرمجة وهو ليس في جافا فقط وانما يوجد في C# و C++ و غيرها من اللغات ولكن لغة الجافا هي محبوبتنا دائماً لذلك نشرح الامثلة بها .

سابقاً ، في العصر القديم ايام الجاهلية كنا نتعلم كيف نطبع او نجمع عددين وتعلمنا الشروط وحلقات التكرار ، ولكن عندما تقدمنا بضع خطوات صغيرة اصبحت الشفرة تتكرر والاوامر نفسها في كل مكان . اكتشفنا بعدها الشيء المذهل الذي يسمى وظيفة (method) . كان هذا الاكتشاف امر مذهل وساعدنا على تقليل الاوامر بشكل كبير حتى كانت الشفرة تتحول من 1000 سطر الى 200 سطر بشكل غريب .
الوظائف امر رائع والاروع من كل ذلك الوسائط Parameters التي نمررها لها وهو الامر الذي جعل الوظائف اكثر قابلية لاعادة الاستخدام في اي مكان . لكن مع كل هذا التقدم فنحن لا نستطيع ان نمرر للدالة الا قيمة او مجموعة قيم ، لكن هل نستطيع ان نمرر لها نوع بيانات ؟!!
للاسف الاجابة ، نعم ولكن للفئات Class وليس للدوال فقط . كالتالي :
class Generics<T> {
T instanceName;
}

لقد عرفنا فئة جديدة باسم Generics ووضعنا الرمز الغريب <T> ثم عرفنا متغير في الفئة وجعلنا نوعه T ، ولكن ماذا يعني ذلك وما نوع المتغير instanceName ؟ للاجابة على هذا السؤال انظر كيف سننشئ كائن من هذه الفئة :
Generics<String> ob;

لابد ان تلاحظ اننا ارسلنا الفئة String الى الفئة Generics لذلك سيتم اعتبار T بانه String وسيكون نوع المتغير instanceName من نوع String .

يتبع في المنشور القادم ...
هل يجب ان اسمي النوع العام ب T فقط ؟؟ الاجابة لا يا عزيزي ، يمكنك ان تسميه بما شئت بقواعد تتبع قواعد تسمية المتغيرات .

ماذا ان كنت اريد ان ارسل اكثر من نوع كي اعرف اكثر من متغير ؟
class Generics<T, V> {
T instanceName;
V instanceName2;
}
// Create instance
Generics<String, Integer> ob;

لاحظ اننا لم نرسل int وانما ارسلنا Integer لان Generic لا يقبل الانواع العادية وانما يقبل فئات فقط .
يمكنك ايضاً ارسال عدد اكثر من الانواع .

ماذا عن الوظائف ؟

class Generics<T> {
private T instanceName;
public void setInstanceName(T instanceName){
this.instanceName = instanceName;
}
public T getInstanceName(){
return this.instanceName;
}
}

المثال السابق يوضح اننا يمكن ان نجعل الوظيفة تستقبل قيمة من نوع Generic او تعيد قيمة من نوع Generic . بشرط ان تكون الوظائف داخل فئة من نوع Generic .
اسمعك تقول : "اخيراً وجدنا قيد على النوع العام فهو لا يمكن استعماله خارج فئة لا تقبل النوع العام" .
انظر المثال التالي واذهب الى النوم بعدها
class NotGeneric{
<T> void genericMethod(T value){
System.out.println(value);
}
}

لكن ركز ولاحظ الفرق بين النوع الاول وهذا النوع من الوظائف ، فلقد حددنا ان الوظيفة من نوع Generic من خلال الرمز الغريب <T> نفسه .
اليس رائعاً ؟؟ الان اصبحت الوظائف تقبل قيم وتقبل انواع بيانات . ولكن بقدر روعة هذا الامر اليس سيئاً ؟ ماذا ان اردت ان اجعل الدالة تقبل رقماً فقط ؟ سواء double او int او float ، او اردت تخصيص الدالة لكي تقبل الفئة Animal او ابنائها مثل Donkey و Dog و "نتنياهو" و "ترامب" ؟
ابشرك ان هناك حل في لغة جافا وهو كالتالي :
class Generics<T extends Animal> {
private T instanceName;
public void setInstanceName(T instanceName){
this.instanceName = instanceName;
}
public T getInstanceName(){
return this.instanceName;
}
}

الان قمنا بتخصيص النوع العام فقط من Animal وابنائه ، واذا حاولنا ان ان نرسل مثلاً String كالتالي :
Generics<String> ob;

فسيحصل خطا !
الى هنا نكمل رحلتنا مع الاكتشاف العجيب .
الموضوع طويل جداً وحاولت ان اكتب القليل واشمل الكثير . والحمد لله رب العالمين .

هل يمكنك تفسير الكود التالي ؟
// Try this
<T> T T(T T){
return T;
}
في منشور سابق ذكرنا قواعد التسمية ولكني نسيت ان انوه ان لغة Java تدعم العربية ويمكنك تسمية اي شيء بالعربية . المثال التالي يوضح ذلك :
abstract class حيوان {
abstract void من_انت();
}
class ترامب extends حيوان{
@Override
void من_انت(){
System.out.println("انا ترمب ، من اصل غوريلا");
}
}
class نتنياهو extends حيوان{
@Override
void من_انت(){
System.out.println("انا نتنياهو حفيد قرد السبت");
}
}
الشجرة التي تحرسها الاسود لا تتسلقها القرود .

كيف هي غيرتك؟
بسم الله الرحمن الرحيم ، والصلاة والسلام على اشرف المرسلين .

تعلمنا سابقاً كيف نتعامل مع الانواع العامة Generics في لغة Java واليوم سنشرح معلومة اضافية عنه .

هل سألت نفسك ما الفرق بين التعريفات التالية .
ArrayList ar;
ArrayList<Object> ar2;

في السطر الاول لم نحدد نوع ال Generic فتلقائياً يقوم المترجم باعتباره من نوع Object .
وفي السطر الثاني حددناه بشكل مباشر على انه Object ، هذا يعني ان لا فرق بين الامرين السابقين وهما بنفس العمل .

لكن لاحظ الاتي :
ArrayList ar = new ArrayList ();
ArrayList<String> ar2 = new ArrayList<String>();
ArrayList<String> ar3 = new ArrayList<>()

دعنا نركز هذه المره على ما بعد علامة الاسناد .
قد يبدو الامر بديهياً مع اول امر وذلك لاننا لم نحدد نوع البيانات لذا سيتم اعتبارها ك Object من قِبل المترجم .
لكن السطر الثاني قمنا بتحديد النوع ولذا سيتم اعتبار النوع على انه String وذلك لاننا حددنا النوع قبل الاسناد وبعده .
انا الثالثة لم نحدد النوع ولكننا تركنا القوسين فارغين <> وهذا ينبه المترجم بان يجعل النوع على ما تم تحديده قبل علامة الاسناد . وفي حالتنا هذه حددنا ما قبل علامة الاسناد بانه String فسيتم اعتبارها String وكاننا كتبنا الامر التالي :
ArrayList<String> ar3 = new ArrayList<String>();

هذه كانت ملاحظة اليوم ، وعليك الانتباه الى ان تحديد النوع العام <String> عند انشاء كائن امر مهم ويساعدك على استخدام جميع الميزات بشكل افضل وبدون حدوث مشاكل .
اصدرت جوجل نسخة ذكاء اصطناعي قوية لتسهيل التعلم للطلاب .
تتميز هذه النسخة بالسماح لك برفع ملفات محاضراتك وتوفير بودكاست صوتي يشرح الملف بشكل افضل .
https://notebooklm.google.com/
﴿وَما تَشاءونَ إِلّا أَن يَشاءَ اللَّهُ﴾
*ڪن على يقين أن الله لو راضي لك في شيء سيحصل وأن اختيارات الله لنا هي دائمًا الأجمل فلا تعترض على قضائه، ڪن مؤمنًا بالله لان الله يخبئ لك الأحسن والأبقى وهذه الدنيا لا تستحق أن تبڪي فيها على شيء .
السلام عليكم ورحمة الله وبركاته .

بفضل الله انتهيت من بناء مكتبة بلغة جافا ، المكتبة تسمح لك بربط مشروعك بقواعد بيانات mysql ببساطة .

https://github.com/AsemNajee/JDBC-Library.git

تم استعمال نمط MVC في بناء المكتبة .
سيكون لدينا توثيق شامل باللغة العربية لاحقاً .
Asem Najee
السلام عليكم ورحمة الله وبركاته . بفضل الله انتهيت من بناء مكتبة بلغة جافا ، المكتبة تسمح لك بربط مشروعك بقواعد بيانات mysql ببساطة . https://github.com/AsemNajee/JDBC-Library.git تم استعمال نمط MVC في بناء المكتبة . سيكون لدينا توثيق شامل باللغة العربية…
بفضل الله تم عمل توثيق بسيط للمكتبة ، التوثيق موجود على github في ملف README.md .

تم الاستعانة بتقنيات الذكاء الاصطناعي في التوثيق ، لا يمكن الاستغناء عن هذه التقنيات .
طلبت من gemini ان يعطيني صفحة شخصية واعطيته اسمي وتخصصي فاعطاني الصفحة التالية
https://g.co/gemini/share/9154eaa04972

الى متى تعتقد اننا سنستمر بتعلم كتابة الاكواد؟ وهل ستنتهي حقبة كتابة الكود؟
#معلومة
جميعنا نعرف ان القرص الصلب هو ذاكرة التخزين الدائمة في الجهاز وغالبا ما نسميها ب Hard Disk Driver .

في الحقيقة ليست هذه التسمية صحيحة دائماً ف Hard Disk Driver هي النوع البطئ من الذواكر ونعرفه نحن ب HDD وهناك نوع اخر من الذواكر وهي Solid Static Driver ونعرفها ب SSD .

فاذا كنت تمتلك ذاكرة من نوع SSD فلا تسميها Hard Disk .
معي لنتدبر آية
{وَعَدَ اللَّهُ الَّذِينَ آمَنُوا مِنْكُمْ وَعَمِلُوا الصَّالِحَاتِ لَيَسْتَخْلِفَنَّهُمْ فِي الْأَرْضِ}

إذا حدثتك نفسك بيأسٍ فاستمسك بكلام ﷲ؛
ثبت به فؤادك ولا تركن إلىٰ ضعف يضيّعك
وانظر إلىٰ سنن الذين خلوا من قبل، رفع ﷲ أقوامًا مؤمنين مستضعفين وأذل جبابرة متكبرين،
فالنصر مِن عندِ ﷲ، هو حسبُنا ونعمَ الوكيل..
2025/07/13 19:33:04
Back to Top
HTML Embed Code: