أهلا وسهلا بكم يا بنات في محاضرتنا الثانية من برمجة
ثلاثة اليوم كما تشاهدون على الـ slide سنبدأ
بالمراجعة سنغطي المراجعة اليوم ومحاضرة الأربعاء إن
شاء الله تبارك وتعالى ونبدأ في المادة بشكل فعلي
يوم السبت لما أتكلم عن المراجعة سنمر بشكل سريع
لماذا الجافا من لغات البرمجة القوية والمعتمدة في
معظم الأماكن طبعا اتفقنا simple كلغة سهلة وأسهل من
الـ C++ أو الـ C object oriented مثلها مثل الـ C
distributed تخدم النظم الموزعة وبتقدر تشتغل على
أكثر من الـ protocol وبتقدر تشتغل على distributed
system أو ما شابه robust قوية بمعنى آخر إنه دائما
بتشتغل على الـ optimization بتعمل garbage
collection من الـ memory بتعمل drop لأي unused data
أو أي object وبالتالي بتحافظ على إنه البرنامج
متشغل لأطول فترة ممكنة secure آمنة architectural
neural بمعنى آخر إنها ممكن platform independent أو
بنسميها portable interpreted
تخدم أو تتمد تستخدميها كـ compiler و كـ interpreter
حسب إيش الـ settings اللي أنت بدك إيها وهل بدنا
نذكر أو بدنا نراجع بشكل سريع الفرق ما بين الـ
compiler و الـ interpreter حد
بيقدر يفرق لي بينهم؟ تفضلي الـ interpreter بيعمل لك كل
سطر في الـ code لكن الـ compiler يروح في الـ code
كامل يجب أن يكون الـ code صحيح خلال الأخطاء 100%
الآن احنا بنقول إن الـ compiler و الـ interpreter هي
عبارة عن مترجمات تنسيق أنت بتكتبي بالـ Java بتروحي
بتقولي system dot out dot print أو print line
بتحطي له وبتفتحي له أقواس علامات تنصيص و semi colon لو
أنا سألتك الحروف هذه اللي أنت طبعتيها هي عبارة عن
human characters يعني الحروف مستخدمة للبشر فالآن
احنا كتبنا بالـ Java بالشكل هذا طب عشان يفهمها
الكمبيوتر بدنا يأتي الترجمة لـ 0 و 1 عشان يقدر
الكمبيوتر يفهمها فبتيجي الـ compiler و الـ
interpreter كمترجمات
للغة ماذا سيحصل؟ نفهم في البداية عملتي الترجمة Head
-Cap بالتم و سنعرج مرة أخرى على الـ compiler أو
الـ Interpreter لاحظ طول ما تكتبي الـ Code أو
الـ Compiler أو الـ IDE اللي تستخدميه، لا تريد إرر صح
أو خطأ بمجرد تضعي Space بعد الكلمة وهو الـ Main
-Delimiter في الفاصل ما بين الكلمات بيروح بدور هل
الكلمة هذه زي كلمة System اللي أنا كتبتها هنا
خلصتها وحطيت dot معناته أنا بقول إن كلمة system
هذه انتهت أو حطيت space الآن هيروح الـ system الـ ID
إيش بيروح يساوي؟ بيروح يدور هل كلمة system هذه
predefined هل تم تعريفها مسبقا سواء كانت في داخل
البرنامج مثل لما أنا باجي بقول له integer system أو
sys equal 1 مثلا هل تم تعريفها في البرنامج؟ ولا هل
هي من الكلمات المحجوزة المعرفة بالبرنامج المسبق أو
بالـ Java اللي عندي فبيروح بدور هل الكلمة defined؟
إذا هي defined بيروح بيبني عليها إيش لازم يكون
وراها؟ defined as what؟ hand system معرفة as class
dot إيش بدو يجي وراها؟ بدو يجي وراها method أو بدو
يجي وراها subclass؟ dot إيش بدو يساوي؟ إيش الـ
methods المتاحة؟ وهكذا وبالتالي هذه العملية احنا
بنسميها عملية الـ Parsing بعد ما بيروح بفحص الـ
syntax صح
100% ما فيش فيه أخطاء يعني مكتوب ضمن الـ rules اللي
وضعوها للناس المصممة الـ Java بيروح ببدأ دور التحويل
من readable language أو readable code لـ machine
code المسؤول عنه إما compiler أو interpreter الآن
احنا بنعرف أهم رول في الـ Java أو واحدة من الرول في
كتابتي الـ Java أن كل .. كل statement لازم تنتهي
في semi colon الآن الـ semi colon هذه بتقول أنا خلصت
الجملة الـ interpreter بيشتغل على البرنامج بتاعك
بالـ Java جملة جملة يعني وإن الـ semi colon بييجي
بيلاقي الـ semi colon بياخد كل اللي جابله وبيتعامل
معاه as one block بفحص الـ syntax بتاعه الـ syntax
صحيح بيروح بيحوله لغة الآلة وبيعمل execution له
بينما الـ compiler بدي يمر على كل statement كل الـ
code من الأول للأخير من سطر رقم zero أو سطر رقم
واحد لإنهاء آخر سطر ويتأكد إن الـ syntax بتاعه صحيح
مئة في المئة قبل ما يبدأ يحوله لمين؟ لغة الآلة
وبالتالي هذا الفرق الأساسي ما بين الاثنين
high performance طبعا احنا بما إنه إن الـ Java
بتشتغل على موضوع الـ optimization ممكن تشتغل على
موضوع الـ interpreter معناته ممكن تكون أسرع من غيرها
أو من لغات ثانية في الـ execution multithreading
الآن احنا كلنا بنعرف إنه البرنامج بتاعنا بأي لغة
بنكتبه لحد اللحظة كان هو عبارة عن sequential flow
من أول سطر في الـ code لنهاية سطر وآخر سطر بيظل
يشتغل statement by statement مضبوط ولا لأ؟ الآن بالـ
multithreading أنا بقدر أعمل concurrent execution
لبعض الـ task داخل البرنامج بتاعي وهذه واحدة من
الشغلات اللي هنغطيها إن شاء الله خلال المساق اللي
عندي الـ dynamic أو الـ dynamicity الخاصة بالـ Java
الآن حجم الـ libraries اللي تطورت بالـ Java كبير جدا
ولو دورتي في مجالات مختلفة يعني اهتمامك في الـ AI
هتلاقي مكتبات جاهزة بالـ Java بسمع عليك اللي جاهزة
تستدعيها أو تشتغلي عليها وإذا قلت لك كمان معظمها
هتلاقيها open source بمعنى آخر بتقدر تشوفي الـ code
الأصلي بتاع الـ library هذه وإذا عندك أي تعديل عليه
بتقدر تشتغلي عليه وهذا طبعا بخدمنا أو بيساعد على
انتشار لغة الـ Java بشكل كبير ما بين الناس من الـ
APIs اللي موجودة عندها هذه مجموعة من الـ libraries
أنا هتكلم على الـ swing اللي هستخدمها في تصميم الـ
graphical user interface اللي في خلال الـ course
عندها الـ Java database connectivity الـ JDBC
library موجودة من أجل ربط برنامج الـ Java بتاعك بأي
قاعدة بيانات ممكنة Oracle MySQL SQL Server Access
أي قاعدة بيانات بس طبعا في ملف لازم عند الـ
provider بتاع الـ database نجيب إن عنده ملف معين الـ
RMI والـ Corpo بدعموا الـ distributed system الـ media
الآن في الـ Weka والـ Gate بدعموني في الـ data mining
الـ Weka على الـ data mining بشكل عام والـ Gate على الـ
text mining الـ Apache Spark على الـ distributed
system أو الـ Hadoop التكنولوجيات الموجودة حاليا
وبالتالي الـ Java فعليا بتقدر تخدمي في مجالات عدة
مع platform independent معناته أنا بقدر أشتغل
برنامجي على أي platform ولأي domain أنا ممكن
أستخدمه طيب بعد الكلام النظري اللي بمجده بالـ Java
نروح باتجاه بعض الـ code اللي بيهمننا هنبدأ في موضوع
الـ comments كم نوع من الـ comments موجود عندي أنا
ثلاثة اللي هم
طيب الآن أنتِ على مستواك كـ programmer في عندك اثنين
فقط على مستواك كـ programmer في عندك اثنين اللي هو
اللي فيه الـ inline أو الـ line comment اللي أنا
بستخدم فيه الـ double quotation أو الـ double colon
الـ double forward slash وهذه من كتابتها لنهاية
السطر بيصير كله إيش؟ comments مفهوم الـ comments إن
أنا بقول الـ compiler أو الـ interpreter هذا الـ code
مش لك هذا الـ code إلي كـ programmer فأنتِ مش لازم
تطالعي عليه أو ما تحاوليش ترجمي ولا لغة الآلة لأنه
حد يسبب syntax error النوع الثاني لما أنا بستخدم الـ
block اللي هو الـ forward slash نجمة forward slash
نجمة الثانية يعني على سبيل المثال لما احنا بنروح
هنا
لما احنا بنروح هنا على الـ eclipse بمجرد أن أنا
عملتي class تمام جهزته على جهازي وهي عملت remote
desktop عشان لو بدنا نجرب شغلة مباشر راح قال لي
استخدمي الـ inline comments لاحظي إذا أنا كتبت أي
code هنا هيحسب لي عليه بينما بعد الـ double forward
slash لأ وبالتالي عندك الـ comments أنتِ بتتحركي فيه
زي ما بدك بعد
الـ comments خلّينا نراجع مع بعض الـ primitive data
types أنا في عندي خطأ .. خطأ أثناء
الكتابة إن hand, byte small letter ctrl z short
small letter و
الـ int و
الـ long هيك تمام الـ
data اللي عندي الـ primitive data type عندي eight
primitive data type ثمانية وحسب ما احنا بنتعامل في
حياتنا بنتعامل مع أعداد صحيحة، أعداد حقيقية اللي
فيها الفاصلة العشرية، وبنتعامل مع الـ text، وبنتعامل مع
الـ boolean value أو الـ logical value، الآن الـ
integer بتتقسم لأربعة أنواع: byte، short، int، و long
احنا للأسف غالبا لو بدي iterator على loop، ايش بروح
بسويه؟ بقول له integerI equal 1 بدون ما أنا أقرأ له
جدًّا حجم الـ iterator اللي أنا بدي اه، و ليش أنا بدي
أستخدمه و كم مرة اللي هو بدها تشتغل، تعالى نشوف وين
هذا الكلام، طبعا هذا الكلام بيفرق معاه في الـ
optimization جدًّا البرنامج تبعي light أو جدًّا
بيستهلك resources من الجهاز RAM و CPU، تعالى نشوف
الـ byte حجمها one byte، واحنا بنعرف إن الواحد byte
بتساوي 8 bits، يعني لما أنا بقول اثنين أس تمانية
جدًّا 256، صح؟
256 هيهم من سالب 128 لـ 127، يعني أنا فعليًا لو عرفت
byte، أنا بتكلم على 256 iteration للـ loop، أنتَ
بتعمليها 4 كده، تمام؟ الآن الـ integer أربعة byte
يعني اثنين أس أربعة ضرب ثمانية، اثنين أس اثنين و
ثلاثين، فبتدين حوالي خمسة مليار رقم، هاي الـ range
اللي موجود عندي، وهكذا، وبالتالي المفروض إذا أنا بدأ
أتكلم على optimization للبرنامج تبعي، أبدأ أقرأ له ما
تقول ليش يا أستاذ شو يعني variable أخد 4 byte من
الذاكرة وهي 8 جيجا، ما قلت لي له أخد 4 كيلو ولا أخد
4 جيجا اللي ممكن الـ RAM عندي أو 8 جيجا، قلت لي 4 byte
ولا حاجة، هي الفكرة الصحيحة، لو أنا بدأ أنظر لها من
المنظور اللي بتتكلم عليه فقط، الكلام صحيح 100%، لكن
أربعة bytes هنا، وأربعة bytes في مكان تاني، وسبعة
bytes هناك، وسبعة هناك، فبتبدأ الأعداد الـ bytes
الضائعة أو غير مستغلة اللي بتحجزها بتتضخم، وبالتالي
بيصير في عندك مشكلة في برنامجك، فاحنا المفروض نراعي
ايش الـ data type اللي احنا بنستخدمها، بالإضافة للـ
data types، في عندي مجموعة من الـ operators، الـ
arithmetic operators جمع، و طرح، و ضرب، و قسمة، و
modulus، و increment، و decrement، نعرفهم كلهم صح؟
relational operator، ليش أنا بستخدمهم؟ عشان أعمل
مقارنات، للمقارنات equal، يعني بيجوز اثنين is equal، not
is not equal، greater than، less than، إلى آخره، الـ
bitwise operator، المفروض أقدم تهالي عنها مش
مشكلة، الآن أنا في عندي الـ and، وفي عندي الـ bitwise
and، في الـ logical operator، كـ logical operator، أنا
في عندي الـ and، وفي
عندي الـ or، خليني أتكلم على هدول التانية فقط عشان
نوضح مفهوم الـ bitwise، الآن ديش بتقول لي لازم يكون
الـ true operand true، عشان يتحقق output أو الـ
condition العام true، بينما الـ or بتقول لي واحد منهم
على الأقل يكفي يكون true عشان يكون الـ output true
مع الـ and والـ or، ما بيعمل؟ بيعمل كالتالي، لو أتي بالـ
and، ولجأ الـ first operand true، بروح وأفحص الـ
second operand الثاني، لكن لو لجأها false، خلاص بحسم
الأمر بقول false، تمام؟ بالـ true والـ and، بالـ or، لو
لجأ الـ operand true، بقول true، لو لجأ الـ operand
الأول true، فبقول true الـ output، لو لجأها false، بدي
يروح يفحص أو يقارن مع الثاني عشان ياخد decision في
الـ Bitwise ما بيهمهوش ايش قيمة الـ operand الأول
الـ Bitwise هيحول إياه لمجموعة من الـ bits ويقارن
كل bit مع الـ bit المقابل له، لحدّ
ما يلاقي صارت false، بياخد decision على الموضوع
بمعنى آخر، لازم المقارنة تتم بين الـ two operands
اللي موجودين عندها، هذا الفرق الأساسي ما بين الـ
logical operator الـ and والـ or والـ bitwise اللي
هي and و or والشغلات التانية اللي ممكن نشوفها في
عند الـ assignment operator، من الـ assignment
operator احنا غالبا بنستخدمها أو بنستخدم واحد منهم
لما باجي بقول له أنا عندي integer x بتساوي سبعة، واروح
أقول له x plus equal 7، جدًّا قيمة الـ x الآن؟ قيمة
الـ X 14، لماذا؟ لأن هذه الـ Translation تبعيتها
كانت عبارة عن X بتساوي X زائد سبعة، X تساوي X زائد
سبعة، وطبعا نفس الـ Operand هذا ممكن أنا أطبقه مع
كل العناصر الموجودة، بما إن في عندي Multiple
Operands، تمام؟ هتدخل عندي موضوع الـ precedence
الأولوية تبعي الـ operators اللي عندي، عفوا، طلبة في
عندي أكثر من Operator، بتدخل عندي الأولويات، ودائما
كان يعلمونا إياها من ابتدائي بشكل بسيط، الأولوية
للأقواس، بعدين ضرب وقسمة، بعدين جمع وطرح، مظهورة
لأ؟ الآن ايش اللي اختلف عنها؟ اللي ممكن لو اجتمعت
الضرب والقسمة لحالهم، المسألة كلها X ضرب Y تقسيم Z
ضرب Y أو ضرب 2، مش حل هذا؟ عادي اشتغل من اليسار
لليمين، ما فيش مشكلة، ليش؟ لأن الآن المعادلات هذه أو
الـ operators هدول من نفس المستوى، طبعًا إذا حبيت
ترجعي، ارجعي للـ slide مرة ثانية عشان تستنقل، طبعًا
بالـ Java أو بالبرمجة ظهرت إن احنا كنا بنقول أقواس
ضرب وقسمة ومودولس، جمعنا وطرح، وصار في عندي اللي
يساوي، اللي يساوي هذه اللي هي الـ assignment، خلتني
صار في عندي increment plus plus، minus minus،
prefix، و
increment أو decrement postfix، احنا
بنعرف لما أنا باجي بقول x بتساوي سبعة، x++، أنا
قلت له اطبع له print x++، ايش هيطبع هنا؟ هيطبع سبعة،
بينما لو أنا هنا قلت له print ++x،
الأولوية لمين؟ للمجاميع، هنا هيطبع هنا تمامًا،
ممتاز، معناته احنا لحد الآن أمورنا ماشية تمام
الـ arrays
المصفوفات، المصفوفات عشان أتعامل مع عناصر أو أعرف
أكثر أو أخزن، أتعامل مع أكثر من قيمة في one
variable أو one object، one variable، الآن بالتالي
الـ array هي عبارة عن data structure تركيب من البيانات
بحيث أنه أخزن مجموعة من القيم من نفس النوع، من نفس
النوع integer، double، character، boolean، حتى من
الـ object oriented زي ما هنشوف لاحقا، طريقة تقليدية
جدا لتعريف المصفوفة بقول integer اسم الـ array، وحط
الأقواس المربعة، new integer، وطبعا في عندي التعريف
التاني هذا برضه إن أحط الأقواس مع الـ data type
والتانين، صح؟ بالمناسبة، هذه بالتعريف بالشكل هذا
والترتيب بالشكل هذا ما فيش فرق بينهم مطلقًا، لكن في
كل الأحوال، أنا لازم أحدد حجم الـ array تبعتي، الـ
array مشكلتها إنه لازم أحدد لها حجم، وحجم ثابت،
تمام؟ لكن لاحظوا في التعريف الثاني هذا اللي هنا،
ما عرفتش الـ size ولا عرفتها، أيوة، تم تحديد الحجم بناء
على القيم المدخلة، تم تحديد الحجم على القيم المدخلة،
و أدرى بالك، وزي ما أنت بتعرفي مشكلة الـ array
دائما بالـ size إنها limited size، الحجز اللي أنا
بطلبه محدود، أما بيظل في عندي فائض بقدرش أتخلص منه
أو بيصير في عندي shortage أو في عندي قصور، وبقدرش
أضيف عليها عناصر، عشان هي أتّجت بعدها الـ list حلت لي
أو حلت المشكلة تبعت الـ array، وصار لي اعتماد على الـ
list، أكبر من الـ array في الـ two dimension، طيب أخر
شغلة بدي أياها هنا في موضوع الـ single array المصفوفة
هذه اللي أنا بعرفها بالشكل هذا بتمثل صف ولا عمود؟
صف
ولا عمود؟ صف، سمّيتها صف، سمّيتها عمود، مش فارقة كثير
معانا، احنا بنسميها linear أو one dimension array
سواء كانت بشكل أفقي أو بشكل عمودي، وإن كان الصف هو
السمة الغالبة أو هي السمة الأدق، لأنه لما بعرف
المصفوفة بالشكل هذا، two dimensional array، ايش عامل
هذا؟ الصف، القوس الأول للصفوف، والثاني للـ columns
وبالتالي لما أنا بعرف هيك، هو كأنني بعرف row وهي
فعليًا احنا غالبًا بيقول لك row vector، سمينا إياها row
vector، طيب لما أنا بحتاج أتعامل مع مصفوفة من الـ
two dimensional array، غالبا أنا بحتاج لـ two loops
عشان أقدر أمر على كل العناصر اللي موجودة، تقريبًا
الـ primitive data type خلصنا منها، لكن الـ string
على الرغم إن أنا بستخدمها باستمرار، string مش
strings، يلا بسيطة برضه هيبقى تعديل الـ string اللي
موجود عندي هنا، هو فعليًا على reference data type،
لأن احنا شفنا في الجدول الـ primitive، الـ text كان
بتمثلها character، character، وبالتالي هذه عبارة عن
primitive أو عفوا، إن هذه الـ string عبارة عن
reference data type، بقدر أخزن فيها array of
Character، Implied Array of Character حسب الحجم
وبيبقى إن هي reference معناته أن في عندي مجموعة من
الـ functions الـ length و الـ character at و الـ
substring و الـ concatenation و الـ split و الـ equal
و الـ index of و الـ start و الـ end with هنشوفهم
بعدين لما نتكلم مع الـ string تمام بعد هيك في
برنامجنا بعد معرفنا الـ data types و الـ variables
ظهرت عند مين؟ الـ control flow احنا بنتكلم عن الـ
sequential flow لكن ممكن اتحكم فيه أنافذ هذا أو
انافذ هذا لكن ما نقدرش إن أنافذ الاتنين مع بعض الـ F
statement أبسط صورة للـ F statement الـ condition
و block أو statement و سيمي كولون، مظهورة أو لا؟
إذا بدي أوسع، هبحث في الـ true و الـ false معناته
هيفي عند two statements بعد الـ if's وفي عند الـ else's
if كذلك لما تكتر الـ else's if وخصوصا
مع الـ equal case بستخدم مين؟ بستخدم الـ switch الـ
switch فيها مشكلة في غياب أو مع الـ break تعالوا
اكتب الكود هذا البسيط لو
أنا جيت وقلت لك في عند integer X ده تساوي عشرة وجيتها
نقلت switch X
فتحت الأقواس تبعتها وقلت له case 1 system
.out.print 1 وهي break case
2
system.out.print 2 وهي كمان break default
high
colon system.out.print other value محتاج break بعد
الـ default؟ مش محتاج طيب ضمن الـ code اللي مكتوب
عندي هنا إيش الـ output؟ other في حاجة بيقول غير
هيك؟ لأ طيب لو أنا جيت وقلت والله الـ break هذي
بدي أعمل لهم comments أعلقهم إيش
الـ output؟ other كام واحدة بتقول other؟ اتنين،
تلاتة، أربعة تلاتة أربعة معاهم خمسة خمسة بيقولوا
other والباقي وين رأيكوا في الموضوع إيش هيطبع مين
بيقول هيطبع كلهم يطبع واحد واتنين و other مستحيل
طيب هو اللي هيطبع هيطبع other شوفي يا أستاذ شوفي
وانتبهي معايا بصي صبري قبل ما تتكلمي هيمر عليهم
كلهم الفكرة وين؟ الآن هياخد قيمة X ويقارنها مع الـ
case الأولى True؟ False، هيروح على الـ Case التاني
مباشرة True؟ لأ، بالتالي هيروح يطبع Other، الـ
Default الآن مفتاح الـ execution للجزء اللي على
اليمين هذا كله يأتى للـ True اللي بتحققها في الـ
Case تخيلي، لو أنا مكان الواحد، أنا قلت له عشرة
بدون الـ break، هيطبعهم كلهم هيطبع واحد، هيطبع
اتنين، و هيطبع Other لو أنا هذه حطيت العشرة هنا حيجي
كالتالي قارن X مع واحد false X مع عشرة true
فدخل إن عدى الحدود بالـ colon هذه و هيطبع اتنين و
هيطبع مين فبتيجي الـ break بتقول له بيوقف عندك
ما تكملش في الـ execution وبالتالي مفتاح التنفيذ
تبعتنا الـ equal اللي بتتحقق مع الـ case اللي عندها
واضحة؟ نجربها عملي ولا مافيش داعي؟ كام واحدة
مصدقاني؟ ماشي الحل طيب الـ for و الـ while و الـ do
while for لازم يتحقق condition وغالبا أنا بتكلم
على iterator مظبوط ولا لأ؟ طيب لو أنا سألتك for و
عملته بالشكل هذا مش هي الـ structure تبعتها وماحطتش
ولا إشي إيش بيصير؟ Error لأن المفروض الـ for
بتحتاج إلى variable counter بتحتاج إلى counter
وبتحتاج إلى condition على الأقل condition على
الأقل وبالتالي الـ increment ممكن أن أعملها في داخل
الـ block طبعا؟ ايه الآن الـ while هتفحص الشرط طب
إيه كيف الـ execution تبعت الـ for هيكون؟ لو أنا جيت
وقلت له integer I equal واحد I أقل من عشرة I plus
plus وهي في عندي block هنا كيف هيشتغل؟ هيجي عند
أول مرة يعمل assignment creation للـ counter ويدي
assignment بواحد هيروح يفحص الـ condition true
هيروح ينفذ هنا بعد ما يصل لنهاية الـ block هيروح على
الـ increment بعد الـ increment هيرجع على الـ
condition مرة تانية وتستمر العملية هنا يعني الـ
condition هنا هيك بيروح على الـ execution وبالتالي
هذه الدورة تبعت الـ for الـ while بفحص الـ condition
إذا true بنفذ الـ block otherwise بعمله skip ومنتقل
للي بعده الـ do while ببدأ ينفذ حد ما يصل الـ while
و الـ while مفهومها هل أرجع نفذ الـ block اللي مني
وفوق ولا لأ؟ مظبوط ولا لأ؟ لو كانت true بيرجع لحد
من عند الـ do و بعمل execution otherwise بكمل و هيك
بيصير على الأقل الـ block المرتبط بالـ while اتنفذ
لمرة واحدة
in a
الآن لما أنا بحتاج أعرف constant لما بحتاج أعرف
constant طبعا لما أنا بتكلم الآن هو عبارة عن
special data type special data type أو special
classes إن شئتِ بس خليني احنا نسميها special data
type عشان أعرف في داخله مجموعة من الـ constant
predefined constant بالمثال public enum directions
Parenthesis North, South, East and West انتبهي معايا
هنا إن الـ text اللي أنا كتبته مش text مش string
لأن لو string كان استخدمت معه double quotations
وفي نفس الوقت ما كتبتش أرقام كتبت على نص بالشكل
هذا الآن في داخل برنامجي بقدر أخد data أو أعرف
object من الـ Enum اللي أنا عرفته يعني صرت بتعرف
إنها عبارة عن special data type فهنا بستخدمها
واخدت منها variable الـ values المتاحة فيها إيش هي
واحدة من العناصر الأربعة اللي موجودة عندها في الـ
Enum اللي أنا عرفتها بدي أعرف خمسة بدي أعرف خمسين
أنتِ حرة حسب حاجتك تعالوا نشوف المثال التالي أفضل من
المثال الأول في التعريف وأوسع وأشمل لأن لما بتكلم
على الموظفين فينا شغلة بنسميها الدرجة، درجة الموظف
الدرجة بتحدد الـ Basic Salary هيك، بيجيب ويقول لك
الموظف على الدرجة الأولى أو درجة الثانية أو كده،
رتبه كده الدرجة X، رتبها كده، الدرجة Y، رتبها كده
فأنا بدي أوسع تعريف الـ Enum تبعتي بحيث إنه أنا
أقدر أستخدم .. أستفيد من الدرجة وأستفيد من الـ
Associated Salary أو الـ Value تبعتها شوية هيفرج
التعريف معايا، بداية الـ Enum بنفس الكيفية الـ string
تبع كيبت الـ letter زي ما أنت شايفه وعملت له
association ربطه بـ integer أو real number من خلال
الأرقام اللي موجودة عندها بس لحد لحد ثاني ما
انتهش التعريف لازم أكمل لازم أكمل وأقول له إيش
القيمة اللي أنا بدي إياها إيش نوعها integer هذه
دلالة على إنه الخمسمية والألف والعناصر هذه هي
عبارة عن نوعها integer وأنا سميتها value
Constructor تبع الـ Enum طبعا الآن بقول يا أستاذ طب
احنا لسه في الـ Basic دخلت على الـ Object Oriented
مش قضية كتير الآن الـ Grade integer وقلت له عشان أعمل
assignment أو initialization للـ value اللي موجودة
عندها ولما أنا بدي أرجع بالـ salary بالقيمة عرفت
method اسمها salary بتعمل return بالـ value اللي
موجودة عندها وبهيك صار في عندي أنا في الـ Enum تبعي
في عندي شغلتين في عندي الـ grade وفي عندي الـ
associated value تبعتها في داخل البرنامج كيف أستفيد
منها؟ بعرفي grade زي ما في المثال السابق
الـ direction grade يتساوي grade dot a هذه الدرجة
إذا أنا محتاج للـ salary اللي هي نوعها integer
salary لـ grade dot a dot الـ salary وبالتالي أنا
برجع بالقيمة اللي موجودة عندها هذا الكلام مهم جدا
عشان يكون برنامج generic بكون برنامج بشكل عام
وما بديش حد يبدأ يشتغل بالقيم اللي موجودة عندنا آخر
شغلة في محاضرتنا اليوم شغلة بسيطة اللي لها علاقة
بالـ wrapper classes لأن إيش الـ wrapper class؟ هي
عبارة عن object أو class من الـ primitive data وين
برزت الحاجة إليها؟ تعالي شوف لو كنت .. لو قلت لك
أنا في عندي form أو في عندي صفحة HTML وفيها text
field و الـ text field هذا أنا روحت كتبت في داخله
واحد اتنين تلاتة وأنا بديهم as number لكن بما أن
هذا عبارة عن text text box مربع نص فاللي انكتب في
داخله عبارة عن إيه؟ عبارة عن string عبارة عن
string طب أنا كيف بدأ أتعامل مع الـ string هذا؟ أنا
بعرف إن هذا integer واحد اتنين تلاتة هذول الـ
digits بتمثل رقمية تلاتة وعشرين، مظبوط؟ فكيف ممكن
أنا أرجع لأصله؟ برزد حاجة عندي أن يكون في عندي
مجموعة من الـ methods أقدر أستفيد منها فبروح أنا
بقول له integer X بدها تساوي integer.
.barsint و بديله الـ text field هذا على فرض اسمه T
.value الـ T اسمه T فابقى و هقوله T.value القيمة
اللي موجودة في الـ T هنا فبرجعلي بالمية و تلاتة و
عشرين as integer فلما أنا بتكلم على الـ rubber
class هي عبارة عن طريقة و قالية لتحويل الـ
Primitive Data لـ Object والعكس صحيح والـ Object
منها لـ Primitive Data وطبعاً لما بتكلم عن عملية
تحويل هنا بتتكلم عن عمليتين مهمات جدا Auto Boxing
و Auto Unboxing Auto Unboxing شو يعني؟ الألوان
أتيت تعرفت
قلت أنا في عندي integer X equal 7 وفي عندي integer
Y equal 10 هذه primitive data primitive data type
variable بشير ل primitive data وخزنت في داخله
primitive الـ Y هي عبارة عن object من الـ class
integer وخزنت في داخله primitive data فعملية إضافة
الـ primitive data في داخل الـ class المناظر لها
اللي هو الـ rubber class تبعتها بنسميها auto boxing
يعني أنا أخدت القيمة الـ primitive و حطيتها في الـ
object و
حطيتها في الـ object العملية هذه بتصير بشكل تلقائي
في المقابل لو انا قلت له ان الـ X بدها تساوي Y
بعيدا
عن الـ rubber class هذا الكلام مستحيل يصير بعيدا
عن الـ rubber class هذا الكلام مستحيل يصير اخد
object او احطه او اسويه او اخصص قيمته في primitive
data بينما مع الـ rubber class هذا الكلام إيش؟ صحيح
و هذه العملية بنسميها auto unboxing يعني فعليا
بيقدر بياخد القيمة و بصدرها لمين؟ لل primitive
data اللي موجودة عندها أذكر في مقابلة المقابلات
كان في أسئلة مكتوبة أو كانوا يتكلموا شو الفرق؟ أو
شو تعريفك لل auto boxing؟Autoboxing دي الـ blank
اللي في المقابلات أحيانا بتكون الأسئلة في كلمات زي
هاي عشان يقول و الله .. ديش أقول عشان يفرقوا ما
بينهم بقدر ما انهم بيحاولوا يصلوا مين بنتبه لكل
شغلة في الـ code والمثال اللي جربناه قبل شوية مع الـ
switch case مش كل الناس بتعرفه خلاص احنا بنعرف إذا
مافيش شي break بنفذ كل حاجةلأ مش صحيح بنفذ كل حاجة
بعد ما بيعمل match بعد ما بيعمل match طبعا لو أنا
بدأ أطلع في الـ primitive data اللي عندي الـ
primitive type و الـ rubber class اللي لها بوليان
بوليان character أو car character byte byte لاحظي
التسميات تقريبا هي نفسها لكنها بدأت ب capital
letter عشان تحقق المبدأ اللي موجود عندها هكذا
تقريباً خلصنا برمجة واحد وليش رأيكوا؟ ياريت الدنيا
مشة بالسهولة هاي طيب، في أي سؤال يا بنات؟ المحاضرة
اللي جاي ان شاء الله هنركز على مراجعة الـ object
-oriented عشان فعليا زي ما قلنا نبدأ يوم السبت
بأول لقائلنا بإذن الله تبارك وتعالى نعم حان؟ طيب،
خليكي معايا الآن احنا اتفقنا أنه أنا في عندى class
اسمه Integer مصبوط هذا الـ class ايش بيخزن في داخله
بيخزن integer values سمناها rubber class يعني هيك
لما أنا بتكلم عن object في عندي data زائد في عندي
مجموعة من الـ method و لا لا تمام و في عندي
primitive primitive
data integer الآن العلاقة بينهم ان لو انا اخدت
primitive data وحطيتها في داخلالـ object من الـ
rubber class بشكل تلقائي انت عشان نمشي خطوة لقدام
لما درست object oriented في الـ private values
مابلازم تتعاملي معاها من خلال الـ set و الـ get
method مصبوط ولا او بدك تعامل فيه public و تقول
اللي الـ class dot الـ object او الـ dot الـ variable
هذا equal كده صح ولا لا هذا الكلام مش موجود هنا
فانا اجي اتعرفت اللي كان x او y عفوا y as object
وأتيت خزنت في داخلها مباشرة قيمة العشرة هذه سمناها
ايش auto boxing يعني أنا ماكنتش بحاجة لأي وسيط للا
method ولا لأي sequence of list أو من العناصر هذه
عشان أقدر أخصص القيمة والعكس صحيح لما أنا باجي
بقوله X بتساوي Y الآن في قانون الـ object oriented
مستحيل هذا الكلام يصير primitive data بيستوي object
لأن الـ object نحنا بنعرف موضوع الـ encapsulation
جمع الـ data و جمع الـ methods مع بعضهم طب أنا كيف
بدأ أخد الـ data لحالها لازم يكون في طريقة كانت من
خلال الـ get methods بينما مع الـ rubbery class هذا
الكلام مش موجود بمجرد أقوله X as primitive data
equal Y as object كان مباشرة بياخدوا الـ value اللي
في الـ Y و بيخصصها لمين؟ لموضوع .. لاالـ X وهذه
نسميها Auto Unboxing واضحة إن شاء الله؟ في أي سؤال
تاني يا بنات؟ تفضلي كيف
يعني نوعها غير؟ اه ازمنتك بتقول character X بدها
تساوي Y هذه مثلا بدها تساوي Y هل الكلام هذا صحيح؟
هل الـ Y هذي as integer مناظرة لل character؟ أكيد
في أي سؤال تاني يا بنات؟ الله يعطيكوا العافية
وكمان مرة بذكر لقاءنا المرة اللي جاية هيكون
باستمرار هان يعني هنبدأ المحاضرة تسعة وخمسة ان شاء
الله و بننتهي في الوقت