القائمة الرئيسية

الصفحات

تعلم البرمجه تعلم لغه البرمجه Java الدرس الثامن 8


تعلم البرمجه من الصفر حتى الختراف

تعلم البرمجه  تعلم لغه البرمجه الجافا الدرس الثامن 8

Java
كلاسات الـ Data Structure الجاهزة في جافا


مقدمة
Data Structure تسمى هيكلة البيانات أو بنية البيانات في اللغة العربية, و هي تعني طريقة تخزين أو ترتيب البيانات في الذاكرة.
الـ Data Structure عبارة عن مجموعة من الكلاسات (Classes) و الإنترفيسات (Interfaces) تستخدم لمعالجة البيانات التي تم إدخالها في البرنامج أثناء التشغيل.


سنشرح في هذا الدرس الكلاسات التالية:

Vector.
Enumeration.
Stack.
Hashtable.
Properties.

في الدرس التالي ستتعرف على عدة Collection تستخدم في عمليات الـ Data Structure.
Collection تعني مجموعة في اللغة العربية, و هي عبارة عن مجموعة من الكلاسات و الإنترفيسات التي تستخدم في عمليات الـ Data Structure.

الكلاس Vector
الكلاس Vector يستخدم لإنشاء مصفوفات متطورة مقارنةً مع المصفوفات العادية Arrays, حيث يوفر لك مجموعة من الدوال التي تمكنك من البحث فيها, التشييك على عناصرها, إضافة عناصر جديدة, حذف عناصر منها, و معالجة أكثر من عنصر فيها في نفس الوقت إلخ..

أهم ميزة في المصفوفات التي نوعها Vector هي أن عدد العناصر فيها غير ثابت, حيث أنه يزيد عند إضافة عنصر جديد فيها و ينقص عند حذف عنصر منها بشكل تلقائي, و هذه الميزة غير موجودة في المصفوفات العادية.

كما أنك تستطيع الوصول للعناصر الموجودة فيها عن طريق أرقام الـ Index التي تعطى بالترتيب لكل عنصر يضاف فيها.

لمزيد من التفاصيل حول الكلاس Vector تابع القراءة »

الإنترفيس Enumeration
الـ Enumeration هو إنترفيس يستخدم لتخزين عناصر متتالية موجودة في Data Structure معينة دفعة واحدة.
بعدها يمكنه إرجاع هذه العناصر واحداً تلو الآخر بواسطة الدالة nextElement().

فعلياً لا يعتبر Data Structure معينة بحد ذاته, لكن بعض الكلاسات و الإنترفيسات الأخرى التي تنتمي لفئة الـ Data Structure تعتمد عليه, مثل الكلاسات Vector و Properties.

في الدرس التالي سنتعرف على إنترفيس يشبهه إسمه Iterator.

لمزيد من التفاصيل حول الإنترفيس Enumeration تابع القراءة »

الكلاس Stack
الكلاس Stack يرث من الكلاس Vector, و هو يطبق المبدأ LIFO ( Last In First Out ), أي العنصر الذي يدخل أولاً يخرج أخيراً.

بما أنه يرث من الكلاس Vector, فهذا يعني أنه يملك جميع الدوال الموجودة فيه.

هنا يتم تخزين العناصر بشكل عامودي, حيث أن العناصر تترتب فيه من الأسفل إلى الآعلى.
إذاً عند إضافة عنصر ( كائن ), سيتم تخزينه في أعلى الـ Stack. و عند حذف عنصر, سيتم حذف العنصر الموجود في الأعلى أيضاً.
بما أنه لا يمكن التعامل معه إلا من الأعلى فهذا يعني أنه يمكن الوصول فقط للعنصر الموجود في أعلى الـ Stack.

لمزيد من التفاصيل حول الكلاس Stack تابع القراءة »

الكلاس Hashtable
الكلاس Hashtable يستخدم لتخزين الكائنات بشكل Key / Value حيث يتم إعطاء مفتاح لكل قيمة يتم تخزينها بداخل الـ Hashtable.

هنا كل قيمة يتم تخزينها في الـ Hashtable يجب إعطاءها Key غير مستخدم, لأن كل Key موضوع يسمح لك بالوصول لقيمة واحدة من القيم الموجودة في الـ Hashtable.

إذاً الـ Hashtable كأنه جدول يتألف من عامودين, الأول يحتوي المفاتيح ( Keys ) و الثاني يحتوي على القيم ( Values ).

إذاً هنا كل عنصر يضاف في الـ Hashtable يجب أن يحتوي على كائنين, الأول يمثل المفتاح و الثاني يمثل قيمته.

لمزيد من التفاصيل حول الكلاس Hashtable تابع القراءة »

الكلاس Properties
الكلاس Properties يرث من الكلاس Hashtable و هو يستخدم أيضاً لتخزين العناصر بشكل Key / Value.

بما أنه يرث من الكلاس Hashtable, فهذا يعني أنه يملك جميع الدوال الموجودة فيه.

الفرق الأساسي بين الكلاس Properties و الكلاس Hashtable هو أن الكلاس Properties يمكنه فقط تخزين Keys و Values من النوع String
بالإضافةً إلى أن الكلاس Properties يحتوي على دوال جاهزة للتعامل مع الملفات.

لمزيد من التفاصيل حول الكلاس Properties 



Java
الإطار Collection في جافا



الإنترفيس Collection هو أساس كل Collection موجودة في هذا الإطار.
كل إنترفيس يرث مباشرةً من الإنترفيس Collection يمثل Collection مختلفة.

الصورة التالية توضح طريقة بناء الإطار Collection.

كلاسات هياكل البيانات في جافا


ملاحظة
بعض الكلاسات التي تم تعريفها في الإصدار 1, هي نفسها التي ستراها في الإصدار 2 و التي وضعت في Collection معينة.
في الدرس السابق, صحيح أننا شرحنا كلاسات الـ Data Structure التي وجدت في أول إصدار من لغة جافا, لكننا شرحناها كما هي الآن في آخر إصدار منها.

الإنترفيسات الموجودة في الإطار Collection
بما أنه لا يمكن إنشاء كائن من إنترفيس, قمنا باستخدام مبدأ الـ Upcasting في جميع الأمثلة التي وضعناها في الجدول حتى نجعل الإنترفيس يشير إلى كلاس يرث منه حتى نتمكن من إعطائك مثال حول كل إنترفيس موضوع في الجدول.

الجدول التالي يحتوي على جميع الإنترفيسات الموجودة في الـ Collection.

الإنترفيس مع تعريفه
1
interface Collection
الإنترفيسCollection مصمم بشكل عام لاحتواء الأشياء المشتركة في جميع الـ Collection.
إذاً هو الأساس لأي إنترفيس يمثل Collection حيث أن جميع الـ Collection ترث منه.
تابع القراءة »
2
interface List
الإنترفيس List يرث من الإنترفيس Collection. تم بناءه لتخزين مجموعة من العناصر كما لو أنه مصفوفة ليس لها حجم محدد.
تابع القراءة »
3
interface Set
الإنترفيس Set يرث من الإنترفيس Collection.
الفرق الأساسي بينه و بين الإنترفيس List هو أنه لا يمكنه تخزين نفس القيمة في أكثر من عنصر. إذاً هنا لا يمكن وجود نفس القيمة في أكثر من عنصر.
هذا الإنترفيس مفيد في العلميات الحسابية, حيث أن وجود عناصر لا تحمل نفس القيمة, يتيح لك مقارنة قيمهم بشكل منطقي حتى و لو كانوا مختلفين في النوع.
تابع القراءة »
4
interface SortedSet
الإنترفيس SortedSet يرث من الإنترفيس Set. تم بناءه لتخزين العناصر بترتيب تصاعدي ( Ascending ), أي من الأصغر إلى الأكبر.
كما أنه يحتوي على دوال جديدة غير موجودة في الإنترفيس Set.
تابع القراءة »
5
interface Comparator
الإنترفيس Comparator مصمم لمقارنة قيم الكائنات.
يعتمد عليه كل إنترفيس يقوم بترتيب الكائنات التي يتم إدخلها فيه, سواء كان ترتيباً حسب القيمة أو ترتيباً أبجدياً.
تابع القراءة »
6
interface Iterator
الإنترفيس Iterator يستخدم لتخزين عناصر متتالية موجودة في أي كائن دفعة واحدة.
بعدها يمكن إرجاع هذه العناصر واحداً تلو الآخر.
ينصح باستخدام هذا الإنترفيس بدل استخدام الإنترفيس Enumeration.
تابع القراءة »
7
interface ListIterator
الإنترفيس ListIterator يرث من الإنترفيس Iterator, و يملك دوال إضافية للتعامل مع العناصر المخزنة.
تابع القراءة »
الكلاسات الموجودة في الإطار Collection
الكلاس مع تعريفه
1
class ArrayList
الكلاس ArrayList يستخدم لإنشاء مصفوفات متطورة مقارنةً مع المصفوفات العادية Arrays, حيث يوفر لك مجموعة من الدوال التي تمكنك من البحث فيها, التشييك على عناصرها, إضافة عناصر جديدة, حذف عناصر منها, و معالجة أكثر من عنصر فيها في نفس الوقت إلخ..
أهم ميزة في المصفوفات التي نوعها ArrayList هي أن عدد العناصر فيها غير ثابت, حيث أنه يزيد عند إضافة عنصر جديد فيها و ينقص عند حذف عنصر منها بشكل تلقائي, و هذه الميزة غير موجودة في المصفوفات العادية.
تابع القراءة »
2
class LinkedList
يشبه الكلاس ArrayList من حيث الفكرة. و هو يحتوي على دوال إضافية غير موجودة فيه.
تابع القراءة »
3
class HashSet
الكلاس HashSet يستخدم لتخزين عناصر متتالية, دون مراعاة أي دقة في ترتيب هذه العناصر, كما أنه يسمح بتخزين القيمة null.
لكنه لا يسمح بتخزين أكثر من عنصر عندهم نفس القيمة, فتجد كل عنصر فيه يملك قيمة مختلفة.
السبب الوحيد الذي قد يجعلك تستخدم هذا الكلاس هو سرعته العالية في التخزين مقارنة مع باقي الكلاسات الموجودة في المجموعة Set.
تابع القراءة »
4
class LinkedHashSet
الكلاس LinkedHashSet يرث من الكلاس HashSet تم تصميمه فقط للحفاظ على ترتيب العناصر التي يتم إدخالها فيه.
و هو يملك نفس الأشياء التي يملكها الكلاس HashSet.
تابع القراءة »
5
class TreeSet
الكلاس TreeSet يعتبر الكلاس الأكثر تطوراً بين كلاسات المجموعة Set, و هو يستخدم لتخزين عناصر متتالية, و ترتيبهم بالطريقة التي تريد, كما أنه يسمح بتخزين القيمة null, لكنه لا يسمح بتخزين أكثر من عنصر عندهم نفس القيمة, فتجد كل عنصر فيه يملك قيمة مختلفة. و هو يحتوي على دوال أخرى تسهل طريقة الوصول للعناصر.
تابع القراءة »
الإنترفيسات الموجودة في الإطار Map
الجدول التالي يحتوي إنترفيسات لا ترث من الإنترفيس Collection, لكنها مهمة جداً حيث أن بعضها يوفر لك طرق تخزين لا تتوافر في الإطار Collection, و بعضها يستخدم للتعامل مع الكلاسات الموجودة في الإطار Collection.

الإنترفيس مع تعريفه
1
interface Map
الإنترفيس Map يتيح لك تخزين العناصر بشكل Key / Value.
هنا كل عنصر يتم تخزينه يملك كائنين: الأول عبارة عن مفتاح ( key ) و الثاني عبارة قيمة ( value ).
تابع القراءة »
2
interface SortedMap
هذا الإنترفيس يرث من الإنترفيس Map, تم بناءه لتخزين العناصر بشكل Key / Value. هنا يتم ترتيب العناصر حسب الـ key بشكل تصاعدي, من الأصغر إلى الأكبر.
تابع القراءة »
الكلاسات الموجودة في المجموعة Map
الكلاس مع تعريفه
1
class HashMap
الكلاس HashMap يستخدم لتخزين العناصر بشكل Key / Value حيث يتم إعطاء مفتاح لكل قيمة يتم تخزينها بداخل الـ HashMap.
إذاً الـ HashMap كأنه جدول يتألف من عامودين, الأول يحتوي المفاتيح ( Keys ) و الثاني يحتوي على القيم ( Values ).
تابع القراءة »
2
class LinkedHashMap
الكلاس LinkedHashMap يرث من الكلاس HashMap تم تصميمه فقط للحفاظ على ترتيب العناصر التي يتم إدخالها فيه.
تابع القراءة »
3
class TreeMap
الكلاس TreeMap يعتبر الكلاس الأكثر تطوراً بين كلاسات المجموعة Tree, و هو يستخدم لترتيب العناصر في الذاكرة بشكل تصاعدي Ascending نسبة للـ keys. و هو يحتوي على دوال أخرى تسهل طريقة الوصول للعناصر.
تابع القراءة »
مجموعة الخوارزميات Algorithms Collection
الكلاس Collection يحتوي على دوال ثابتة نوعها static. هذه الدوال تساعد كثيراً في الوصول إلى العناصر و التلاعب بها سواء كنت تتعامل مع الكلاسات التي ترث من الإنترفيس Collection أو مع الكلاسات التي ترث من الإنترفيس Map.

إذاً هذه الدوال تغنيك عن كتابة خوارزميات صعبة و معقدة, لذلك سميت مجموعة الخوارزميات ( Algorithms Collection ).

لمزيد من التفاصيل حول مجموعة الخوارزميات 


Java
مفهوم الـ Generics في جافا


مقدمة
في الدرسين السابقين تعرفنا على كلاسات الـ Data Structure التي تسمح لنا بتخزين البيانات مهما كان نوعهم و بأشكال مختلفة أثناء تشغيل البرنامج.
عند استخدام هذه الكلاسات كنا نلاحظ أنه بإمكاننا تخزين أي نوع بيانات فيهم بدون أي مشاكل.

أسلوب الـ Generics يجعلك قادراً على بناء كود واحد يلائم أكثر من نوع بيانات, و عند الحاجة إلى استخدام هذا الكود يمكنك إستخدامه كما هو, و يمكنك أيضاً تحديد نوع البيانات التي تريده أن يعمل معها حسب حاجتك.

في الدرس السابق شرحنا كيف يمكن تخزين أي نوع بيانات في الكلاسات ArrayList و LinkedList, و تعلمنا أيضاً كيف أننا نستطيع تحديد نوع البيانات التي نريد تخزينها فيهم في حال استخدمنا أسلوب الـ Generics عند إنشاء كائنات منهم.


معلومة تقنية
فعلياً, معظم كلاسات الـ Data Structure تم بناءها على أساس هذا الأسلوب.
كل كلاس, إنترفيس أو دالة تجد الرمز < > موجود ضمن تعريفه, إعرف مباشرةً أنه مصمم للتعامل مع أكثر من نوع بيانات.


فائدة الـ Generics
أنت لست مجبر على استخدام أسلوب الـ Generics, لكن تعلمه سيفيدك كثيراً في تطوير الكود الخاص فيك, و جعل حجمه أصغر و أسهل في حالة التعديل.
فمثلاً, إن كنت بحاجة إلى بناء مصفوفة ليس لها حجم محدد و تريد تخزين أعداد صحيحة ( أي من النوع int ) فقط فيها, يمكنك إنشاء كائن من الكلاس ArrayList و تحديد النوع Integer كنوع البيانات الوحيد الذي يمكن إدخاله في هذا الكائن كما رأينا في الدرس السابق و تكون بهذا قد وصلت لهدفك بكل سهولة بواسطة أسلوب الـ Generics.

ميزة أخرى مهمة جدًا في هذا الأسلوب, و هي أنه يساعد المبرمج في إكتشاف الأخطاء النوعية أثناء كتابة الكود.

مثلاً, إذا قمت بإنشاء كائن نوعه ArrayList و حددت أنه يمكنه تخزين قيم من النوع Integer فقط, بعدها حاولت تخزين قيمة من نوع آخر مثل النوع String على سبيل المثال, عندها سيظهر لك تحذير مفاده أنه لا يمكن تحويل النوع String إلى النوع Integer.


خلاصة
بشكل عام, نستخدم الـ Generics لبناء كود يتوافق مع أي نوع بيانات.
عند الحاجة إلى هذا الكود نقوم بتحديد نوع البيانات التي سنتعامل معها. ستفهم كل شيء من الأمثلة.


ستتعلم في هذا الدرس كيف تعرف أي شيء كـ Generic و كيف تستفيد منه, و تذكر أنه يمكنك استخدام هذا الأسلوب مع أغلب كلاسات الـ Data Structure.

الأحرف المستخدمة في الـ Generics
ذكرنا في الجدول التالي الأحرف المتعارف عليها بين المبرمجين عند التعامل مع الـ Generics.

الأحرف المتعارف عليها في الـ Generics
T إختصار للكلمة Type, يقصد منه أي نوع كان.
نستخدمه في العادة عند بناء كود يتعامل مع أي نوع بيانات.
N إختصار للكلمة Number, يقصد منه أي نوع من الأنواع التي تستخدم لتخزين الأرقام.
نستخدمه في العادة عند بناء كود يتعامل مع الأرقام من أي نوع كانت مثل ( Integer - Float - Double إلخ.. ).
E إختصار للكلمة Element, يقصد منه عنصر ليس له نوع محدد.
نستخدمه في العادة عند بناء كود يتعامل مع عناصر المصفوفة من أي نوع كانت.
k إختصار للكلمة Key, يقصد منه مفتاح ليس له نوع محدد.
نستخدمه في العادة عند بناء كود يتعامل مع مفاتيح كائن يخزن البيانات بشكل key / value.
V إختصار للكلمة Value, يقصد منه قيمة ليس لها نوع محدد.
نستخدمه في العادة عند بناء كود يتعامل مع قيم كائن يخزن البيانات بشكل key / value.

ملاحظة: جميع الأحرف المذكورة في الجدول ليس لها أي تأثير على الكود و يمكنك وضع أي حرف أو كلمة مكانهم, لكننا ننصحك باعتمادهم.

المبادئ الأساسية التي عليك إتباعها عند التعامل مع الـ Generics
لتعريف متغير, مصفوفة أو دالة بدون تحديد نوعهم, أي ليعملوا مع مختلف أنواع البيانات, يجب تعريفهم كـ Generics.
هنا وضعنا أمثلة صغيرة الهدف منها توضيح طريقة استخدام الأحرف التي ذكرناها في الجدول السابق من أجل تعريف كود يمكن استخدامه للتعامل مع أكثر من نوع بيانات.

في نهاية الدرس وضعنا أمثلة مهمة توضح أهمية و طريقة استخدام الـ Generics.


طريقة تعريف نوع بيانات مجهول
لتجهيز نوع بيانات غير محدد يمكن استخدامه في كلاس أو إنترفيس أو دالة, نضع أحد الأحرف التي ذكرناها في الجدول السابق بين < > عند تعريفهم.

أمثلة
•هنا قمنا بتعريف كلاس إسمه GenericClass يملك نوع بيانات غير محدد رمزنا له بـ T.

public class GenericClass <T> {

}

•هنا قمنا بتعريف إنترفيس إسمه GenericInterface يملك نوع بيانات غير محدد رمزنا له بـ N.

public interface GenericInterface <N> {

}

•هنا قمنا بتعريف دالة إسمها genericMethod تملك نوع بيانات غير محدد رمزنا له بـ E.

public <E> void genericMethod(E var) {
    System.out.println(var);
}


طريقة تعريف أكثر من نوع بيانات مجهول
نفس الطريقة السابقة, لكن يجب وضع فاصلة بين كل حرفين تم استخدامها بداخل الـ < >

أمثلة
هنا قمنا بتعريف كلاس إسمه GenericClass يملك نوعي بيانات غير محددين يرمز لهما بـ E1 و E2.

public class GenericClass <E1, E2> {

}

هنا قمنا بتعريف إنترفيس إسمه GenericInterface يملك نوعي بيانات غير محددين يرمز لهما بـ E1 و E2.

public class GenericInterface <E1, E2> {

}

هنا قمنا بتعريف دالة إسمها genericMethod تملك نوعي بيانات غير محددين يرمز لهما بـ T1 و T2.

public <T1, T2> void genericMethod(T1 a, T2 b) {
    System.out.println(a);
    System.out.println(b);
}
أمثلة شاملة
التعامل مع الـ Generics يكون بأشكال مختلفة ستتعرف عليها من الأمثلة التي وضعناها لك, كما أننا وضعنا خلاصة في نهاية كل مثال.


مصطلحات تقينة
Generic Method: تعني تعريف دالة تتعامل مع أكثر من نوع بيانات.
Generic Class: تعني تعريف كلاس يتعامل مع أكثر من نوع بيانات.
Bounded Type Parameters: تعني تعريف كلاس, إنترفيس أو دالة يتعاملوا مع نوع محدد. بالإضافة إلى جميع الأنواع المشتقة منه, أي التي ترث منه.


المثال الأول
المثال التالي هو تطبيق لفكرة الـ Generic Method.
ستتعلم منه كيف تستغل مبدأ الـ Generics لبناء دالة تتعامل مع مختلف أنواع المصفوفات.

شاهد المثال »



المثال الثاني
المثال التالي هو تطبيق لفكرة الـ Generic Class.
ستتعلم منه كيف تستغل مبدأ الـ Generics لبناء كلاس يتعامل مع مختلف الأنواع.

شاهد المثال »



المثال الثالث
المثال التالي هو تطبيق لفكرة الـ Bounded Type Parameters.
ستتعلم في منه كيف تستغل مبدأ الـ Generics لبناء دوال تتعامل مع مختلف أنواع الأرقام فقط.


Java
التعامل مع الشبكات في جافا


مقدمة
شبكة تعني Network في اللغة الإنجليزية, الفكرة الأساسية من الشبكات هي ربط الأجهزة على إختلاف أنواعها مع بعض لخلق نوع من التواصل فيما بينهم. فمثلاً الأجهزة الموصولة على الشبكة سواء كانت كمبيوترات أو هواتف أو سيرفرات, يمكنها مشاركة البيانات مع بعضها البعض بواسطة برامج معينة.
Network Programming تعني كتابة برنامج يشارك بياناته مع برنامج آخر من خلال شبكة.
في العادة يكون برنامج مثبت على السيرفر و برنامج مثبت عند المستخدم العادي.
الفكرة هنا بناء برامج للمستخدمين تجعلهم قادرين على التواصل مع بعضهم و مشاركة البيانات فيما بينهم.

عندما نقول مشاركة البيانات من خلال شبكة, نقصد بذلك أن الكمبيوتر سيشارك بياناته مع كمبيوتر آخر.
يمكن أن يكون كلا الكمبيوترات موجودين على نفس الشبكة و يمكن أن يكون كل كمبيوتر منهم في بلد مختلف ( لا يهم ).

لبناء برامج يمكنها مشاركة البيانات مع بعضها عبر الشبكات, نستخدم الحزمة java.net التي تحتوي على مجموعة ضخمة من الكلاسات و الإنترفيسات المصممة خصيصياً لمشاركة البيانات عبر الشبكات.


فائدة بناء برامج تتواصل مع بعضها من خلال شبكة
مشاركة البيانات بين مختلف المستخدمين على الشبكة.
تجميع البيانات التي نريد مشاركتها في مكان واحد, الأمر الذي يجعلنا قادرين على التحكم في طريقة مشاركة هذه البيانات.

أفكار لبرامج تعمل على الشبكة
يوجد أفكار كثيرة لبرامج يستخدمها الناس لمشاركة بياناتهم و التي يمكنك بناءها بنفسك أيضاً, أمثلة:

برنامج محادثة, مثل MSN, Yahoo, Telegram, Whatsapp.
متصفح, حيث يمكنك بناء متصفح مثل Mozilla FireFox, Google Chrome, Internet Explorer,Opera Mini.
ألعاب, حيث أنه يمكنك بناء لعبة يستطيع فيها اللاعبين تحدي بعضهم عن بعد.
برنامج إختبار, فمثلاً, يمكنك بناء برنامج يجعل الطالب قادراً على إجراء أي إمتحان عن بعد و إرساله إلى مركز المؤسسة التعليمية الرئيسية عند الإنتهاء إلخ..
مصطلحات أساسية في عالم الشبكات
في الجدول التالي وضعنا بعض المصطلحات الأساسية في عالم الشبكات التي سنتطرق إلى بعضها في هذا الدرس.
ملاحظة: في مادة الشبكات سنشرحهم بتفصيل و دقة أكثر.

المصطلح معناه
NIC NIC إختصار لـ Network Interface Card, و معناه كرت الشبكة.
كرت الشبكة هو قطعة إلكترونية يتم تركيبها في أي جهاز إلكتروني حتى يستطيع الإتصال بالشبكات.
MAC Address MAC Address إختصار لـ Media Access Control Address, و هو عبارة عن رقم كرت الشبكة الخاصة بالجهاز.
كل كرت شبكة يملك MAC Address موحد.
الـ MAC Address يتألف من 12 bytes, كل byte فيهم يمكن أن يكون رقم بين 0 و 9, أو حرف بين A و F.

أمثلة
00:1C:B3:09:85:15
00:B0:D0:86:BB:F7
00:1B:44:11:3A:B7
IP Address IP Address إختصار لـ Internet Protocol Address, و هو عبارة عن عنوان مؤقت يتم إعطائه لأي جهاز يريد الإتصال بالشبكة.
كل جهاز يريد الإتصال بالشبكة يتم إعطائه IP Address مختلف.
الـ IP Address يتألف من أربعة أرقام, كل رقم فيهم يمكن أن يكون بين 0 و 255.

أمثلة
80.10.5.104
192.168.0.1
210.14.92.65
Protocol في العربية أيضاً نقول بروتوكول, و هو عبارة عن مجموعة قواعد أساسية يجب إتباعها في كل عملية تواصل.
في عالم الشبكات يوجد بروتوكولات كثيرة, كل واحد منهم مصمم لغرض معين.

أشهر البروتوكولات
TCP: يستخدم عند نقل بيانات على الشبكة, يضمن وصولها إلى الجهة المطلوبة كما هي تماماً.
UDP: يستخدم عند نقل بيانات على الشبكة, لا يهمه إذا فقد جزء من البيانات التي تم إرسالها.
HTTP: يستخدمه المتصفح عندما تقوم بتصفح المواقع.
FTP: يستخدم عند تحميل أي نوع من الملفات.
Telnet: يستخدم للتحكم في البرامج عن بعد.
POP 3: يستخدم من قبل العميل لإستقبال الرسائل إلكترونية الواردة في بريده مع إمكانية حذفها.
SMTP: يستخدم من قبل العميل لإرسال رسائل إلكترونية إلى السيرفر.
Port Number في العربية نقول رقم البورت.
كل برنامج يرسل أو يستقبل بيانات على الشبكة يحتاج أن يفتح بورت خاص فيه على الجهاز.
رقم البورت يتيح للمستخدم إستخدام أكثر من برنامج يتعاملون مع الشبكة في نفس الوقت.
إذاً رقم البورت يميز البرامج التي تستخدم الشبكة عن بعضها البعض.
URL إختصار لـ Uniform Resource Locator, و يعني كل المعلومات المذكورة في الرابط و التي تشير إلى مصدر محدد للبيانات.

المعلومات الأساسية في أي رابط: protocol://prefix.domain:port/path/filename
:protocol نضع مكانها إسم البروتوكول المستخدم في عملية الإتصال مثل http.
:prefix نضع مكانها في العادة www.
:domain نضع مكانها إسم الموقع مثل harmash.com.
:port نضع مكانها بورت البرنامج أو البروتوكول المستخدم من قبل العميل, فمثلاً الـ http يستخدم البورت 80.
:path نضع مكانها إسم المجلد الذي نريد الدخول إليه على السيرفر.
:filename نضع مكانها إسم الملف الذي نريد تصفحه أو تحميله إلخ..

ملاحظة: عندما تتصفح أي موقع في النت, حتى لو لم ترا جميع المعلومات التي ذكرناها لك عن الـ URL, تأكد أن المتصفح يكتبها عنك.

أمثلة
harmash.com   ( هذا إسم الموقع )
www.harmash.com   ( www هو الـ prefix و الذي لا يوجد حاجة لذكره )
http://www.harmash.com:80   ( 80 هو رقم البورت )
http://www.harmash.com:80/java   ( java هو إسم مجلد في الموقع )
http://www.harmash.com:80/java/lesson_1.php   ( lesson_1.php هو إسم الملف الذي يفتح في المتصفح )
Socket الـ Socket عبارة عن مجموعة الكلاسات التي يمكن إستخدامها لإنشاء برامج تجعل المستخدمين قادرين على التواصل فيما بينهم بشكل متزامن عبر شبكة النت. و هي تضمن المعلومات الأساسية التي نحتاجها لإجراء أي عملية إتصال: Socket = IP Address + Port Number + Protocol 

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

خلاصة
يمكن الوصول لأي جهاز على الشبكة من خلال الـ IP Address الخاص فيه.
و كل تطبيق يتعامل مع الشبكات سواء لإرسال أو إستقبال بيانات يحتاج إلى رقم بورت خاص فيه ليميزه عن باقي البرامج التي تستخدم الشبكة.

الكلاسات التي نحتاجها للتعامل مع الشبكات
الكلاس مع تعريفه
1
class URL
هذا الكلاس مصمم بشكل عام لتجهيز روابط الملفات التي سنتعامل معها عن بعد عبر شبكة الإنترنت.
تابع القراءة »
2
class URLConnection
هذا الكلاس عبارة عن Abstract Class, و هو يستخدم للقراءة و الكتابة في الملف الذي يشير له كائن الـ URL, بالإضافة إلى أنه يمكننا من معرفة و تحديد كافة المعلومات المتعلقة بإجراء الإتصال مع الملف.
فمثلاً يتيح لنا معرفة آخر مرة تم فيها تحديث الملف, تاريخ صلاحية الملف, إسم الكلاس المناسب لإرسال المعلومات منه و استقبالها فيه إلخ..
تابع القراءة »
3
class InetAddress
هذا الكلاس مصمم لتحليل عنوان الجهاز أو الموقع الذي نحاول الإتصال به عن بعد عبر شبكة النت.
تابع القراءة »
4
class Socket + class ServerSocket
الـ Socket عبارة عن مجموعة من الكلاسات التي يمكن إستخدامها لإنشاء برامج تجعل المستخدمين قادرين على التواصل فيما بينهم بشكل متزامن عبر شبكة النت, لذلك تعتبر أهم كلاسات موجودة في الحزمة java.net و هي تنقسم لقسمين أساسيين:
كلاسات مخصصة لبناء برامج تستخدم البروتوكول UDP, مثل الكلاسات DatagramSocket و DatagramPacket.
كلاسات مخصصة لبناء برامج تستخدم البروتوكول TCP, مثل الكلاسات Socket و ServerSocket.
هنا قمنا بشرح الكلاسات Socket و ServerSocket.


Java
تعدد المهام في جافا


مقدمة
عندما تستخدم هاتفك أو حاسوبك, ترى أنه يمكنك تشغيل عدة برامج مع بعض في وقت واحد, كل برنامج شغال في الذاكرة يعتبر Process, فمثلاً إذا قمت بتشغيل خمسة برامج مع بعض فهذا يعني أن نظام التشغيل ينظم عمل خمسة Processes مع بعض. آلية تشغيل عدة برامج مع بعض تسمى Multiprocessing.

من جهة اخرى, في البرنامج الواحد يمكنك تنفيذ عدة أوامر مع بعض و جعل المستخدم يشعر كأنها تتنفذ في وقت واحد, فمثلاً في حال كنت تلعب لعبة مثل لعبة كرة القدم, تجد أنه هناك عدة أشياء تحدث في وقت واحد, فمثلاُ عند تشغيل اللعبة تسمع عدة أصوات ( مثل أغنية حماسية, صوت المعلق, صوت المشجعين, صوت صفارة الحكم في حال وقع خطأ إلخ.. ), بالإضافة إلى أنه يمكنك تحريك اللاعب و مشاهدة توقيت المبارة و الكثير من التفاصيل الأخرى التي تحدث كلها في نفس الوقت لتصنع لك لعبة رائعة. هذه الآلية تسمى Multithreading, لأن كل جزء شغال في البرنامج يكون عبارة عن مجموعة أوامر موضوعة بداخل Thread خاص.

إذاً نستخدم آلية Multithreading لجعل البرنامج قادر على تنفيذ عدة أوامر مع بعض و كأنها تتنفذ في وقت واحد, و هذا ما سنتعلمه في هذا الدرس.


معلومة تقنية
فعلياً, في البرنامج الواحد لا يمكن تنفيذ عدة أوامر في نفس الوقت, لكن يمكن جعل نظام التشغيل يعيد تنفيذ أوامر محددة عدة مرات خلال أجزاء من الثانية, مما يجعل المستخدم يظن أن جميع الأشياء الموجودة في البرنامج تعمل في وقت واحد لأنه غير قادر على ملاحظة ما الذي يعمل و ما الذي لا يعمل خلال أجزاء من الثانية, فتبدو له و كأنها كلها تعمل مع بعضها دفعة واحدة.

الفرق بين الـ Process و الـ Thread
Process تعني برنامج شغال حالياً, و قد قام نظام التشغيل بحجز مساحة خاصة له في الذاكرة.

Thread عبارة عن مجموعة أوامر يتم تنفيذها أثناء تنفيذ أوامر أخرى في نفس البرنامج. يمكنك تشغيل أكثر من Thread في نفس الوقت في البرنامج, و يمكن أيضاً مشاركة المعلومات بينهم. مع ملاحظة أنه يتم إنشاء جميع الـ Threads من ضمن المساحة المحجوزة للـ Process في الذاكرة.

الفرق بين ال process و ال thread
فوائد الـ Multithreading
جعل المستخدم قادر على تنفيذ عدة عمليات مع بعض في نفس الوقت.
جعل تصميم التطبيقات أجمل و إضافة مؤثرات فيه.
كل Thread تقوم بتشغيله, يعمل بشكل منعزل عن باقي الأوامر الموجودة في البرنامج, و بالتالي فإنه في حال وقوع أي خطأ في الـ Thread فإنه لن يؤثر على باقي الأوامر الموجود في البرنامج, كما أنه لا يؤثر على أي Thread آخر شغال في البرنامج.
دورة حياة الـ Thread ( Thread Life Cycle )
الـ Thread لا يعمل مباشرةً عند إنشاءه, بل يمر بعدة مراحل تباعاً حتى يعمل و ينفذ الأوامر الموضوعة بداخله, و هو ينتقل من مرحلة إلى أخرى من خلال دوال معينة كما في الصورة التالية.

المراحل التي يمر بها ال thread

المرحلة New: هي المرحلة التي يتم فيها إنشاء كائن الـ Thread.
المرحلة Runnable: تبدأ هذه المرحلة بعد إستدعاء الدالة run(), و هي تعني أن كائن الـ Thread جاهزاً لينفذ الأوامر الموضوعة فيه.
المرحلة Running: تبدأ هذه المرحلة بعد إستدعاء الدالة start(), و هي تعني أن كائن الـ Thread يبدأ بتنفيذ الأوامر الموضوعة فيه.
المرحلة Waiting: تبدأ هذه المرحلة بعد إستدعاء الدالة wait() أو sleep(), و هي تعني أن كائن الـ Thread متوقف لمدة معينة.
المرحلة Dead: يقال لها Terminated أيضاً, و هي تعني إيقاف كائن الـ Thread كلياُ عن العمل و مسحه من الذاكرة, تبدأ هذه المرحلة بعد إستدعاء الدالة interrupt().

ملاحظة
الهدف هنا فقط توضيح آلية عمل الـ Thread حتى لا تجد صعوبة في فهمها.
ركز قليلا على الدوال التي تنقل الـ Thread من مرحلة لأخرى, لكن لا تحفظ أسماء المراحل.

مفهوم الـ Main Thread
عندما تقوم بتشغيل أي برنامج في جافا, فإن جافا تعامله كـ Thread, لأن كل برنامج تقوم بإنشائه يمر بالمراحل التي ذكرناها.

فمثلاً, تخيل أنك قمت ببناء برنامج بسيط يطلب من المستخدم إدخال عددين, بعدها يقوم البرنامج بطباعة ناتج هذين العددين للمستخدم, هنا سيحدث التالي عند تشغيله:

سيتم فحص كود البرنامج للتأكد من عدم وجود أي خطأ.
بعدها سيتم البحث عن الدالة main() التي تعتبر نقطة البداية في البرنامج.
بعدها سيتم تنفيذ الأوامر الموضوعة في الدالة main() بالترتيب الموضوعين فيه. و بالتالي سيطلب البرنامج من المستخدم إدخال عددين.
بعدها سيقوم البرنامج بإنتظار المستخدم لإدخال العددين.
بعد إدخالهما سيقوم بجمع العددين و طباعة الناتج. و عندها ينتهي البرنامج و يتم مسحه من الذاكرة بشكل تلقائي.


لتتأكد أكثر, قمنا ببناء برنامج فيه خطأ متعمد. لاحظ أنه عند تشغيل البرنامج سيخبرك أنه توجد مشكلة في الـ thread الذي إسمه main.

مثال
Test.java
package mainthread_example;

public class Test {

    public static void main(String[] args) {

        // و وضعنا فيه نص بدل أن نضع فيه رقم int كـ x هنا يوجد خطأ في الكود و هو أننا قمنا بتعريف المتغير
        int x = "i am a string!";

    }
}
• سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types
  required: int
  found:    java.lang.String
• لاحظ أنه أخبرك أن المشكلة حدثت في الـ thread "main"

الكلاسات المصممة للتعامل مع الـ Thread
الجدول التالي يحتوي على كلاسات مصممة خصيصاً لإنشاء Thread و التحكم بطريقة عمله.
ملاحظة: جميع هذه الكلاسات مرتبطة مع بعضها و موضوعة بترتيب منظم, لذلك عليك قراءتهم واحداً تلو الآخر لتفهمهم جيداً.


الكلاس مع تعريفه
1
class Thread
يمكنك إنشاء الـ Thread من خلال وراثة الكلاس Thread.
تابع القراءة »
2
interface Runnable
المشكلة الوحيدة التي تواجهها عند إنشاء الـ Thread من خلال وراثة الكلاس Thread هي أن الكلاس يصبح غير قادر على أن يرث من كلاس آخر, لأن جافا لا تدعم تعدد الوراثة, و بالتالي لا يستطيع الكلاس أن يفعل extends لأكثر من كلاس.
لحل مشكلة تعدد الوراثة, يمكنك جعل الكلاس يفعل implements للإنترفيس Runnable و تنشئ كائن من الكلاس Thread بداخله.
تابع القراءة »
3
class ThreadGroup
يمكنك أيضاً استخدام الكلاس ThreadGroup لإنشاء أكثر من Thread و وضعهم في مجموعة واحدة, مما يجعلك قادراً على التعامل معهم جميعاً دفعة واحدة.
تابع القراءة »
4
class Executors + interface ExecutorService
ملاحظة: هناك العديد من الكلاسات و الإنترفيسات الأخرى التي تستخدم لإنشاء Threads و التعامل معهم بطرق مختلفة.
هنا وضعنا مثال طبقنا فيه مبدأ يسمى Thread Pool, حيث أننا إستخدمنا فيه الكلاس Executors و الإنترفيس ExecutorService لإنشاء خمسة Thread من نفس الـ Thread و تشغيلهم دفعة واحدة, بدل إنشاء كل Thread على حدة و تشغيله.


Java
التعامل مع قواعد البيانات في جافا


مقدمة
JDBC إختصار لـ Java DataBase Connectivity, و هي عبارة عن API خاص في جافا للتعامل مع قواعد البيانات على إختلاف أنواعها.

قبل وجود الـ JDBC, كان المبرمجون يستخدمون API آخر للتعامل مع قواعد البيانات يسمى ODBC, و هو مكتوب بلغة برمجة مختلفة تسمى C الأمر الذي قد يؤدي إلى بعض المشاكل الأمنية بالإضافة إلى إبطاء عمل البرنامج. لذلك قام مطوروا لغة جافا ببناء API خاص بها أطلق عليه تسمية JDBC.


مصطلحات تقنية
المصطلح معناه
API إختصار لـ Application Programming Interface, و هو عبارة عن ملف يشرح طريقة عمل برنامج محدد و يشرح أيضاً طريقة جعل البرامج الأخرى قادرة على التعامل معه.
JDBC API عبارة عن حزمة (Package) مصممة خصيصاً للتعامل مع قواعد البيانات.
JDBC Driver عبارة عن برنامج يعمل كوسيط بين التطبيق و قاعدة البيانات.
Statments هي جميع أنواع الإستعلامات ( Queries ) التي يتم إرسالها من البرنامج إلى قاعدة البيانات.
DataBase Stored Procedures عبارة عن مجموعة دول خاصة بقاعدة البيانات التي نتعامل معها.
كل قاعدة بيانات تملك مجموعة من الدول يمكن إستخدامها للتعامل مع قاعدة البيانات بسهولة أكثر, إضافةً إلى أوامر الـ SQL المشتركة بين جميع قواعد البيانات.
الأشياء الأساسية التي تحتاجها للتعامل مع قواعد البيانات

نظرة عامة على مفهوم قواعد البيانات و شرح المصطلحات الأساسية المتعلقة بها.

تابع القراءة »


نظرة عامة على أوامر SQL التي يمكنك إستخدامها للتعامل مع أي قاعدة بيانات مهما كان نوعها.

تابع القراءة »


البرامج التي تعمل كوسيط بين البرنامج و قاعدة البيانات ( JDBC Drivers ).

تابع القراءة »


لائحة تضم أشهر أسماء الـ Drivers التي يجب إستخدامهم للإتصال بقواعد البيانات على حسب أنواعهم, مع تحديد طريقة وضع الـ URL لكل واحد منهم, بالإضافة إلى تحميل مكتبات الـ jar الخاصة بهم و طريقة تضمينهم في المشروع.

تابع القراءة »


خطوات ربط البرنامج مع أي قاعدة بيانات.

تابع القراءة »

الإنترفيسات و الكلاسات المصممة خصيصاً للتعامل مع قواعد البيانات
الجدول التالي يحتوي على الإنترفيسات و الكلاسات التي يمكنك إستخدامها للتعامل مع قواعد البيانات سواء لبدء الإتصال, تنفيذ إستعلامات, تخزين نتائج الإستعلامات إلخ..

الكلاس / الإنترفيس مع تعريفه
1
class DriverManager
الكلاس DriverManager مصمم لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات مثل ( إسم الـ Driver الذي سنستخدمه, إسم قاعدة البيانات, إسم المستخدم و كلمة مروره ).
تابع القراءة »
2
interface Connection
الإنترفيس Connection مصمم لإنشاء إتصال بين البرنامج و قاعدة البيانات بالإعتماد على المعلومات التي تم تحديدها فيه في كائن الـ DriverManager.
تابع القراءة »
3
interface DatabaseMetaData
الإنترفيس DatabaseMetaData يوفر مجموعة ضخمة من الدوال التي يمكن إستخدامها لمعرفة معلومات متعلقة بقاعدة البيانات التي تتعامل معها. 
تابع القراءة »
4
interface Statement
الإنترفيس Statement مصمم لإرسال الإستعلامات الثابتة التي لا تتغير إلى قاعدة البيانات, أي يمكنك إستخدامه في حال كنت تريد تنفيذ نفس أوامر الـ SQL في كل مرة تقوم فيها بتشغيل البرنامج.
تابع القراءة »
5
interface PreparedStatement
الإنترفيس PreparedStatement يرث من الإنترفيس Statement, تم تصميمه لإرسال إستعلامات إلى قاعدة البيانات أثناء عمل البرنامج, كما أنه يمكن إستخدامه لتنفيذ نفس أوامر الـ SQL عدة مرات.
تابع القراءة »
6
interface ResultSet
الإنترفيس ResultSet مصمم لتخزين أي بيانات يتم جلبها من قاعدة البيانات مهما كان نوعها.
تابع القراءة »
7
interface ResultSetMetaData
الإنترفيس ResultSetMetaData يستخدم لمعرفة معلومات تتعلق بالجدول ( أو الجداول ) المخزنة في كائن الـ ResultSet, مثل:
أسماء الجداول المخزنة فيه.
عدد الأعمدة المخزنة فيه.
أسماء الأعمدة المخزنة فيه.
أنواع البيانات التي يمكن تخزينها في الأعمدة إلخ..

تابع القراءة »
أمثلة شاملة

المثال الأول
في المثال التالي شرحنا طريقة جلب بيانات من قاعدة البيانات.

شاهد المثال »


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

شاهد المثال »


المثال الثالث
في المثال التالي شرحنا طريقة تجهيز إستعلام لجلب معلومات موجودة في قاعدة البيانات و عرضها.
نص الإستعلام مبني على المعلومات أو الشروط التي سيدخلها المستخدم عند تشغيل البرنامج.

شاهد المثال »


المثال الرابع
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس Statement.
هذا الأسلوب يسمى ( Batch Processing ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.

شاهد المثال »


المثال الخامس
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس PreparedStatement.
هذا الأسلوب يسمى ( Batch Processing ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.

شاهد المثال »


المثال السادس
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس Statement.
هذا الأسلوب يسمى ( Transaction Management ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.

شاهد المثال »


المثال السابع
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس PreparedStatement.
هذا الأسلوب يسمى ( Transaction Management ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.

شاهد المثال »


المثال الثامن
في المثال التالي شرحنا طريقة تخزين ملف نصي في قاعدة البيانات.

شاهد المثال »


المثال التاسع
في المثال التالي شرحنا طريقة إسترجاع ملف نصي من قاعدة البيانات.

شاهد المثال »


المثال العاشر
في المثال التالي شرحنا طريقة تخزين ملف غير نصي في قاعدة البيانات, مثل الملفات الصوتية, الصور و الفيديوهات.

شاهد المثال »


المثال الحادي عشر
في المثال التالي شرحنا طريقة إسترجاع ملف غير نصي من قاعدة البيانات, مثل الملفات الصوتية, الصور و الفيديوهات.


Java
Lambda Expressions



مفهوم الـ Lambda Expressions
الـ Lambda Expressions هي إحدى أهم الميزات التي تم توفيرها إبتداءاً من الإصدار 8 في جافا.
بشكل عام, الـ Lambda Expressions هي مجرد أسلوب جديد يمكن استخدامه لتقليل حجم الكود عندما تفعل Override للدوال.


ملاحظة
عندما تستخدم برنامج الـ Netbeans أثناء كتابة كود جافا فإنه بشكل تلقائي يقترح عليك استخدام أسلوب الـ Lambda Expressions كلما كان ذلك ممكناً.

الشكل العام للـ Lambda Expressions
يمكن تعريف الـ Lambda Expressions بعدة طرق كما سترى الآن.


في حال كنت ستمرر للدالة قيمة واحدة و ستضع فيها أمراً واحداً, سيكون شكل الكود.

Argument -> Statement

في حال كنت ستمرر للدالة قيمة واحدة و ستضع فيها أكثر من أمر, سيكون شكل الكود.

Argument -> {
    Statements
}

في حال كنت ستمرر للدالة أكثر من قيمة و ستضع فيها أمراً واحداً, سيكون شكل الكود.

(Arguments List) -> Statement

في حال كنت ستمرر للدالة قيمة واحدة و ستضع فيها أكثر من أمر, سيكون شكل الكود.

Argument -> {
    Statements
}

في حال كنت ستمرر للدالة أكثر من قيمة و ستضع فيها أكثر من أمر, سيكون شكل الكود.

(Arguments List) -> {
    Statements
}
أمثلة شاملة

مجموعة الأمثلة الأولى
الأمثلة التالية تعلمك طريقة تعريف دالة نوعها void لا تملك أي باراميتر بأسلوب الـ Lambda Expressions.

شاهد الأمثلة »


مجموعة الأمثلة الثانية
الأمثلة التالية تعلمك طريقة تعريف دالة ليس نوعها void ( أي ترجع قيمة ) لا تملك أي باراميتر بأسلوب الـ Lambda Expressions.

شاهد الأمثلة »


مجموعة الأمثلة الثالثة
الأمثلة التالية تعلمك طريقة تعريف دالة نوعها void و تملك بارامتير واحد بأسلوب الـ Lambda Expressions.

شاهد الأمثلة »


مجموعة الأمثلة الرابعة
الأمثلة التالية تعلمك طريقة تعريف دالة ليس نوعها void ( أي ترجع قيمة ) و تملك بارامتير واحد بأسلوب الـ Lambda Expressions.

شاهد الأمثلة »


مجموعة الأمثلة الخامسة
الأمثلة التالية تعلمك طريقة تعريف دالة تأخذ أكثر من بارامتير بأسلوب الـ Lambda Expressions.

شاهد الأمثلة »


مجموعة الأمثلة السادسة
الأمثلة التالية تعلمك طريقة إستخدام الدالة forEach() بأسلوب الـ Lambda Expressions للوصول إلى عناصر أي كلاس من الكلاسات التي تطبق الإنترفيس Collection.

شاهد الأمثلة »


Java
خطوتك التالية بعد تعلم لغة جافا


مقدمة
إذا قمت باتباع جميع التعليمات التي وضعناها لك خطوة خطوة و وصلت إلى هنا, فهذا يعني أنك حقاً أصبحت مستعداً لبناء تطبيقات فيها واجهة مستخدم لأنك تعلمت جميع التقنيات الأساسية التي ستحتاجها و التي ستطبقها على الأغلب في كل تطبيق تقوم ببنائه.

لبناء تطبيقات فيها واجهة مستخدم بالإعتماد على لغة جافا عندك خيارين:

إستخدام المكتبة Swing.
إستخدام المكتبة JavaFX.
في البداية التطبيق الذي تستطيع بناءه باستخدام المكتبة Swing, تستطيع بناءه أيضاً باستخدام المكتبة JavaFX و العكس صحيح.
كما أن تعلّم كليهما أمر سهل جداً و ليس معقداً كتعلم لغة جافا.

من الأفضل Swing أم JavaFX ؟
المكتبة JavaFX هي أحدث مكتبة تم تطويرها لبناء تطبيقات فيها واجهة مستخدم و هي تعتبر أفضل من المكتبة Swing لأنها احتوي أشياء و تقنيات جاهزة يمكنك الإستفادة منها بدل بنائها من الصفر. كما أن الكود الذي تحتاج كتابته لبناء التطبيق باستخدام المكتبة JavaFX في العادة يكون أصغر في الحجم و أقل تعقيداً.

هل يجب تعلم بناء تطبيقات فيها واجهة مستخدم باستخدام المكتبة Swing ؟
الطلاب في الجامعات يطلب منهم في العادة بناء تطبيقات بواسطة المكتبة Swing بسبب قلة المصادر التي توفر شروحات JavaFX.
بالإضافة إلى ذلك, الجامعة تعتبر أنه من يتعلم Swing سيجد تعلم JavaFX أمر سهل جداً.

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

ماذا أفعل الآن؟
ننصحك بتعلم المكتبة Swing ثم تعلم المكتبة JavaFX حتى تكون جاهزاً لأي مهمة تطلب منك في المستقبل.

لبناء تطبيقات فيها واجهة مستخدم يمكنك تعلم ذلك بكل سهولة من خلال سلسلة دروس Swing التي شرحناها من الصفر وصولاً إلى بناء تطبيقات و ألعاب فيها.

تعلمها الآن »

هل ستشرحون JavaFX ؟
نعمل على إعداد سلسلة دروس شاملة لها و تبدأ من الصفر. ستكون متوفرة في الموقع خلال أشهر إن شاء الله.
لا يوجد وقت محدد لرفع دورة الـ JavaFX لأننا حقاً لا نعرف كم نحتاج من وقت لإنهائها.

لمعرفة كل جديد حول دروس الموقع يمكنك متابعة حساب الموقع في تيليقرام , فيسبوك أو تويتر



تعليقات